From 53dae357106e0713e8ca1aa93c78a08117375733 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 04:13:38 +0000 Subject: [PATCH 001/494] refactor: Move to `k_work_delayable` API. * Move to new `k_work_delayable` APIs introduced in Zephyr 2.6. See: https://docs.zephyrproject.org/latest/releases/release-notes-2.6.html#api-changes --- app/drivers/kscan/kscan_gpio_demux.c | 12 +++++------- app/drivers/kscan/kscan_gpio_direct.c | 7 +++---- app/drivers/kscan/kscan_gpio_matrix.c | 20 +++++++------------- app/drivers/kscan/kscan_mock.c | 10 +++++----- app/src/behavior_queue.c | 6 +++--- app/src/behaviors/behavior_tap_dance.c | 18 +++++++++--------- app/src/ble.c | 16 +++++----------- app/src/combo.c | 10 +++++----- app/src/endpoints.c | 7 +++---- app/src/ext_power_generic.c | 9 ++++----- app/src/rgb_underglow.c | 7 +++---- 11 files changed, 52 insertions(+), 70 deletions(-) diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 3f22797e..0cfd3834 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -47,7 +47,7 @@ struct kscan_gpio_item_config { #define GPIO_INST_INIT(n) \ struct kscan_gpio_irq_callback_##n { \ - struct CHECK_DEBOUNCE_CFG(n, (k_work), (k_delayed_work)) * work; \ + struct CHECK_DEBOUNCE_CFG(n, (k_work), (k_work_delayable)) * work; \ struct gpio_callback callback; \ const struct device *dev; \ }; \ @@ -60,7 +60,7 @@ struct kscan_gpio_item_config { struct kscan_gpio_data_##n { \ kscan_callback_t callback; \ struct k_timer poll_timer; \ - struct CHECK_DEBOUNCE_CFG(n, (k_work), (k_delayed_work)) work; \ + struct CHECK_DEBOUNCE_CFG(n, (k_work), (k_work_delayable)) work; \ bool matrix_state[INST_MATRIX_INPUTS(n)][INST_MATRIX_OUTPUTS(n)]; \ const struct device *rows[INST_MATRIX_INPUTS(n)]; \ const struct device *cols[INST_MATRIX_OUTPUTS(n)]; \ @@ -137,10 +137,8 @@ struct kscan_gpio_item_config { } \ } \ if (submit_follow_up_read) { \ - CHECK_DEBOUNCE_CFG(n, ({ k_work_submit(&data->work); }), ({ \ - k_delayed_work_cancel(&data->work); \ - k_delayed_work_submit(&data->work, K_MSEC(5)); \ - })) \ + CHECK_DEBOUNCE_CFG(n, ({ k_work_submit(&data->work); }), \ + ({ k_work_reschedule(&data->work, K_MSEC(5)); })) \ } \ return 0; \ } \ @@ -232,7 +230,7 @@ struct kscan_gpio_item_config { \ k_timer_init(&data->poll_timer, kscan_gpio_timer_handler, NULL); \ \ - (CHECK_DEBOUNCE_CFG(n, (k_work_init), (k_delayed_work_init)))( \ + (CHECK_DEBOUNCE_CFG(n, (k_work_init), (k_work_init_delayable)))( \ &data->work, kscan_gpio_work_handler_##n); \ return 0; \ } \ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index d810881b..c7be4e1f 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -22,7 +22,7 @@ struct kscan_gpio_item_config { }; union work_reference { - struct k_delayed_work delayed; + struct k_work_delayable delayed; struct k_work direct; }; @@ -55,8 +55,7 @@ static const struct kscan_gpio_item_config *kscan_gpio_input_configs(const struc static void kscan_gpio_direct_queue_read(union work_reference *work, uint8_t debounce_period) { if (debounce_period > 0) { - k_delayed_work_cancel(&work->delayed); - k_delayed_work_submit(&work->delayed, K_MSEC(debounce_period)); + k_work_reschedule(&work->delayed, K_MSEC(debounce_period)); } else { k_work_submit(&work->direct); } @@ -228,7 +227,7 @@ static const struct kscan_driver_api gpio_driver_api = { COND_CODE_1(IS_ENABLED(CONFIG_ZMK_KSCAN_DIRECT_POLLING), \ (k_timer_init(&data->poll_timer, kscan_gpio_timer_handler, NULL);), ()) \ if (cfg->debounce_period > 0) { \ - k_delayed_work_init(&data->work.delayed, kscan_gpio_work_handler); \ + k_work_init_delayable(&data->work.delayed, kscan_gpio_work_handler); \ } else { \ k_work_init(&data->work.direct, kscan_gpio_work_handler); \ } \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index e5a7e562..1e841239 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -88,7 +88,7 @@ struct kscan_matrix_irq_callback { struct kscan_matrix_data { const struct device *dev; kscan_callback_t callback; - struct k_delayed_work work; + struct k_work_delayable work; #if USE_INTERRUPTS /** Array of length config->inputs.len */ struct kscan_matrix_irq_callback *irqs; @@ -214,9 +214,7 @@ static void kscan_matrix_irq_callback_handler(const struct device *port, struct data->scan_time = k_uptime_get(); - // TODO (Zephyr 2.6): use k_work_reschedule() - k_delayed_work_cancel(&data->work); - k_delayed_work_submit(&data->work, K_NO_WAIT); + k_work_reschedule(&data->work, K_NO_WAIT); } #endif @@ -226,9 +224,7 @@ static void kscan_matrix_read_continue(const struct device *dev) { data->scan_time += config->debounce_scan_period_ms; - // TODO (Zephyr 2.6): use k_work_reschedule() - k_delayed_work_cancel(&data->work); - k_delayed_work_submit(&data->work, K_TIMEOUT_ABS_MS(data->scan_time)); + k_work_reschedule(&data->work, K_TIMEOUT_ABS_MS(data->scan_time)); } static void kscan_matrix_read_end(const struct device *dev) { @@ -242,9 +238,7 @@ static void kscan_matrix_read_end(const struct device *dev) { data->scan_time += config->poll_period_ms; // Return to polling slowly. - // TODO (Zephyr 2.6): use k_work_reschedule() - k_delayed_work_cancel(&data->work); - k_delayed_work_submit(&data->work, K_TIMEOUT_ABS_MS(data->scan_time)); + k_work_reschedule(&data->work, K_TIMEOUT_ABS_MS(data->scan_time)); #endif } @@ -311,7 +305,7 @@ static int kscan_matrix_read(const struct device *dev) { } static void kscan_matrix_work_handler(struct k_work *work) { - struct k_delayed_work *dwork = CONTAINER_OF(work, struct k_delayed_work, work); + struct k_work_delayable *dwork = CONTAINER_OF(work, struct k_work_delayable, work); struct kscan_matrix_data *data = CONTAINER_OF(dwork, struct kscan_matrix_data, work); kscan_matrix_read(data->dev); } @@ -339,7 +333,7 @@ static int kscan_matrix_enable(const struct device *dev) { static int kscan_matrix_disable(const struct device *dev) { struct kscan_matrix_data *data = dev->data; - k_delayed_work_cancel(&data->work); + k_work_cancel_delayable(&data->work); #if USE_INTERRUPTS return kscan_matrix_interrupt_disable(dev); @@ -434,7 +428,7 @@ static int kscan_matrix_init(const struct device *dev) { kscan_matrix_init_outputs(dev); kscan_matrix_set_all_outputs(dev, 0); - k_delayed_work_init(&data->work, kscan_matrix_work_handler); + k_work_init_delayable(&data->work, kscan_matrix_work_handler); return 0; } diff --git a/app/drivers/kscan/kscan_mock.c b/app/drivers/kscan/kscan_mock.c index 8d1545cc..4ccce69f 100644 --- a/app/drivers/kscan/kscan_mock.c +++ b/app/drivers/kscan/kscan_mock.c @@ -19,14 +19,14 @@ struct kscan_mock_data { kscan_callback_t callback; uint32_t event_index; - struct k_delayed_work work; + struct k_work_delayable work; const struct device *dev; }; static int kscan_mock_disable_callback(const struct device *dev) { struct kscan_mock_data *data = dev->data; - k_delayed_work_cancel(&data->work); + k_work_cancel_delayable(&data->work); return 0; } @@ -54,7 +54,7 @@ static int kscan_mock_configure(const struct device *dev, kscan_callback_t callb if (data->event_index < DT_INST_PROP_LEN(n, events)) { \ uint32_t ev = cfg->events[data->event_index]; \ LOG_DBG("delaying next keypress: %d", ZMK_MOCK_MSEC(ev)); \ - k_delayed_work_submit(&data->work, K_MSEC(ZMK_MOCK_MSEC(ev))); \ + k_work_schedule(&data->work, K_MSEC(ZMK_MOCK_MSEC(ev))); \ } else if (cfg->exit_after) { \ LOG_DBG("Exiting"); \ exit(0); \ @@ -73,7 +73,7 @@ static int kscan_mock_configure(const struct device *dev, kscan_callback_t callb static int kscan_mock_init_##n(const struct device *dev) { \ struct kscan_mock_data *data = dev->data; \ data->dev = dev; \ - k_delayed_work_init(&data->work, kscan_mock_work_handler_##n); \ + k_work_init_delayable(&data->work, kscan_mock_work_handler_##n); \ return 0; \ } \ static int kscan_mock_enable_callback_##n(const struct device *dev) { \ @@ -88,7 +88,7 @@ static int kscan_mock_configure(const struct device *dev, kscan_callback_t callb static struct kscan_mock_data kscan_mock_data_##n; \ static const struct kscan_mock_config_##n kscan_mock_config_##n = { \ .events = DT_INST_PROP(n, events), .exit_after = DT_INST_PROP(n, exit_after)}; \ - DEVICE_DT_INST_DEFINE(n, kscan_mock_init_##n, device_pm_control_nop, &kscan_mock_data_##n, \ + DEVICE_DT_INST_DEFINE(n, kscan_mock_init_##n, NULL, &kscan_mock_data_##n, \ &kscan_mock_config_##n, APPLICATION, \ CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &mock_driver_api_##n); diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index a3cd8d47..617d5aad 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -22,7 +22,7 @@ struct q_item { K_MSGQ_DEFINE(zmk_behavior_queue_msgq, sizeof(struct q_item), CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE, 4); static void behavior_queue_process_next(struct k_work *work); -static K_DELAYED_WORK_DEFINE(queue_work, behavior_queue_process_next); +static K_WORK_DELAYABLE_DEFINE(queue_work, behavior_queue_process_next); static void behavior_queue_process_next(struct k_work *work) { struct q_item item = {.wait = 0}; @@ -43,7 +43,7 @@ static void behavior_queue_process_next(struct k_work *work) { LOG_DBG("Processing next queued behavior in %dms", item.wait); if (item.wait > 0) { - k_delayed_work_submit(&queue_work, K_MSEC(item.wait)); + k_work_schedule(&queue_work, K_MSEC(item.wait)); break; } } @@ -58,7 +58,7 @@ int zmk_behavior_queue_add(uint32_t position, const struct zmk_behavior_binding return ret; } - if (!k_delayed_work_pending(&queue_work)) { + if (!k_work_delayable_is_pending(&queue_work)) { behavior_queue_process_next(&queue_work.work); } diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 4b35e4de..5a0cd9e7 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -23,7 +23,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define ZMK_BHV_TAP_DANCE_MAX_HELD 10 -#define ZMK_BHV_TAP_DANCE_POSITION_FREE ULONG_MAX +#define ZMK_BHV_TAP_DANCE_POSITION_FREE UINT32_MAX struct behavior_tap_dance_config { uint32_t tapping_term_ms; @@ -45,7 +45,7 @@ struct active_tap_dance { bool timer_cancelled; bool tap_dance_decided; int64_t release_at; - struct k_delayed_work release_timer; + struct k_work_delayable release_timer; }; struct active_tap_dance active_tap_dances[ZMK_BHV_TAP_DANCE_MAX_HELD] = {}; @@ -84,7 +84,7 @@ static void clear_tap_dance(struct active_tap_dance *tap_dance) { } static int stop_timer(struct active_tap_dance *tap_dance) { - int timer_cancel_result = k_delayed_work_cancel(&tap_dance->release_timer); + int timer_cancel_result = k_work_cancel_delayable(&tap_dance->release_timer); if (timer_cancel_result == -EINPROGRESS) { // too late to cancel, we'll let the timer handler clear up. tap_dance->timer_cancelled = true; @@ -97,7 +97,7 @@ static void reset_timer(struct active_tap_dance *tap_dance, tap_dance->release_at = event.timestamp + tap_dance->config->tapping_term_ms; int32_t ms_left = tap_dance->release_at - k_uptime_get(); if (ms_left > 0) { - k_delayed_work_submit(&tap_dance->release_timer, K_MSEC(ms_left)); + k_work_schedule(&tap_dance->release_timer, K_MSEC(ms_left)); LOG_DBG("Successfully reset timer at position %d", tap_dance->position); } } @@ -228,8 +228,8 @@ static int behavior_tap_dance_init(const struct device *dev) { static bool init_first_run = true; if (init_first_run) { for (int i = 0; i < ZMK_BHV_TAP_DANCE_MAX_HELD; i++) { - k_delayed_work_init(&active_tap_dances[i].release_timer, - behavior_tap_dance_timer_handler); + k_work_init_delayable(&active_tap_dances[i].release_timer, + behavior_tap_dance_timer_handler); clear_tap_dance(&active_tap_dances[i]); } } @@ -250,9 +250,9 @@ static int behavior_tap_dance_init(const struct device *dev) { .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ .behaviors = behavior_tap_dance_config_##n##_bindings, \ .behavior_count = DT_INST_PROP_LEN(n, bindings)}; \ - DEVICE_AND_API_INIT(behavior_tap_dance_##n, DT_INST_LABEL(n), behavior_tap_dance_init, NULL, \ - &behavior_tap_dance_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tap_dance_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_tap_dance_init, device_pm_control_nop, NULL, \ + &behavior_tap_dance_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tap_dance_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/ble.c b/app/src/ble.c index afc2e47f..a930cadc 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -247,13 +247,12 @@ static void ble_save_profile_work(struct k_work *work) { settings_save_one("ble/active_profile", &active_profile, sizeof(active_profile)); } -static struct k_delayed_work ble_save_work; +static struct k_work_delayable ble_save_work; #endif static int ble_save_profile() { #if IS_ENABLED(CONFIG_SETTINGS) - k_delayed_work_cancel(&ble_save_work); - return k_delayed_work_submit(&ble_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + return k_work_reschedule(&ble_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); #else return 0; #endif @@ -391,11 +390,6 @@ static void connected(struct bt_conn *conn, uint8_t err) { LOG_DBG("Connected %s", log_strdup(addr)); - err = bt_conn_le_param_update(conn, BT_LE_CONN_PARAM(0x0006, 0x000c, 30, 400)); - if (err) { - LOG_WRN("Failed to update LE parameters (err %d)", err); - } - #if IS_SPLIT_PERIPHERAL bt_conn_le_phy_update(conn, BT_CONN_LE_PHY_PARAM_2M); #endif @@ -505,7 +499,7 @@ static enum bt_security_err auth_pairing_accept(struct bt_conn *conn, bt_conn_get_info(conn, &info); LOG_DBG("role %d, open? %s", info.role, zmk_ble_active_profile_is_open() ? "yes" : "no"); - if (info.role == BT_CONN_ROLE_SLAVE && !zmk_ble_active_profile_is_open()) { + if (info.role == BT_CONN_ROLE_PERIPHERAL && !zmk_ble_active_profile_is_open()) { LOG_WRN("Rejecting pairing request to taken profile %d", active_profile); return BT_SECURITY_ERR_PAIR_NOT_ALLOWED; } @@ -522,7 +516,7 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { bt_addr_le_to_str(dst, addr, sizeof(addr)); bt_conn_get_info(conn, &info); - if (info.role != BT_CONN_ROLE_SLAVE) { + if (info.role != BT_CONN_ROLE_PERIPHERAL) { LOG_DBG("SKIPPING FOR ROLE %d", info.role); return; } @@ -579,7 +573,7 @@ static int zmk_ble_init(const struct device *_arg) { return err; } - k_delayed_work_init(&ble_save_work, ble_save_profile_work); + k_work_init_delayable(&ble_save_work, ble_save_profile_work); settings_load_subtree("ble"); settings_load_subtree("bt"); diff --git a/app/src/combo.c b/app/src/combo.c index bcdaac01..2479057e 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -67,7 +67,7 @@ struct combo_cfg *combo_lookup[ZMK_KEYMAP_LEN][CONFIG_ZMK_COMBO_MAX_COMBOS_PER_K struct active_combo active_combos[CONFIG_ZMK_COMBO_MAX_PRESSED_COMBOS] = {NULL}; int active_combo_count = 0; -struct k_delayed_work timeout_task; +struct k_work_delayable timeout_task; int64_t timeout_task_timeout_at; // Store the combo key pointer in the combos array, one pointer for each key position @@ -370,7 +370,7 @@ static bool release_combo_key(int32_t position, int64_t timestamp) { } static int cleanup() { - k_delayed_work_cancel(&timeout_task); + k_work_cancel_delayable(&timeout_task); clear_candidates(); if (fully_pressed_combo != NULL) { activate_combo(fully_pressed_combo); @@ -386,10 +386,10 @@ static void update_timeout_task() { } if (first_timeout == LLONG_MAX) { timeout_task_timeout_at = 0; - k_delayed_work_cancel(&timeout_task); + k_work_cancel_delayable(&timeout_task); return; } - if (k_delayed_work_submit(&timeout_task, K_MSEC(first_timeout - k_uptime_get())) == 0) { + if (k_work_schedule(&timeout_task, K_MSEC(first_timeout - k_uptime_get())) == 0) { timeout_task_timeout_at = first_timeout; } } @@ -486,7 +486,7 @@ ZMK_SUBSCRIPTION(combo, zmk_position_state_changed); DT_INST_FOREACH_CHILD(0, COMBO_INST) static int combo_init() { - k_delayed_work_init(&timeout_task, combo_timeout_handler); + k_work_init_delayable(&timeout_task, combo_timeout_handler); DT_INST_FOREACH_CHILD(0, INITIALIZE_COMBO); return 0; } diff --git a/app/src/endpoints.c b/app/src/endpoints.c index c15aad87..ebbb9fbc 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -35,13 +35,12 @@ static void endpoints_save_preferred_work(struct k_work *work) { settings_save_one("endpoints/preferred", &preferred_endpoint, sizeof(preferred_endpoint)); } -static struct k_delayed_work endpoints_save_work; +static struct k_work_delayable endpoints_save_work; #endif static int endpoints_save_preferred() { #if IS_ENABLED(CONFIG_SETTINGS) - k_delayed_work_cancel(&endpoints_save_work); - return k_delayed_work_submit(&endpoints_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + return k_work_reschedule(&endpoints_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); #else return 0; #endif @@ -182,7 +181,7 @@ static int zmk_endpoints_init(const struct device *_arg) { return err; } - k_delayed_work_init(&endpoints_save_work, endpoints_save_preferred_work); + k_work_init_delayable(&endpoints_save_work, endpoints_save_preferred_work); settings_load_subtree("endpoints"); #endif diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index d2ca14dc..367cf3a2 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -47,13 +47,12 @@ static void ext_power_save_state_work(struct k_work *work) { settings_save_one(setting_path, &data->status, sizeof(data->status)); } -static struct k_delayed_work ext_power_save_work; +static struct k_work_delayable ext_power_save_work; #endif int ext_power_save_state() { #if IS_ENABLED(CONFIG_SETTINGS) - k_delayed_work_cancel(&ext_power_save_work); - return k_delayed_work_submit(&ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + return k_work_reschedule(&ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); #else return 0; #endif @@ -156,14 +155,14 @@ static int ext_power_generic_init(const struct device *dev) { return err; } - k_delayed_work_init(&ext_power_save_work, ext_power_save_state_work); + k_work_init_delayable(&ext_power_save_work, ext_power_save_state_work); // Set default value (on) if settings isn't set settings_load_subtree("ext_power"); if (!data->settings_init) { data->status = true; - k_delayed_work_submit(&ext_power_save_work, K_NO_WAIT); + k_work_schedule(&ext_power_save_work, K_NO_WAIT); ext_power_enable(dev); } diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 427552fa..b1e2348e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -220,7 +220,7 @@ static void zmk_rgb_underglow_save_state_work() { settings_save_one("rgb/underglow/state", &state, sizeof(state)); } -static struct k_delayed_work underglow_save_work; +static struct k_work_delayable underglow_save_work; #endif static int zmk_rgb_underglow_init(const struct device *_arg) { @@ -260,7 +260,7 @@ static int zmk_rgb_underglow_init(const struct device *_arg) { return err; } - k_delayed_work_init(&underglow_save_work, zmk_rgb_underglow_save_state_work); + k_work_init_delayable(&underglow_save_work, zmk_rgb_underglow_save_state_work); settings_load_subtree("rgb/underglow"); #endif @@ -272,8 +272,7 @@ static int zmk_rgb_underglow_init(const struct device *_arg) { int zmk_rgb_underglow_save_state() { #if IS_ENABLED(CONFIG_SETTINGS) - k_delayed_work_cancel(&underglow_save_work); - return k_delayed_work_submit(&underglow_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + return k_work_reschedule(&underglow_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); #else return 0; #endif From 40d84706640b0d564a2617b78b487397046f1fd4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 04:14:44 +0000 Subject: [PATCH 002/494] refactor: Handle HID macro/API changes in Zephyr. --- app/include/dt-bindings/zmk/hid_usage_pages.h | 6 +- app/include/dt-bindings/zmk/keys.h | 755 +++++++++--------- .../zmk/events/keycode_state_changed.h | 4 +- app/include/zmk/hid.h | 198 ++--- app/src/behaviors/behavior_caps_word.c | 4 +- app/src/behaviors/behavior_sticky_key.c | 4 +- 6 files changed, 444 insertions(+), 527 deletions(-) diff --git a/app/include/dt-bindings/zmk/hid_usage_pages.h b/app/include/dt-bindings/zmk/hid_usage_pages.h index f38f4fd3..55241522 100644 --- a/app/include/dt-bindings/zmk/hid_usage_pages.h +++ b/app/include/dt-bindings/zmk/hid_usage_pages.h @@ -10,9 +10,9 @@ #pragma once -#define HID_USAGE(page, id) ((page << 16) | id) -#define HID_USAGE_ID(usage) (usage & 0xFFFF) -#define HID_USAGE_PAGE(usage) (usage >> 16) +#define ZMK_HID_USAGE(page, id) ((page << 16) | id) +#define ZMK_HID_USAGE_ID(usage) (usage & 0xFFFF) +#define ZMK_HID_USAGE_PAGE(usage) (usage >> 16) /* WARNING: DEPRECATED from dt-bindings/zmk/keys.h */ #define USAGE_KEYPAD (0x07) // WARNING: DEPRECATED (DO NOT USE) diff --git a/app/include/dt-bindings/zmk/keys.h b/app/include/dt-bindings/zmk/keys.h index 915f2d32..6728003f 100644 --- a/app/include/dt-bindings/zmk/keys.h +++ b/app/include/dt-bindings/zmk/keys.h @@ -10,774 +10,777 @@ #include /* System Power Down */ -#define SYSTEM_POWER (HID_USAGE(HID_USAGE_GD, HID_USAGE_GD_SYSTEM_POWER_DOWN)) +#define SYSTEM_POWER (ZMK_HID_USAGE(HID_USAGE_GD, HID_USAGE_GD_SYSTEM_POWER_DOWN)) #define SYS_PWR (SYSTEM_POWER) /* System Sleep */ -#define SYSTEM_SLEEP (HID_USAGE(HID_USAGE_GD, HID_USAGE_GD_SYSTEM_SLEEP)) +#define SYSTEM_SLEEP (ZMK_HID_USAGE(HID_USAGE_GD, HID_USAGE_GD_SYSTEM_SLEEP)) #define SYS_SLEEP (SYSTEM_SLEEP) /* System Wake Up */ -#define SYSTEM_WAKE_UP (HID_USAGE(HID_USAGE_GD, HID_USAGE_GD_SYSTEM_WAKE_UP)) +#define SYSTEM_WAKE_UP (ZMK_HID_USAGE(HID_USAGE_GD, HID_USAGE_GD_SYSTEM_WAKE_UP)) #define SYS_WAKE (SYSTEM_WAKE_UP) /* Keyboard a and A */ -#define A (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_A)) +#define A (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_A)) /* Keyboard b and B */ -#define B (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_B)) +#define B (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_B)) /* Keyboard c and C */ -#define C (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_C)) +#define C (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_C)) /* Keyboard d and D */ -#define D (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_D)) +#define D (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_D)) /* Keyboard e and E */ -#define E (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_E)) +#define E (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_E)) /* Keyboard f and F */ -#define F (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F)) +#define F (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F)) /* Keyboard g and G */ -#define G (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_G)) +#define G (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_G)) /* Keyboard h and H */ -#define H (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_H)) +#define H (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_H)) /* Keyboard i and I */ -#define I (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_I)) +#define I (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_I)) /* Keyboard j and J */ -#define J (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_J)) +#define J (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_J)) /* Keyboard k and K */ -#define K (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_K)) +#define K (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_K)) /* Keyboard l and L */ -#define L (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_L)) +#define L (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_L)) /* Keyboard m and M */ -#define M (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_M)) +#define M (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_M)) /* Keyboard n and N */ -#define N (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_N)) +#define N (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_N)) /* Keyboard o and O */ -#define O (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_O)) +#define O (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_O)) /* Keyboard p and P */ -#define P (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_P)) +#define P (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_P)) /* Keyboard q and Q */ -#define Q (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_Q)) +#define Q (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_Q)) /* Keyboard r and R */ -#define R (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_R)) +#define R (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_R)) /* Keyboard s and S */ -#define S (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_S)) +#define S (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_S)) /* Keyboard t and T */ -#define T (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_T)) +#define T (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_T)) /* Keyboard u and U */ -#define U (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_U)) +#define U (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_U)) /* Keyboard v and V */ -#define V (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_V)) +#define V (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_V)) /* Keyboard w and W */ -#define W (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_W)) +#define W (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_W)) /* Keyboard x and X */ -#define X (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_X)) +#define X (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_X)) /* Keyboard y and Y */ -#define Y (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_Y)) +#define Y (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_Y)) /* Keyboard z and Z */ -#define Z (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_Z)) +#define Z (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_Z)) /* Keyboard 1 and ! (Exclamation) */ -#define NUMBER_1 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_1_AND_EXCLAMATION)) +#define NUMBER_1 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_1_AND_EXCLAMATION)) #define N1 (NUMBER_1) #define NUM_1 (NUMBER_1) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard ! (Exclamation) */ -#define EXCLAMATION (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_1_AND_EXCLAMATION))) +#define EXCLAMATION (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_1_AND_EXCLAMATION))) #define EXCL (EXCLAMATION) #define BANG (EXCLAMATION) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard 2 and @ (At sign) */ -#define NUMBER_2 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_2_AND_AT)) +#define NUMBER_2 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_2_AND_AT)) #define N2 (NUMBER_2) #define NUM_2 (NUMBER_2) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard @ (At sign) */ -#define AT_SIGN (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_2_AND_AT))) +#define AT_SIGN (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_2_AND_AT))) #define AT (AT_SIGN) #define ATSN (AT_SIGN) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard 3 and # (Hash/Number) */ -#define NUMBER_3 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_3_AND_HASH)) +#define NUMBER_3 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_3_AND_HASH)) #define N3 (NUMBER_3) #define NUM_3 (NUMBER_3) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard # (Hash/Number) */ -#define HASH (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_3_AND_HASH))) +#define HASH (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_3_AND_HASH))) #define POUND (HASH) /* Keyboard 4 and $ (Dollar) */ -#define NUMBER_4 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_4_AND_DOLLAR)) +#define NUMBER_4 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_4_AND_DOLLAR)) #define N4 (NUMBER_4) #define NUM_4 (NUMBER_4) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard $ (Dollar) */ -#define DOLLAR (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_4_AND_DOLLAR))) +#define DOLLAR (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_4_AND_DOLLAR))) #define DLLR (DOLLAR) /* Keyboard 5 and % (Percent) */ -#define NUMBER_5 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_5_AND_PERCENT)) +#define NUMBER_5 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_5_AND_PERCENT)) #define N5 (NUMBER_5) #define NUM_5 (NUMBER_5) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard % (Percent) */ -#define PERCENT (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_5_AND_PERCENT))) +#define PERCENT (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_5_AND_PERCENT))) #define PRCNT (PERCENT) #define PRCT (PERCENT) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard 6 and ^ (Caret) */ -#define NUMBER_6 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_6_AND_CARET)) +#define NUMBER_6 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_6_AND_CARET)) #define N6 (NUMBER_6) #define NUM_6 (NUMBER_6) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard ^ (Caret) */ -#define CARET (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_6_AND_CARET))) +#define CARET (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_6_AND_CARET))) #define CRRT (CARET) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard 7 and & (Ampersand) */ -#define NUMBER_7 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_7_AND_AMPERSAND)) +#define NUMBER_7 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_7_AND_AMPERSAND)) #define N7 (NUMBER_7) #define NUM_7 (NUMBER_7) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard & (Ampersand) */ -#define AMPERSAND (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_7_AND_AMPERSAND))) +#define AMPERSAND (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_7_AND_AMPERSAND))) #define AMPS (AMPERSAND) /* Keyboard 8 and * (Asterisk) */ -#define NUMBER_8 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_8_AND_ASTERISK)) +#define NUMBER_8 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_8_AND_ASTERISK)) #define N8 (NUMBER_8) #define NUM_8 (NUMBER_8) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard * (Asterisk) */ -#define ASTERISK (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_8_AND_ASTERISK))) +#define ASTERISK (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_8_AND_ASTERISK))) #define ASTRK (ASTERISK) #define STAR (ASTERISK) /* Keyboard 9 and ( (Left Parenthesis) */ -#define NUMBER_9 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_9_AND_LEFT_PARENTHESIS)) +#define NUMBER_9 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_9_AND_LEFT_PARENTHESIS)) #define N9 (NUMBER_9) #define NUM_9 (NUMBER_9) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard ( (Left Parenthesis) */ #define LEFT_PARENTHESIS \ - (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_9_AND_LEFT_PARENTHESIS))) + (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_9_AND_LEFT_PARENTHESIS))) #define LPAR (LEFT_PARENTHESIS) #define LPRN (LEFT_PARENTHESIS) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard 0 and ) (Right Parenthesis) */ -#define NUMBER_0 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_0_AND_RIGHT_PARENTHESIS)) +#define NUMBER_0 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_0_AND_RIGHT_PARENTHESIS)) #define N0 (NUMBER_0) #define NUM_0 (NUMBER_0) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard ) (Right Parenthesis) */ #define RIGHT_PARENTHESIS \ - (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_0_AND_RIGHT_PARENTHESIS))) + (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_0_AND_RIGHT_PARENTHESIS))) #define RPAR (RIGHT_PARENTHESIS) #define RPRN (RIGHT_PARENTHESIS) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Return (Enter) */ -#define RETURN (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RETURN_ENTER)) +#define RETURN (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RETURN_ENTER)) #define ENTER (RETURN) #define RET (RETURN) /* Keyboard Escape */ -#define ESCAPE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_ESCAPE)) +#define ESCAPE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_ESCAPE)) #define ESC (ESCAPE) /* Keyboard Backspace */ -#define BACKSPACE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_DELETE_BACKSPACE)) +#define BACKSPACE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_DELETE_BACKSPACE)) #define BSPC (BACKSPACE) #define BKSP (BACKSPACE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Tab */ -#define TAB (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_TAB)) +#define TAB (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_TAB)) /* Keyboard Space */ -#define SPACE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SPACEBAR)) +#define SPACE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SPACEBAR)) #define SPC (SPACE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard - and _ (Minus and Underscore) */ -#define MINUS (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MINUS_AND_UNDERSCORE)) +#define MINUS (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MINUS_AND_UNDERSCORE)) /* Keyboard _ (Underscore) */ -#define UNDERSCORE (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MINUS_AND_UNDERSCORE))) +#define UNDERSCORE (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MINUS_AND_UNDERSCORE))) #define UNDER (UNDERSCORE) /* Keyboard = and + (Equal and Plus) */ -#define EQUAL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EQUAL_AND_PLUS)) +#define EQUAL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EQUAL_AND_PLUS)) #define EQL (EQUAL) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard + (Plus) */ -#define PLUS (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EQUAL_AND_PLUS))) +#define PLUS (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EQUAL_AND_PLUS))) /* Keyboard [ and { (Left Bracket and Left Brace) */ -#define LEFT_BRACKET (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFT_BRACKET_AND_LEFT_BRACE)) +#define LEFT_BRACKET \ + (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFT_BRACKET_AND_LEFT_BRACE)) #define LBKT (LEFT_BRACKET) /* Keyboard { (Left Brace) */ #define LEFT_BRACE \ - (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFT_BRACKET_AND_LEFT_BRACE))) + (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFT_BRACKET_AND_LEFT_BRACE))) #define LBRC (LEFT_BRACE) #define LCUR (LEFT_BRACE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard ] and } (Right Bracket and Right Brace) */ #define RIGHT_BRACKET \ - (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHT_BRACKET_AND_RIGHT_BRACE)) + (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHT_BRACKET_AND_RIGHT_BRACE)) #define RBKT (RIGHT_BRACKET) /* Keyboard } (Right Brace) */ #define RIGHT_BRACE \ - (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHT_BRACKET_AND_RIGHT_BRACE))) + (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHT_BRACKET_AND_RIGHT_BRACE))) #define RBRC (RIGHT_BRACE) #define RCUR (RIGHT_BRACE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard \ and | (Backslash and Pipe) */ -#define BACKSLASH (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_BACKSLASH_AND_PIPE)) +#define BACKSLASH (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_BACKSLASH_AND_PIPE)) #define BSLH (BACKSLASH) /* Keyboard | (Pipe) */ -#define PIPE (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_BACKSLASH_AND_PIPE))) +#define PIPE (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_BACKSLASH_AND_PIPE))) /* Keyboard Non-US # and ~ (Non-US Hash/Number and Tilde) */ -#define NON_US_HASH (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE)) +#define NON_US_HASH (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE)) /* Keyboard ~ (Tilde) */ -#define TILDE2 (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE))) +#define TILDE2 (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE))) /* Keyboard ; and : (Semicolon and Colon) */ -#define SEMICOLON (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SEMICOLON_AND_COLON)) +#define SEMICOLON (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SEMICOLON_AND_COLON)) #define SEMI (SEMICOLON) #define SCLN (SEMICOLON) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard : (Colon) */ -#define COLON (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SEMICOLON_AND_COLON))) +#define COLON (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SEMICOLON_AND_COLON))) #define COLN (COLON) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard ' and " (Apostrophe and Quote) */ -#define SINGLE_QUOTE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_APOSTROPHE_AND_QUOTE)) +#define SINGLE_QUOTE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_APOSTROPHE_AND_QUOTE)) #define SQT (SINGLE_QUOTE) #define APOSTROPHE (SINGLE_QUOTE) #define APOS (SINGLE_QUOTE) #define QUOT (SINGLE_QUOTE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard " (Quote) */ -#define DOUBLE_QUOTES (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_APOSTROPHE_AND_QUOTE))) +#define DOUBLE_QUOTES \ + (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_APOSTROPHE_AND_QUOTE))) #define DQT (DOUBLE_QUOTES) /* Keyboard ` and ~ (Grave Accent and Tilde) */ -#define GRAVE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_GRAVE_ACCENT_AND_TILDE)) +#define GRAVE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_GRAVE_ACCENT_AND_TILDE)) #define GRAV (GRAVE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard ~ (Tilde) */ -#define TILDE (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_GRAVE_ACCENT_AND_TILDE))) +#define TILDE (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_GRAVE_ACCENT_AND_TILDE))) #define TILD (TILDE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard , and < (Comma and Less Than) */ -#define COMMA (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_COMMA_AND_LESS_THAN)) +#define COMMA (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_COMMA_AND_LESS_THAN)) #define CMMA (COMMA) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard < (Less Than) */ -#define LESS_THAN (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_COMMA_AND_LESS_THAN))) +#define LESS_THAN (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_COMMA_AND_LESS_THAN))) #define LT (LESS_THAN) #define LABT (LESS_THAN) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard . and > (Period and Greater Than) */ -#define PERIOD (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PERIOD_AND_GREATER_THAN)) +#define PERIOD (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PERIOD_AND_GREATER_THAN)) #define DOT (PERIOD) /* Keyboard > (Greater Than) */ -#define GREATER_THAN (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PERIOD_AND_GREATER_THAN))) +#define GREATER_THAN \ + (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PERIOD_AND_GREATER_THAN))) #define GT (GREATER_THAN) #define RABT (GREATER_THAN) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard / and ? (Forward Slash and Question) */ -#define SLASH (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SLASH_AND_QUESTION_MARK)) +#define SLASH (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SLASH_AND_QUESTION_MARK)) #define FSLH (SLASH) /* Keyboard ? (Question) */ -#define QUESTION (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SLASH_AND_QUESTION_MARK))) +#define QUESTION (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SLASH_AND_QUESTION_MARK))) #define QMARK (QUESTION) /* Keyboard Caps Lock */ -#define CAPSLOCK (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CAPS_LOCK)) +#define CAPSLOCK (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CAPS_LOCK)) #define CAPS (CAPSLOCK) #define CLCK (CAPSLOCK) /* Keyboard F1 */ -#define F1 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F1)) +#define F1 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F1)) /* Keyboard F2 */ -#define F2 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F2)) +#define F2 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F2)) /* Keyboard F3 */ -#define F3 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F3)) +#define F3 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F3)) /* Keyboard F4 */ -#define F4 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F4)) +#define F4 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F4)) /* Keyboard F5 */ -#define F5 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F5)) +#define F5 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F5)) /* Keyboard F6 */ -#define F6 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F6)) +#define F6 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F6)) /* Keyboard F7 */ -#define F7 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F7)) +#define F7 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F7)) /* Keyboard F8 */ -#define F8 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F8)) +#define F8 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F8)) /* Keyboard F9 */ -#define F9 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F9)) +#define F9 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F9)) /* Keyboard F10 */ -#define F10 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F10)) +#define F10 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F10)) /* Keyboard F11 */ -#define F11 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F11)) +#define F11 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F11)) /* Keyboard F12 */ -#define F12 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F12)) +#define F12 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F12)) /* Keyboard Print Screen */ -#define PRINTSCREEN (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PRINTSCREEN)) +#define PRINTSCREEN (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PRINTSCREEN)) #define PSCRN (PRINTSCREEN) #define PRSC (PRINTSCREEN) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Scroll Lock */ -#define SCROLLLOCK (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SCROLL_LOCK)) +#define SCROLLLOCK (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SCROLL_LOCK)) #define SLCK (SCROLLLOCK) #define SCLK (SCROLLLOCK) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Pause/Break */ -#define PAUSE_BREAK (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PAUSE)) +#define PAUSE_BREAK (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PAUSE)) #define PAUS (PAUSE_BREAK) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Insert */ -#define INSERT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INSERT)) +#define INSERT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INSERT)) #define INS (INSERT) /* Keyboard Home */ -#define HOME (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_HOME)) +#define HOME (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_HOME)) /* Keyboard Page Up */ -#define PAGE_UP (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PAGEUP)) +#define PAGE_UP (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PAGEUP)) #define PG_UP (PAGE_UP) #define PGUP (PAGE_UP) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Delete */ -#define DELETE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_DELETE_FORWARD)) +#define DELETE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_DELETE_FORWARD)) #define DEL (DELETE) /* Keyboard End */ -#define END (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_END)) +#define END (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_END)) /* Keyboard Page Down */ -#define PAGE_DOWN (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PAGEDOWN)) +#define PAGE_DOWN (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PAGEDOWN)) #define PG_DN (PAGE_DOWN) #define PGDN (PAGE_DOWN) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Right Arrow */ -#define RIGHT_ARROW (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTARROW)) +#define RIGHT_ARROW (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTARROW)) #define RIGHT (RIGHT_ARROW) #define RARW (RIGHT_ARROW) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Left Arrow */ -#define LEFT_ARROW (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTARROW)) +#define LEFT_ARROW (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTARROW)) #define LEFT (LEFT_ARROW) #define LARW (LEFT_ARROW) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Down Arrow */ -#define DOWN_ARROW (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_DOWNARROW)) +#define DOWN_ARROW (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_DOWNARROW)) #define DOWN (DOWN_ARROW) #define DARW (DOWN_ARROW) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Up Arrow */ -#define UP_ARROW (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_UPARROW)) +#define UP_ARROW (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_UPARROW)) #define UP (UP_ARROW) #define UARW (UP_ARROW) // WARNING: DEPRECATED (DO NOT USE) /* Keypad Numlock and Clear */ -#define KP_NUMLOCK (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_NUM_LOCK_AND_CLEAR)) +#define KP_NUMLOCK (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_NUM_LOCK_AND_CLEAR)) #define KP_NUM (KP_NUMLOCK) #define KP_NLCK (KP_NUMLOCK) /* Keypad Clear */ -#define CLEAR2 (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_NUM_LOCK_AND_CLEAR))) +#define CLEAR2 (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_NUM_LOCK_AND_CLEAR))) /* Keypad / (Slash/Divide) */ -#define KP_DIVIDE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_SLASH)) +#define KP_DIVIDE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_SLASH)) #define KP_SLASH (KP_DIVIDE) #define KDIV (KP_DIVIDE) // WARNING: DEPRECATED (DO NOT USE) /* Keypad * (Multiply) */ -#define KP_MULTIPLY (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_ASTERISK)) +#define KP_MULTIPLY (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_ASTERISK)) #define KP_ASTERISK (KP_MULTIPLY) #define KMLT (KP_MULTIPLY) // WARNING: DEPRECATED (DO NOT USE) /* Keypad - (Minus) */ -#define KP_MINUS (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_MINUS)) +#define KP_MINUS (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_MINUS)) #define KP_SUBTRACT (KP_MINUS) #define KMIN (KP_MINUS) // WARNING: DEPRECATED (DO NOT USE) /* Keypad + (Plus) */ -#define KP_PLUS (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_PLUS)) +#define KP_PLUS (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_PLUS)) #define KPLS (KP_PLUS) // WARNING: DEPRECATED (DO NOT USE) /* Keypad Enter */ -#define KP_ENTER (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_ENTER)) +#define KP_ENTER (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_ENTER)) /* Keypad 1 */ -#define KP_NUMBER_1 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_1_AND_END)) +#define KP_NUMBER_1 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_1_AND_END)) #define KP_N1 (KP_NUMBER_1) /* Keypad 2 */ -#define KP_NUMBER_2 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_2_AND_DOWN_ARROW)) +#define KP_NUMBER_2 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_2_AND_DOWN_ARROW)) #define KP_N2 (KP_NUMBER_2) /* Keypad 3 */ -#define KP_NUMBER_3 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_3_AND_PAGEDN)) +#define KP_NUMBER_3 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_3_AND_PAGEDN)) #define KP_N3 (KP_NUMBER_3) /* Keypad 4 */ -#define KP_NUMBER_4 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_4_AND_LEFT_ARROW)) +#define KP_NUMBER_4 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_4_AND_LEFT_ARROW)) #define KP_N4 (KP_NUMBER_4) /* Keypad 5 */ -#define KP_NUMBER_5 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_5)) +#define KP_NUMBER_5 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_5)) #define KP_N5 (KP_NUMBER_5) /* Keypad 6 */ -#define KP_NUMBER_6 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_6_AND_RIGHT_ARROW)) +#define KP_NUMBER_6 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_6_AND_RIGHT_ARROW)) #define KP_N6 (KP_NUMBER_6) /* Keypad 7 */ -#define KP_NUMBER_7 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_7_AND_HOME)) +#define KP_NUMBER_7 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_7_AND_HOME)) #define KP_N7 (KP_NUMBER_7) /* Keypad 8 */ -#define KP_NUMBER_8 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_8_AND_UP_ARROW)) +#define KP_NUMBER_8 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_8_AND_UP_ARROW)) #define KP_N8 (KP_NUMBER_8) /* Keypad 9 */ -#define KP_NUMBER_9 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_9_AND_PAGEUP)) +#define KP_NUMBER_9 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_9_AND_PAGEUP)) #define KP_N9 (KP_NUMBER_9) /* Keypad 0 */ -#define KP_NUMBER_0 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_0_AND_INSERT)) +#define KP_NUMBER_0 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_0_AND_INSERT)) #define KP_N0 (KP_NUMBER_0) /* Keypad . (Dot) */ -#define KP_DOT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_PERIOD_AND_DELETE)) +#define KP_DOT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_PERIOD_AND_DELETE)) /* Keyboard Non-US \ and | (Non-us Backslash and Pipe) */ #define NON_US_BACKSLASH \ - (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE)) + (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE)) #define NON_US_BSLH (NON_US_BACKSLASH) /* Keyboard Pipe */ -#define PIPE2 (LS(HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE))) +#define PIPE2 (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE))) /* Keyboard Application (Context Menu) */ -#define K_APPLICATION (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_APPLICATION)) +#define K_APPLICATION (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_APPLICATION)) #define K_APP (K_APPLICATION) #define K_CONTEXT_MENU (K_APPLICATION) #define K_CMENU (K_APPLICATION) #define GUI (K_APPLICATION) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Power */ -#define K_POWER (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_POWER)) +#define K_POWER (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_POWER)) #define K_PWR (K_POWER) /* Keypad = (Equal) */ -#define KP_EQUAL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_EQUAL)) +#define KP_EQUAL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_EQUAL)) /* Keyboard F13 */ -#define F13 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F13)) +#define F13 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F13)) /* Keyboard F14 */ -#define F14 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F14)) +#define F14 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F14)) /* Keyboard F15 */ -#define F15 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F15)) +#define F15 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F15)) /* Keyboard F16 */ -#define F16 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F16)) +#define F16 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F16)) /* Keyboard F17 */ -#define F17 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F17)) +#define F17 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F17)) /* Keyboard F18 */ -#define F18 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F18)) +#define F18 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F18)) /* Keyboard F19 */ -#define F19 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F19)) +#define F19 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F19)) /* Keyboard F20 */ -#define F20 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F20)) +#define F20 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F20)) /* Keyboard F21 */ -#define F21 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F21)) +#define F21 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F21)) /* Keyboard F22 */ -#define F22 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F22)) +#define F22 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F22)) /* Keyboard F23 */ -#define F23 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F23)) +#define F23 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F23)) /* Keyboard F24 */ -#define F24 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F24)) +#define F24 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_F24)) /* Keyboard Execute */ -#define K_EXECUTE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EXECUTE)) +#define K_EXECUTE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EXECUTE)) #define K_EXEC (K_EXECUTE) /* Keyboard Help */ -#define K_HELP (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_HELP)) +#define K_HELP (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_HELP)) /* Keyboard Menu */ -#define K_MENU (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MENU)) +#define K_MENU (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MENU)) /* Keyboard Select */ -#define K_SELECT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SELECT)) +#define K_SELECT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SELECT)) /* Keyboard Stop */ -#define K_STOP (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_STOP)) +#define K_STOP (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_STOP)) /* Keyboard Again */ -#define K_AGAIN (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_AGAIN)) +#define K_AGAIN (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_AGAIN)) #define K_REDO (K_AGAIN) /* Keyboard Undo */ -#define K_UNDO (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_UNDO)) +#define K_UNDO (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_UNDO)) #define UNDO (K_UNDO) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Cut */ -#define K_CUT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CUT)) +#define K_CUT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CUT)) #define CUT (K_CUT) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Copy */ -#define K_COPY (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_COPY)) +#define K_COPY (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_COPY)) #define COPY (K_COPY) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Paste */ -#define K_PASTE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PASTE)) +#define K_PASTE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PASTE)) #define PSTE (K_PASTE) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Find */ -#define K_FIND (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_FIND)) +#define K_FIND (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_FIND)) /* Keyboard Mute */ -#define K_MUTE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MUTE)) +#define K_MUTE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_MUTE)) /* Keyboard Volume Up */ -#define K_VOLUME_UP (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_VOLUME_UP)) +#define K_VOLUME_UP (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_VOLUME_UP)) #define K_VOL_UP (K_VOLUME_UP) #define VOLU (K_VOLUME_UP) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Volume Down */ -#define K_VOLUME_DOWN (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_VOLUME_DOWN)) +#define K_VOLUME_DOWN (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_VOLUME_DOWN)) #define K_VOL_DN (K_VOLUME_DOWN) #define VOLD (K_VOLUME_DOWN) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Locking Caps Lock */ -#define LOCKING_CAPS (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LOCKING_CAPS_LOCK)) +#define LOCKING_CAPS (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LOCKING_CAPS_LOCK)) #define LCAPS (LOCKING_CAPS) /* Keyboard Locking Num Lock */ -#define LOCKING_NUM (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LOCKING_NUM_LOCK)) +#define LOCKING_NUM (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LOCKING_NUM_LOCK)) #define LNLCK (LOCKING_NUM) /* Keyboard Locking Scroll Lock */ -#define LOCKING_SCROLL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LOCKING_SCROLL_LOCK)) +#define LOCKING_SCROLL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LOCKING_SCROLL_LOCK)) #define LSLCK (LOCKING_SCROLL) /* Keypad , (Comma) */ -#define KP_COMMA (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_COMMA)) +#define KP_COMMA (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_COMMA)) /* Keypad = (Equal) AS/400 */ -#define KP_EQUAL_AS400 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_EQUAL_SIGN)) +#define KP_EQUAL_AS400 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_EQUAL_SIGN)) /* Keyboard International 1 */ -#define INTERNATIONAL_1 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL1)) +#define INTERNATIONAL_1 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL1)) #define INT1 (INTERNATIONAL_1) #define INT_RO (INTERNATIONAL_1) /* Keyboard International 2 */ -#define INTERNATIONAL_2 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL2)) +#define INTERNATIONAL_2 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL2)) #define INT2 (INTERNATIONAL_2) #define INT_KATAKANAHIRAGANA (INTERNATIONAL_2) #define INT_KANA (INTERNATIONAL_2) /* Keyboard International 3 */ -#define INTERNATIONAL_3 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL3)) +#define INTERNATIONAL_3 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL3)) #define INT3 (INTERNATIONAL_3) #define INT_YEN (INTERNATIONAL_3) /* Keyboard International 4 */ -#define INTERNATIONAL_4 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL4)) +#define INTERNATIONAL_4 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL4)) #define INT4 (INTERNATIONAL_4) #define INT_HENKAN (INTERNATIONAL_4) /* Keyboard International 5 */ -#define INTERNATIONAL_5 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL5)) +#define INTERNATIONAL_5 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL5)) #define INT5 (INTERNATIONAL_5) #define INT_MUHENKAN (INTERNATIONAL_5) /* Keyboard International 6 */ -#define INTERNATIONAL_6 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL6)) +#define INTERNATIONAL_6 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL6)) #define INT6 (INTERNATIONAL_6) #define INT_KPJPCOMMA (INTERNATIONAL_6) /* Keyboard International 7 */ -#define INTERNATIONAL_7 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL7)) +#define INTERNATIONAL_7 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL7)) #define INT7 (INTERNATIONAL_7) /* Keyboard International 8 */ -#define INTERNATIONAL_8 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL8)) +#define INTERNATIONAL_8 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL8)) #define INT8 (INTERNATIONAL_8) /* Keyboard International 9 */ -#define INTERNATIONAL_9 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL9)) +#define INTERNATIONAL_9 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_INTERNATIONAL9)) #define INT9 (INTERNATIONAL_9) /* Keyboard Language 1 */ -#define LANGUAGE_1 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG1)) +#define LANGUAGE_1 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG1)) #define LANG1 (LANGUAGE_1) #define LANG_HANGEUL (LANGUAGE_1) /* Keyboard Language 2 */ -#define LANGUAGE_2 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG2)) +#define LANGUAGE_2 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG2)) #define LANG2 (LANGUAGE_2) #define LANG_HANJA (LANGUAGE_2) /* Keyboard Language 3 */ -#define LANGUAGE_3 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG3)) +#define LANGUAGE_3 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG3)) #define LANG3 (LANGUAGE_3) #define LANG_KATAKANA (LANGUAGE_3) /* Keyboard Language 4 */ -#define LANGUAGE_4 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG4)) +#define LANGUAGE_4 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG4)) #define LANG4 (LANGUAGE_4) #define LANG_HIRAGANA (LANGUAGE_4) /* Keyboard Language 5 */ -#define LANGUAGE_5 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG5)) +#define LANGUAGE_5 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG5)) #define LANG5 (LANGUAGE_5) #define LANG_ZENKAKUHANKAKU (LANGUAGE_5) /* Keyboard Language 6 */ -#define LANGUAGE_6 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG6)) +#define LANGUAGE_6 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG6)) #define LANG6 (LANGUAGE_6) /* Keyboard Language 7 */ -#define LANGUAGE_7 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG7)) +#define LANGUAGE_7 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG7)) #define LANG7 (LANGUAGE_7) /* Keyboard Language 8 */ -#define LANGUAGE_8 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG8)) +#define LANGUAGE_8 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG8)) #define LANG8 (LANGUAGE_8) /* Keyboard Language 9 */ -#define LANGUAGE_9 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG9)) +#define LANGUAGE_9 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LANG9)) #define LANG9 (LANGUAGE_9) /* Keyboard Alternate Erase */ -#define ALT_ERASE (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_ALTERNATE_ERASE)) +#define ALT_ERASE (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_ALTERNATE_ERASE)) /* Keyboard SysReq/Attention */ -#define SYSREQ (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SYSREQ_ATTENTION)) +#define SYSREQ (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SYSREQ_ATTENTION)) #define ATTENTION (SYSREQ) /* Keyboard Cancel */ -#define K_CANCEL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CANCEL)) +#define K_CANCEL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CANCEL)) /* Keyboard Clear */ -#define CLEAR (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CLEAR)) +#define CLEAR (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CLEAR)) /* Keyboard Prior */ -#define PRIOR (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PRIOR)) +#define PRIOR (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_PRIOR)) /* Keyboard Return */ -#define RETURN2 (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RETURN)) +#define RETURN2 (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RETURN)) #define RET2 (RETURN2) /* Keyboard Separator */ -#define SEPARATOR (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SEPARATOR)) +#define SEPARATOR (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_SEPARATOR)) /* Keyboard Out */ -#define OUT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_OUT)) +#define OUT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_OUT)) /* Keyboard Oper */ -#define OPER (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_OPER)) +#define OPER (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_OPER)) /* Keyboard Clear/Again */ -#define CLEAR_AGAIN (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CLEAR_AGAIN)) +#define CLEAR_AGAIN (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CLEAR_AGAIN)) /* Keyboard CrSel/Props */ -#define CRSEL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CRSEL_PROPS)) +#define CRSEL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_CRSEL_PROPS)) /* Keyboard ExSel */ -#define EXSEL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EXSEL)) +#define EXSEL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_EXSEL)) /* Keyboard Currency Unit */ #define CURU \ - (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_CURRENCY_UNIT)) // WARNING: DEPRECATED (DO NOT USE) + (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_CURRENCY_UNIT)) // WARNING: DEPRECATED (DO NOT USE) /* Keypad ( (Left Parenthesis) */ -#define KP_LEFT_PARENTHESIS (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_LEFT_PARENTHESIS)) +#define KP_LEFT_PARENTHESIS (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_LEFT_PARENTHESIS)) #define KP_LPAR (KP_LEFT_PARENTHESIS) /* Keypad ) (Right Parenthesis) */ -#define KP_RIGHT_PARENTHESIS (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_RIGHT_PARENTHESIS)) +#define KP_RIGHT_PARENTHESIS (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_RIGHT_PARENTHESIS)) #define KP_RPAR (KP_RIGHT_PARENTHESIS) /* Keypad Space */ #define KSPC \ - (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_SPACE)) // WARNING: DEPRECATED (DO NOT USE) + (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_SPACE)) // WARNING: DEPRECATED (DO NOT USE) /* Keypad Clear */ -#define KP_CLEAR (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_CLEAR)) +#define KP_CLEAR (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYPAD_CLEAR)) /* Keyboard Left Control */ -#define LEFT_CONTROL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTCONTROL)) +#define LEFT_CONTROL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTCONTROL)) #define LCTRL (LEFT_CONTROL) #define LCTL (LEFT_CONTROL) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Left Shift */ -#define LEFT_SHIFT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTSHIFT)) +#define LEFT_SHIFT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTSHIFT)) #define LSHIFT (LEFT_SHIFT) #define LSHFT (LEFT_SHIFT) #define LSFT (LEFT_SHIFT) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Left Alt */ -#define LEFT_ALT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTALT)) +#define LEFT_ALT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFTALT)) #define LALT (LEFT_ALT) /* Keyboard Left GUI (Windows / Command / Meta) */ -#define LEFT_GUI (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFT_GUI)) +#define LEFT_GUI (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_LEFT_GUI)) #define LGUI (LEFT_GUI) #define LEFT_WIN (LEFT_GUI) #define LWIN (LEFT_GUI) @@ -787,22 +790,22 @@ #define LMETA (LEFT_GUI) /* Keyboard Right Control */ -#define RIGHT_CONTROL (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTCONTROL)) +#define RIGHT_CONTROL (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTCONTROL)) #define RCTRL (RIGHT_CONTROL) #define RCTL (RIGHT_CONTROL) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Right Shift */ -#define RIGHT_SHIFT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTSHIFT)) +#define RIGHT_SHIFT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTSHIFT)) #define RSHIFT (RIGHT_SHIFT) #define RSHFT (RIGHT_SHIFT) #define RSFT (RIGHT_SHIFT) // WARNING: DEPRECATED (DO NOT USE) /* Keyboard Right Alt */ -#define RIGHT_ALT (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTALT)) +#define RIGHT_ALT (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHTALT)) #define RALT (RIGHT_ALT) /* Keyboard Right GUI (Windows / Command / Meta) */ -#define RIGHT_GUI (HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHT_GUI)) +#define RIGHT_GUI (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_RIGHT_GUI)) #define RGUI (RIGHT_GUI) #define RIGHT_WIN (RIGHT_GUI) #define RWIN (RIGHT_GUI) @@ -812,611 +815,621 @@ #define RMETA (RIGHT_GUI) /* Keyboard Play/Pause */ -#define K_PLAY_PAUSE (HID_USAGE(HID_USAGE_KEY, 0xE8)) +#define K_PLAY_PAUSE (ZMK_HID_USAGE(HID_USAGE_KEY, 0xE8)) #define K_PP (K_PLAY_PAUSE) /* Keyboard Stop */ -#define K_STOP2 (HID_USAGE(HID_USAGE_KEY, 0xE9)) +#define K_STOP2 (ZMK_HID_USAGE(HID_USAGE_KEY, 0xE9)) /* Keyboard Previous */ -#define K_PREVIOUS (HID_USAGE(HID_USAGE_KEY, 0xEA)) +#define K_PREVIOUS (ZMK_HID_USAGE(HID_USAGE_KEY, 0xEA)) #define K_PREV (K_PREVIOUS) /* Keyboard Next */ -#define K_NEXT (HID_USAGE(HID_USAGE_KEY, 0xEB)) +#define K_NEXT (ZMK_HID_USAGE(HID_USAGE_KEY, 0xEB)) /* Keyboard Eject */ -#define K_EJECT (HID_USAGE(HID_USAGE_KEY, 0xEC)) +#define K_EJECT (ZMK_HID_USAGE(HID_USAGE_KEY, 0xEC)) /* Keyboard Volume Up */ -#define K_VOLUME_UP2 (HID_USAGE(HID_USAGE_KEY, 0xED)) +#define K_VOLUME_UP2 (ZMK_HID_USAGE(HID_USAGE_KEY, 0xED)) #define K_VOL_UP2 (K_VOLUME_UP2) /* Keyboard Volume Down */ -#define K_VOLUME_DOWN2 (HID_USAGE(HID_USAGE_KEY, 0xEE)) +#define K_VOLUME_DOWN2 (ZMK_HID_USAGE(HID_USAGE_KEY, 0xEE)) #define K_VOL_DN2 (K_VOLUME_DOWN2) /* Keyboard Mute */ -#define K_MUTE2 (HID_USAGE(HID_USAGE_KEY, 0xEF)) +#define K_MUTE2 (ZMK_HID_USAGE(HID_USAGE_KEY, 0xEF)) /* Keyboard WWW */ -#define K_WWW (HID_USAGE(HID_USAGE_KEY, 0xF0)) +#define K_WWW (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF0)) /* Keyboard Back */ -#define K_BACK (HID_USAGE(HID_USAGE_KEY, 0xF1)) +#define K_BACK (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF1)) /* Keyboard Forward */ -#define K_FORWARD (HID_USAGE(HID_USAGE_KEY, 0xF2)) +#define K_FORWARD (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF2)) /* Keyboard Stop */ -#define K_STOP3 (HID_USAGE(HID_USAGE_KEY, 0xF3)) +#define K_STOP3 (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF3)) /* Keyboard Find */ -#define K_FIND2 (HID_USAGE(HID_USAGE_KEY, 0xF4)) +#define K_FIND2 (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF4)) /* Keyboard Scroll Up */ -#define K_SCROLL_UP (HID_USAGE(HID_USAGE_KEY, 0xF5)) +#define K_SCROLL_UP (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF5)) /* Keyboard Scroll Down */ -#define K_SCROLL_DOWN (HID_USAGE(HID_USAGE_KEY, 0xF6)) +#define K_SCROLL_DOWN (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF6)) /* Keyboard Edit */ -#define K_EDIT (HID_USAGE(HID_USAGE_KEY, 0xF7)) +#define K_EDIT (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF7)) /* Keyboard Sleep */ -#define K_SLEEP (HID_USAGE(HID_USAGE_KEY, 0xF8)) +#define K_SLEEP (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF8)) /* Keyboard Lock */ -#define K_LOCK (HID_USAGE(HID_USAGE_KEY, 0xF9)) +#define K_LOCK (ZMK_HID_USAGE(HID_USAGE_KEY, 0xF9)) #define K_SCREENSAVER (K_LOCK) #define K_COFFEE (K_LOCK) /* Keyboard Refresh */ -#define K_REFRESH (HID_USAGE(HID_USAGE_KEY, 0xFA)) +#define K_REFRESH (ZMK_HID_USAGE(HID_USAGE_KEY, 0xFA)) /* Keyboard Calculator */ -#define K_CALCULATOR (HID_USAGE(HID_USAGE_KEY, 0xFB)) +#define K_CALCULATOR (ZMK_HID_USAGE(HID_USAGE_KEY, 0xFB)) #define K_CALC (K_CALCULATOR) /* Consumer Power */ -#define C_POWER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_POWER)) +#define C_POWER (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_POWER)) #define C_PWR (C_POWER) /* Consumer Reset */ -#define C_RESET (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RESET)) +#define C_RESET (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RESET)) /* Consumer Sleep */ -#define C_SLEEP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLEEP)) +#define C_SLEEP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLEEP)) /* Consumer Sleep Mode */ -#define C_SLEEP_MODE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLEEP_MODE)) +#define C_SLEEP_MODE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLEEP_MODE)) /* Consumer Menu */ -#define C_MENU (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU)) +#define C_MENU (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU)) /* Consumer Menu Pick */ -#define C_MENU_PICK (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_PICK)) +#define C_MENU_PICK (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_PICK)) #define C_MENU_SELECT (C_MENU_PICK) /* Consumer Menu Up */ -#define C_MENU_UP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_UP)) +#define C_MENU_UP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_UP)) /* Consumer Menu Down */ -#define C_MENU_DOWN (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_DOWN)) +#define C_MENU_DOWN (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_DOWN)) /* Consumer Menu Left */ -#define C_MENU_LEFT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_LEFT)) +#define C_MENU_LEFT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_LEFT)) /* Consumer Menu Right */ -#define C_MENU_RIGHT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_RIGHT)) +#define C_MENU_RIGHT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_RIGHT)) /* Consumer Menu Escape */ -#define C_MENU_ESCAPE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_ESCAPE)) +#define C_MENU_ESCAPE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_ESCAPE)) #define C_MENU_ESC (C_MENU_ESCAPE) /* Consumer Menu Value Increase */ -#define C_MENU_INCREASE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_VALUE_INCREASE)) +#define C_MENU_INCREASE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_VALUE_INCREASE)) #define C_MENU_INC (C_MENU_INCREASE) /* Consumer Menu Value Decrease */ -#define C_MENU_DECREASE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_VALUE_DECREASE)) +#define C_MENU_DECREASE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MENU_VALUE_DECREASE)) #define C_MENU_DEC (C_MENU_DECREASE) /* Consumer Data On Screen */ -#define C_DATA_ON_SCREEN (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DATA_ON_SCREEN)) +#define C_DATA_ON_SCREEN (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DATA_ON_SCREEN)) /* Consumer Closed Caption */ -#define C_CAPTIONS (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_CLOSED_CAPTION)) +#define C_CAPTIONS (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_CLOSED_CAPTION)) #define C_SUBTITILES (C_CAPTIONS) /* Consumer Snapshot */ -#define C_SNAPSHOT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SNAPSHOT)) +#define C_SNAPSHOT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SNAPSHOT)) /* Consumer Picture-in-Picture Toggle */ -#define C_PIP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PICTURE_IN_PICTURE_TOGGLE)) +#define C_PIP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PICTURE_IN_PICTURE_TOGGLE)) /* Consumer Red Menu Button */ -#define C_RED_BUTTON (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RED_MENU_BUTTON)) +#define C_RED_BUTTON (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RED_MENU_BUTTON)) #define C_RED (C_RED_BUTTON) /* Consumer Green Menu Button */ -#define C_GREEN_BUTTON (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_GREEN_MENU_BUTTON)) +#define C_GREEN_BUTTON (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_GREEN_MENU_BUTTON)) #define C_GREEN (C_GREEN_BUTTON) /* Consumer Blue Menu Button */ -#define C_BLUE_BUTTON (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_BLUE_MENU_BUTTON)) +#define C_BLUE_BUTTON (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_BLUE_MENU_BUTTON)) #define C_BLUE (C_BLUE_BUTTON) /* Consumer Yellow Menu Button */ -#define C_YELLOW_BUTTON (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_YELLOW_MENU_BUTTON)) +#define C_YELLOW_BUTTON (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_YELLOW_MENU_BUTTON)) #define C_YELLOW (C_YELLOW_BUTTON) /* Consumer Aspect */ -#define C_ASPECT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_ASPECT)) +#define C_ASPECT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_ASPECT)) /* Consumer Display Brightness Increment */ #define C_BRIGHTNESS_INC \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_BRIGHTNESS_INCREMENT)) #define C_BRI_INC (C_BRIGHTNESS_INC) #define C_BRI_UP (C_BRIGHTNESS_INC) /* Consumer Display Brightness Decrement */ #define C_BRIGHTNESS_DEC \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_BRIGHTNESS_DECREMENT)) #define C_BRI_DEC (C_BRIGHTNESS_DEC) #define C_BRI_DN (C_BRIGHTNESS_DEC) /* Consumer Display Backlight Toggle */ #define C_BACKLIGHT_TOGGLE \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_BACKLIGHT_TOGGLE)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_BACKLIGHT_TOGGLE)) #define C_BKLT_TOG (C_BACKLIGHT_TOGGLE) /* Consumer Display Set Brightness to Minimum */ #define C_BRIGHTNESS_MINIMUM \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MINIMUM)) #define C_BRI_MIN (C_BRIGHTNESS_MINIMUM) /* Consumer Display Set Brightness to Maximum */ #define C_BRIGHTNESS_MAXIMUM \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_SET_BRIGHTNESS_TO_MAXIMUM)) #define C_BRI_MAX (C_BRIGHTNESS_MAXIMUM) /* Consumer Display Set Auto Brightness */ #define C_BRIGHTNESS_AUTO \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_DISPLAY_SET_AUTO_BRIGHTNESS)) #define C_BRI_AUTO (C_BRIGHTNESS_AUTO) /* Consumer Mode Step */ -#define C_MEDIA_STEP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MODE_STEP)) +#define C_MEDIA_STEP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MODE_STEP)) #define C_MODE_STEP (C_MEDIA_STEP) /* Consumer Recall Last */ -#define C_RECALL_LAST (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RECALL_LAST)) +#define C_RECALL_LAST (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RECALL_LAST)) #define C_CHAN_LAST (C_RECALL_LAST) /* Consumer Media Select Computer */ -#define C_MEDIA_COMPUTER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_COMPUTER)) +#define C_MEDIA_COMPUTER \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_COMPUTER)) /* Consumer Media Select TV */ -#define C_MEDIA_TV (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TV)) +#define C_MEDIA_TV (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TV)) /* Consumer Media Select WWW */ -#define C_MEDIA_WWW (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_WWW)) +#define C_MEDIA_WWW (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_WWW)) /* Consumer Media Select DVD */ -#define C_MEDIA_DVD (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_DVD)) +#define C_MEDIA_DVD (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_DVD)) /* Consumer Media Select Telephone */ -#define C_MEDIA_PHONE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TELEPHONE)) +#define C_MEDIA_PHONE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TELEPHONE)) /* Consumer Media Select Program Guide */ -#define C_MEDIA_GUIDE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE)) +#define C_MEDIA_GUIDE \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE)) /* Consumer Media Select Video Phone */ #define C_MEDIA_VIDEOPHONE \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_VIDEO_PHONE)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_VIDEO_PHONE)) /* Consumer Media Select Games */ -#define C_MEDIA_GAMES (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_GAMES)) +#define C_MEDIA_GAMES (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_GAMES)) /* Consumer Media Select Messages */ -#define C_MEDIA_MESSAGES (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_MESSAGES)) +#define C_MEDIA_MESSAGES \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_MESSAGES)) /* Consumer Media Select CD */ -#define C_MEDIA_CD (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_CD)) +#define C_MEDIA_CD (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_CD)) /* Consumer Media Select VCR */ -#define C_MEDIA_VCR (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_VCR)) +#define C_MEDIA_VCR (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_VCR)) /* Consumer Media Select Tuner */ -#define C_MEDIA_TUNER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TUNER)) +#define C_MEDIA_TUNER (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TUNER)) /* Consumer Quit */ -#define C_QUIT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_QUIT)) +#define C_QUIT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_QUIT)) /* Consumer Help */ -#define C_HELP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_HELP)) +#define C_HELP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_HELP)) /* Consumer Media Select Tape */ -#define C_MEDIA_TAPE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TAPE)) +#define C_MEDIA_TAPE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_TAPE)) /* Consumer Media Select Cable */ -#define C_MEDIA_CABLE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_CABLE)) +#define C_MEDIA_CABLE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_CABLE)) /* Consumer Media Select Satellite */ -#define C_MEDIA_SATELLITE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_SATELLITE)) +#define C_MEDIA_SATELLITE \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_SATELLITE)) /* Consumer Media Select Home */ -#define C_MEDIA_HOME (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_HOME)) +#define C_MEDIA_HOME (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MEDIA_SELECT_HOME)) /* Consumer Channel Increment */ -#define C_CHANNEL_INC (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_CHANNEL_INCREMENT)) +#define C_CHANNEL_INC (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_CHANNEL_INCREMENT)) #define C_CHAN_INC (C_CHANNEL_INC) /* Consumer Channel Decrement */ -#define C_CHANNEL_DEC (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_CHANNEL_DECREMENT)) +#define C_CHANNEL_DEC (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_CHANNEL_DECREMENT)) #define C_CHAN_DEC (C_CHANNEL_DEC) /* Consumer VCR Plus */ -#define C_MEDIA_VCR_PLUS (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VCR_PLUS)) +#define C_MEDIA_VCR_PLUS (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VCR_PLUS)) /* Consumer Play */ -#define C_PLAY (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PLAY)) +#define C_PLAY (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PLAY)) /* Consumer Pause */ -#define C_PAUSE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PAUSE)) +#define C_PAUSE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PAUSE)) /* Consumer Record */ -#define C_RECORD (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RECORD)) +#define C_RECORD (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RECORD)) #define C_REC (C_RECORD) /* Consumer Fast Forward */ -#define C_FAST_FORWARD (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_FAST_FORWARD)) +#define C_FAST_FORWARD (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_FAST_FORWARD)) #define C_FF (C_FAST_FORWARD) /* Consumer Rewind */ -#define C_REWIND (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_REWIND)) +#define C_REWIND (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_REWIND)) #define C_RW (C_REWIND) /* Consumer Scan Next Track */ -#define C_NEXT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SCAN_NEXT_TRACK)) +#define C_NEXT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SCAN_NEXT_TRACK)) #define M_NEXT (C_NEXT) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Scan Previous Track */ -#define C_PREVIOUS (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SCAN_PREVIOUS_TRACK)) +#define C_PREVIOUS (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SCAN_PREVIOUS_TRACK)) #define C_PREV (C_PREVIOUS) #define M_PREV (C_PREVIOUS) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Stop */ -#define C_STOP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_STOP)) +#define C_STOP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_STOP)) #define M_STOP (C_STOP) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Eject */ -#define C_EJECT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_EJECT)) +#define C_EJECT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_EJECT)) #define M_EJCT (C_EJECT) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Random Play */ -#define C_RANDOM_PLAY (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RANDOM_PLAY)) +#define C_RANDOM_PLAY (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_RANDOM_PLAY)) #define C_SHUFFLE (C_RANDOM_PLAY) /* Consumer Repeat */ -#define C_REPEAT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_REPEAT)) +#define C_REPEAT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_REPEAT)) /* Consumer Slow Tracking */ -#define C_SLOW_TRACKING (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLOW_TRACKING)) +#define C_SLOW_TRACKING (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLOW_TRACKING)) #define C_SLOW2 (C_SLOW_TRACKING) /* Consumer Stop/Eject */ -#define C_STOP_EJECT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_STOP_EJECT)) +#define C_STOP_EJECT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_STOP_EJECT)) /* Consumer Play/Pause */ -#define C_PLAY_PAUSE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PLAY_PAUSE)) +#define C_PLAY_PAUSE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_PLAY_PAUSE)) #define C_PP (C_PLAY_PAUSE) #define M_PLAY (C_PLAY_PAUSE) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Voice Command */ -#define C_VOICE_COMMAND (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VOICE_COMMAND)) +#define C_VOICE_COMMAND (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VOICE_COMMAND)) /* Consumer Mute */ -#define C_MUTE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MUTE)) +#define C_MUTE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_MUTE)) #define M_MUTE (C_MUTE) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Bass Boost */ -#define C_BASS_BOOST (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_BASS_BOOST)) +#define C_BASS_BOOST (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_BASS_BOOST)) /* Consumer Volume Increment */ -#define C_VOLUME_UP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VOLUME_INCREMENT)) +#define C_VOLUME_UP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VOLUME_INCREMENT)) #define C_VOL_UP (C_VOLUME_UP) #define M_VOLU (C_VOLUME_UP) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Volume Decrement */ -#define C_VOLUME_DOWN (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VOLUME_DECREMENT)) +#define C_VOLUME_DOWN (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_VOLUME_DECREMENT)) #define C_VOL_DN (C_VOLUME_DOWN) #define M_VOLD (C_VOLUME_DOWN) // WARNING: DEPRECATED (DO NOT USE) /* Consumer Slow */ -#define C_SLOW (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLOW)) +#define C_SLOW (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_SLOW)) /* Consumer Alternate Audio Increment */ #define C_ALTERNATE_AUDIO_INCREMENT \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_ALTERNATE_AUDIO_INCREMENT)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_ALTERNATE_AUDIO_INCREMENT)) #define C_ALT_AUDIO_INC (C_ALTERNATE_AUDIO_INCREMENT) /* Consumer AL Consumer Control Configuration */ #define C_AL_CCC \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION)) /* Consumer AL Word Processor */ -#define C_AL_WORD (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_WORD_PROCESSOR)) +#define C_AL_WORD (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_WORD_PROCESSOR)) /* Consumer AL Text Editor */ -#define C_AL_TEXT_EDITOR (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_TEXT_EDITOR)) +#define C_AL_TEXT_EDITOR (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_TEXT_EDITOR)) /* Consumer AL Spreadsheet */ -#define C_AL_SPREADSHEET (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SPREADSHEET)) +#define C_AL_SPREADSHEET (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SPREADSHEET)) #define C_AL_SHEET (C_AL_SPREADSHEET) /* Consumer AL Graphics Editor */ -#define C_AL_GRAPHICS_EDITOR (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_GRAPHICS_EDITOR)) +#define C_AL_GRAPHICS_EDITOR \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_GRAPHICS_EDITOR)) /* Consumer AL Presentation App */ -#define C_AL_PRESENTATION (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_PRESENTATION_APP)) +#define C_AL_PRESENTATION \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_PRESENTATION_APP)) /* Consumer AL Database App */ -#define C_AL_DATABASE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_DATABASE_APP)) +#define C_AL_DATABASE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_DATABASE_APP)) #define C_AL_DB (C_AL_DATABASE) /* Consumer AL Email Reader */ -#define C_AL_EMAIL (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_EMAIL_READER)) +#define C_AL_EMAIL (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_EMAIL_READER)) #define C_AL_MAIL (C_AL_EMAIL) /* Consumer AL Newsreader */ -#define C_AL_NEWS (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_NEWSREADER)) +#define C_AL_NEWS (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_NEWSREADER)) /* Consumer AL Voicemail */ -#define C_AL_VOICEMAIL (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_VOICEMAIL)) +#define C_AL_VOICEMAIL (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_VOICEMAIL)) /* Consumer AL Contacts/Address Book */ -#define C_AL_CONTACTS (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CONTACTS_ADDRESS_BOOK)) +#define C_AL_CONTACTS \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CONTACTS_ADDRESS_BOOK)) #define C_AL_ADDRESS_BOOK (C_AL_CONTACTS) /* Consumer AL Calendar/Schedule */ -#define C_AL_CALENDAR (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CALENDAR_SCHEDULE)) +#define C_AL_CALENDAR (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CALENDAR_SCHEDULE)) #define C_AL_CAL (C_AL_CALENDAR) /* Consumer AL Task/Project Manager */ #define C_AL_TASK_MANAGER \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_TASK_PROJECT_MANAGER)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_TASK_PROJECT_MANAGER)) /* Consumer AL Log/Journal/Timecard */ -#define C_AL_JOURNAL (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_LOG_JOURNAL_TIMECARD)) +#define C_AL_JOURNAL (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_LOG_JOURNAL_TIMECARD)) /* Consumer AL Checkbook/Finance */ -#define C_AL_FINANCE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CHECKBOOK_FINANCE)) +#define C_AL_FINANCE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CHECKBOOK_FINANCE)) /* Consumer AL Calculator */ -#define C_AL_CALCULATOR (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CALCULATOR)) +#define C_AL_CALCULATOR (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CALCULATOR)) #define C_AL_CALC (C_AL_CALCULATOR) /* Consumer AL A/V Capture/Playback */ #define C_AL_AV_CAPTURE_PLAYBACK \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_A_V_CAPTURE_PLAYBACK)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_A_V_CAPTURE_PLAYBACK)) /* Consumer AL Local Machine Browser */ #define C_AL_MY_COMPUTER \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_LOCAL_MACHINE_BROWSER)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_LOCAL_MACHINE_BROWSER)) /* Consumer AL Internet Browser */ -#define C_AL_WWW (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_INTERNET_BROWSER)) +#define C_AL_WWW (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_INTERNET_BROWSER)) /* Consumer AL Network Chat */ -#define C_AL_NETWORK_CHAT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_NETWORK_CHAT)) +#define C_AL_NETWORK_CHAT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_NETWORK_CHAT)) #define C_AL_CHAT (C_AL_NETWORK_CHAT) /* Consumer AL Logoff */ -#define C_AL_LOGOFF (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_LOGOFF)) +#define C_AL_LOGOFF (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_LOGOFF)) /* Consumer AL Terminal Lock/Screensaver */ -#define C_AL_LOCK (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER)) +#define C_AL_LOCK \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER)) #define C_AL_SCREENSAVER (C_AL_LOCK) #define C_AL_COFFEE (C_AL_LOCK) /* Consumer AL Control Panel */ -#define C_AL_CONTROL_PANEL (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CONTROL_PANEL)) +#define C_AL_CONTROL_PANEL (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_CONTROL_PANEL)) /* Consumer AL Select Task/Application */ #define C_AL_SELECT_TASK \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SELECT_TASK_APPLICATION)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SELECT_TASK_APPLICATION)) /* Consumer AL Next Task/Application */ -#define C_AL_NEXT_TASK (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_NEXT_TASK_APPLICATION)) +#define C_AL_NEXT_TASK \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_NEXT_TASK_APPLICATION)) /* Consumer AL Previous Task/Application */ #define C_AL_PREVIOUS_TASK \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_PREVIOUS_TASK_APPLICATION)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_PREVIOUS_TASK_APPLICATION)) #define C_AL_PREV_TASK (C_AL_PREVIOUS_TASK) /* Consumer AL Integrated Help Center */ -#define C_AL_HELP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_INTEGRATED_HELP_CENTER)) +#define C_AL_HELP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_INTEGRATED_HELP_CENTER)) /* Consumer AL Documents */ -#define C_AL_DOCUMENTS (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_DOCUMENTS)) +#define C_AL_DOCUMENTS (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_DOCUMENTS)) #define C_AL_DOCS (C_AL_DOCUMENTS) /* Consumer AL Spell Check */ -#define C_AL_SPELLCHECK (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SPELL_CHECK)) +#define C_AL_SPELLCHECK (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SPELL_CHECK)) #define C_AL_SPELL (C_AL_SPELLCHECK) /* Consumer AL Keyboard Layout */ -#define C_AL_KEYBOARD_LAYOUT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_KEYBOARD_LAYOUT)) +#define C_AL_KEYBOARD_LAYOUT \ + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_KEYBOARD_LAYOUT)) /* Consumer AL Screen Saver */ -#define C_AL_SCREEN_SAVER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SCREEN_SAVER)) +#define C_AL_SCREEN_SAVER (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_SCREEN_SAVER)) /* Consumer AL File Browser */ -#define C_AL_FILE_BROWSER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_FILE_BROWSER)) +#define C_AL_FILE_BROWSER (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_FILE_BROWSER)) #define C_AL_FILES (C_AL_FILE_BROWSER) /* Consumer AL Image Browser */ -#define C_AL_IMAGE_BROWSER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_IMAGE_BROWSER)) +#define C_AL_IMAGE_BROWSER (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_IMAGE_BROWSER)) #define C_AL_IMAGES (C_AL_IMAGE_BROWSER) /* Consumer AL Audio Browser */ -#define C_AL_AUDIO_BROWSER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_AUDIO_BROWSER)) +#define C_AL_AUDIO_BROWSER (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_AUDIO_BROWSER)) #define C_AL_AUDIO (C_AL_AUDIO_BROWSER) #define C_AL_MUSIC (C_AL_AUDIO_BROWSER) /* Consumer AL Movie Browser */ -#define C_AL_MOVIE_BROWSER (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_MOVIE_BROWSER)) +#define C_AL_MOVIE_BROWSER (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_MOVIE_BROWSER)) #define C_AL_MOVIES (C_AL_MOVIE_BROWSER) /* Consumer AL Instant Messaging */ #define C_AL_INSTANT_MESSAGING \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_INSTANT_MESSAGING)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_INSTANT_MESSAGING)) #define C_AL_IM (C_AL_INSTANT_MESSAGING) /* Consumer AL OEM Features/Tips/Tutorial Browser */ #define C_AL_OEM_FEATURES \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL_BROWSER)) #define C_AL_TIPS (C_AL_OEM_FEATURES) #define C_AL_TUTORIAL (C_AL_OEM_FEATURES) /* Consumer AC New */ -#define C_AC_NEW (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_NEW)) +#define C_AC_NEW (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_NEW)) /* Consumer AC Open */ -#define C_AC_OPEN (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_OPEN)) +#define C_AC_OPEN (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_OPEN)) /* Consumer AC Close */ -#define C_AC_CLOSE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_CLOSE)) +#define C_AC_CLOSE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_CLOSE)) /* Consumer AC Exit */ -#define C_AC_EXIT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_EXIT)) +#define C_AC_EXIT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_EXIT)) /* Consumer AC Save */ -#define C_AC_SAVE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SAVE)) +#define C_AC_SAVE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SAVE)) /* Consumer AC Print */ -#define C_AC_PRINT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_PRINT)) +#define C_AC_PRINT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_PRINT)) /* Consumer AC Properties */ -#define C_AC_PROPERTIES (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_PROPERTIES)) +#define C_AC_PROPERTIES (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_PROPERTIES)) #define C_AC_PROPS (C_AC_PROPERTIES) /* Consumer AC Undo */ -#define C_AC_UNDO (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_UNDO)) +#define C_AC_UNDO (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_UNDO)) /* Consumer AC Copy */ -#define C_AC_COPY (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_COPY)) +#define C_AC_COPY (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_COPY)) /* Consumer AC Cut */ -#define C_AC_CUT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_CUT)) +#define C_AC_CUT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_CUT)) /* Consumer AC Paste */ -#define C_AC_PASTE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_PASTE)) +#define C_AC_PASTE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_PASTE)) /* Consumer AC Find */ -#define C_AC_FIND (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_FIND)) +#define C_AC_FIND (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_FIND)) /* Consumer AC Search */ -#define C_AC_SEARCH (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SEARCH)) +#define C_AC_SEARCH (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SEARCH)) /* Consumer AC Go To */ -#define C_AC_GOTO (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_GO_TO)) +#define C_AC_GOTO (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_GO_TO)) /* Consumer AC Home */ -#define C_AC_HOME (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_HOME)) +#define C_AC_HOME (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_HOME)) /* Consumer AC Back */ -#define C_AC_BACK (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_BACK)) +#define C_AC_BACK (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_BACK)) /* Consumer AC Forward */ -#define C_AC_FORWARD (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_FORWARD)) +#define C_AC_FORWARD (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_FORWARD)) /* Consumer AC Stop */ -#define C_AC_STOP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_STOP)) +#define C_AC_STOP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_STOP)) /* Consumer AC Refresh */ -#define C_AC_REFRESH (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_REFRESH)) +#define C_AC_REFRESH (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_REFRESH)) /* Consumer AC Bookmarks */ -#define C_AC_BOOKMARKS (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_BOOKMARKS)) +#define C_AC_BOOKMARKS (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_BOOKMARKS)) #define C_AC_FAVORITES (C_AC_BOOKMARKS) #define C_AC_FAVOURITES (C_AC_BOOKMARKS) /* Consumer AC Zoom In */ -#define C_AC_ZOOM_IN (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_ZOOM_IN)) +#define C_AC_ZOOM_IN (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_ZOOM_IN)) /* Consumer AC Zoom Out */ -#define C_AC_ZOOM_OUT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_ZOOM_OUT)) +#define C_AC_ZOOM_OUT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_ZOOM_OUT)) /* Consumer AC Zoom */ -#define C_AC_ZOOM (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_ZOOM)) +#define C_AC_ZOOM (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_ZOOM)) /* Consumer AC View Toggle */ -#define C_AC_VIEW_TOGGLE (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_VIEW_TOGGLE)) +#define C_AC_VIEW_TOGGLE (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_VIEW_TOGGLE)) /* Consumer AC Scroll Up */ -#define C_AC_SCROLL_UP (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SCROLL_UP)) +#define C_AC_SCROLL_UP (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SCROLL_UP)) /* Consumer AC Scroll Down */ -#define C_AC_SCROLL_DOWN (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SCROLL_DOWN)) +#define C_AC_SCROLL_DOWN (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SCROLL_DOWN)) /* Consumer AC Edit */ -#define C_AC_EDIT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_EDIT)) +#define C_AC_EDIT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_EDIT)) /* Consumer AC Cancel */ -#define C_AC_CANCEL (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_CANCEL)) +#define C_AC_CANCEL (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_CANCEL)) /* Consumer AC Insert Mode */ -#define C_AC_INSERT (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_INSERT_MODE)) +#define C_AC_INSERT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_INSERT_MODE)) #define C_AC_INS (C_AC_INSERT) /* Consumer AC Delete */ -#define C_AC_DEL (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_DELETE)) +#define C_AC_DEL (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_DELETE)) /* Consumer AC Redo/Repeat */ -#define C_AC_REDO (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_REDO_REPEAT)) +#define C_AC_REDO (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_REDO_REPEAT)) /* Consumer AC Reply */ -#define C_AC_REPLY (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_REPLY)) +#define C_AC_REPLY (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_REPLY)) /* Consumer AC Forward Msg */ -#define C_AC_FORWARD_MAIL (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_FORWARD_MSG)) +#define C_AC_FORWARD_MAIL (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_FORWARD_MSG)) /* Consumer AC Send */ -#define C_AC_SEND (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SEND)) +#define C_AC_SEND (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_SEND)) /* Consumer AC Desktop Show All Windows */ #define C_AC_DESKTOP_SHOW_ALL_WINDOWS \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_AC_DESKTOP_SHOW_ALL_WINDOWS)) /* Consumer Keyboard Input Assist Previous */ #define C_KEYBOARD_INPUT_ASSIST_PREVIOUS \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS)) #define C_KBIA_PREV (C_KEYBOARD_INPUT_ASSIST_PREVIOUS) /* Consumer Keyboard Input Assist Next */ #define C_KEYBOARD_INPUT_ASSIST_NEXT \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT)) #define C_KBIA_NEXT (C_KEYBOARD_INPUT_ASSIST_NEXT) /* Consumer Keyboard Input Assist Previous Group */ #define C_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP)) #define C_KBIA_PREV_GRP (C_KEYBOARD_INPUT_ASSIST_PREVIOUS_GROUP) /* Consumer Keyboard Input Assist Next Group */ #define C_KEYBOARD_INPUT_ASSIST_NEXT_GROUP \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_NEXT_GROUP)) #define C_KBIA_NEXT_GRP (C_KEYBOARD_INPUT_ASSIST_NEXT_GROUP) /* Consumer Keyboard Input Assist Accept */ #define C_KEYBOARD_INPUT_ASSIST_ACCEPT \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_ACCEPT)) #define C_KBIA_ACCEPT (C_KEYBOARD_INPUT_ASSIST_ACCEPT) /* Consumer Keyboard Input Assist Cancel */ #define C_KEYBOARD_INPUT_ASSIST_CANCEL \ - (HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL)) + (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL)) #define C_KBIA_CANCEL (C_KEYBOARD_INPUT_ASSIST_CANCEL) diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 466bbd76..8e60014f 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -23,8 +23,8 @@ ZMK_EVENT_DECLARE(zmk_keycode_state_changed); static inline struct zmk_keycode_state_changed_event * zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp) { - uint16_t page = HID_USAGE_PAGE(encoded) & 0xFF; - uint16_t id = HID_USAGE_ID(encoded); + uint16_t page = ZMK_HID_USAGE_PAGE(encoded) & 0xFF; + uint16_t id = ZMK_HID_USAGE_ID(encoded); uint8_t implicit_modifiers = 0x00; uint8_t explicit_modifiers = 0x00; diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index e23caff9..61c5fa80 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -18,173 +18,77 @@ #define COLLECTION_REPORT 0x03 static const uint8_t zmk_hid_report_desc[] = { - /* USAGE_PAGE (Generic Desktop) */ - HID_GI_USAGE_PAGE, - HID_USAGE_GD, - /* USAGE (Keyboard) */ - HID_LI_USAGE, - HID_USAGE_GD_KEYBOARD, - /* COLLECTION (Application) */ - HID_MI_COLLECTION, - COLLECTION_APPLICATION, - /* REPORT ID (1) */ - HID_GI_REPORT_ID, - 0x01, - /* USAGE_PAGE (Keyboard/Keypad) */ - HID_GI_USAGE_PAGE, - HID_USAGE_KEY, - /* USAGE_MINIMUM (Keyboard LeftControl) */ - HID_LI_USAGE_MIN(1), - HID_USAGE_KEY_KEYBOARD_LEFTCONTROL, - /* USAGE_MAXIMUM (Keyboard Right GUI) */ - HID_LI_USAGE_MAX(1), - HID_USAGE_KEY_KEYBOARD_RIGHT_GUI, - /* LOGICAL_MINIMUM (0) */ - HID_GI_LOGICAL_MIN(1), - 0x00, - /* LOGICAL_MAXIMUM (1) */ - HID_GI_LOGICAL_MAX(1), - 0x01, + HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP), + HID_USAGE(HID_USAGE_GD_KEYBOARD), + HID_COLLECTION(HID_COLLECTION_APPLICATION), + HID_REPORT_ID(0x01), + HID_USAGE_PAGE(HID_USAGE_KEY), + HID_USAGE_MIN8(HID_USAGE_KEY_KEYBOARD_LEFTCONTROL), + HID_USAGE_MAX8(HID_USAGE_KEY_KEYBOARD_RIGHT_GUI), + HID_LOGICAL_MIN8(0x00), + HID_LOGICAL_MAX8(0x01), - /* REPORT_SIZE (1) */ - HID_GI_REPORT_SIZE, - 0x01, - /* REPORT_COUNT (8) */ - HID_GI_REPORT_COUNT, - 0x08, + HID_REPORT_SIZE(0x01), + HID_REPORT_COUNT(0x08), /* INPUT (Data,Var,Abs) */ - HID_MI_INPUT, - 0x02, + HID_INPUT(0x02), - /* USAGE_PAGE (Keyboard/Keypad) */ - HID_GI_USAGE_PAGE, - HID_USAGE_KEY, - /* REPORT_SIZE (8) */ - HID_GI_REPORT_SIZE, - 0x08, - /* REPORT_COUNT (1) */ - HID_GI_REPORT_COUNT, - 0x01, + HID_USAGE_PAGE(HID_USAGE_KEY), + HID_REPORT_SIZE(0x08), + HID_REPORT_COUNT(0x01), /* INPUT (Cnst,Var,Abs) */ - HID_MI_INPUT, - 0x03, + HID_INPUT(0x03), - /* USAGE_PAGE (Keyboard/Keypad) */ - HID_GI_USAGE_PAGE, - HID_USAGE_KEY, + HID_USAGE_PAGE(HID_USAGE_KEY), #if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) - /* LOGICAL_MINIMUM (0) */ - HID_GI_LOGICAL_MIN(1), - 0x00, - /* LOGICAL_MAXIMUM (1) */ - HID_GI_LOGICAL_MAX(1), - 0x01, - /* USAGE_MINIMUM (Reserved) */ - HID_LI_USAGE_MIN(1), - 0x00, - /* USAGE_MAXIMUM (Keyboard Application) */ - HID_LI_USAGE_MAX(1), - ZMK_HID_KEYBOARD_NKRO_MAX_USAGE, - /* REPORT_SIZE (8) */ - HID_GI_REPORT_SIZE, - 0x01, - /* REPORT_COUNT (6) */ - HID_GI_REPORT_COUNT, - ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1, + HID_LOGICAL_MIN8(0x00), + HID_LOGICAL_MAX8(0x01), + HID_USAGE_MIN8(0x00), + HID_USAGE_MAX8(ZMK_HID_KEYBOARD_NKRO_MAX_USAGE), + HID_REPORT_SIZE(0x01), + HID_REPORT_COUNT(ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1), /* INPUT (Data,Ary,Abs) */ - HID_MI_INPUT, - 0x02, + HID_INPUT(0x02), #elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) - /* LOGICAL_MINIMUM (0) */ - HID_GI_LOGICAL_MIN(1), - 0x00, - /* LOGICAL_MAXIMUM (0xFF) */ - HID_GI_LOGICAL_MAX(1), - 0xFF, - /* USAGE_MINIMUM (Reserved) */ - HID_LI_USAGE_MIN(1), - 0x00, - /* USAGE_MAXIMUM (Keyboard Application) */ - HID_LI_USAGE_MAX(1), - 0xFF, - /* REPORT_SIZE (1) */ - HID_GI_REPORT_SIZE, - 0x08, - /* REPORT_COUNT (CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE) */ - HID_GI_REPORT_COUNT, - CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE, + HID_LOGICAL_MIN8(0x00), + HID_LOGICAL_MAX8(0xFF), + HID_USAGE_MIN8(0x00), + HID_USAGE_MAX8(0xFF), + HID_REPORT_SIZE(0x08), + HID_REPORT_COUNT(CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE), /* INPUT (Data,Ary,Abs) */ - HID_MI_INPUT, - 0x00, + HID_INPUT(0x00), #else #error "A proper HID report type must be selected" #endif - /* END_COLLECTION */ - HID_MI_COLLECTION_END, - /* USAGE_PAGE (Consumer) */ - HID_GI_USAGE_PAGE, - HID_USAGE_CONSUMER, - /* USAGE (Consumer Control) */ - HID_LI_USAGE, - HID_USAGE_CONSUMER_CONSUMER_CONTROL, - /* Consumer Page */ - HID_MI_COLLECTION, - COLLECTION_APPLICATION, - /* REPORT ID (1) */ - HID_GI_REPORT_ID, - 0x02, - /* USAGE_PAGE (Consumer) */ - HID_GI_USAGE_PAGE, - HID_USAGE_CONSUMER, + HID_END_COLLECTION, + HID_USAGE_PAGE(HID_USAGE_CONSUMER), + HID_USAGE(HID_USAGE_CONSUMER_CONSUMER_CONTROL), + HID_COLLECTION(HID_COLLECTION_APPLICATION), + HID_REPORT_ID(0x02), + HID_USAGE_PAGE(HID_USAGE_CONSUMER), #if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC) - /* LOGICAL_MINIMUM (0) */ - HID_GI_LOGICAL_MIN(1), - 0x00, - /* LOGICAL_MAXIMUM (0x00FF) - little endian, and requires two bytes because logical max is - signed */ - HID_GI_LOGICAL_MAX(2), - 0xFF, - 0x00, - HID_LI_USAGE_MIN(1), - 0x00, - /* USAGE_MAXIMUM (0xFF) */ - HID_LI_USAGE_MAX(1), - 0xFF, - /* INPUT (Data,Ary,Abs) */ - /* REPORT_SIZE (8) */ - HID_GI_REPORT_SIZE, - 0x08, + HID_LOGICAL_MIN8(0x00), + HID_LOGICAL_MAX16(0xFF, 0x00), + HID_USAGE_MIN8(0x00), + HID_USAGE_MAX8(0xFF), + HID_REPORT_SIZE(0x08), #elif IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL) - /* LOGICAL_MINIMUM (0) */ - HID_GI_LOGICAL_MIN(1), - 0x00, - /* LOGICAL_MAXIMUM (0xFFFF) */ - HID_GI_LOGICAL_MAX(2), - 0xFF, - 0xFF, - HID_LI_USAGE_MIN(1), - 0x00, - /* USAGE_MAXIMUM (0xFFFF) */ - HID_LI_USAGE_MAX(2), - 0xFF, - 0xFF, - /* INPUT (Data,Ary,Abs) */ - /* REPORT_SIZE (16) */ - HID_GI_REPORT_SIZE, - 0x10, + HID_LOGICAL_MIN8(0x00), + HID_LOGICAL_MAX16(0xFF, 0xFF), + HID_USAGE_MIN8(0x00), + HID_USAGE_MAX16(0xFF, 0xFF), + HID_REPORT_SIZE(0x10), #else #error "A proper consumer HID report usage range must be selected" #endif - /* REPORT_COUNT (CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE) */ - HID_GI_REPORT_COUNT, - CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE, - HID_MI_INPUT, - 0x00, - /* END COLLECTION */ - HID_MI_COLLECTION_END, + HID_REPORT_COUNT(CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE), + /* INPUT (Data,Ary,Abs) */ + HID_INPUT(0x00), + HID_END_COLLECTION, }; // struct zmk_hid_boot_report diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 45e3d9d9..61f2efca 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -162,8 +162,8 @@ static int behavior_caps_word_init(const struct device *dev) { #define CAPS_WORD_LABEL(i, _n) DT_INST_LABEL(i) #define PARSE_BREAK(i) \ - {.page = (HID_USAGE_PAGE(i) & 0xFF), \ - .id = HID_USAGE_ID(i), \ + {.page = (ZMK_HID_USAGE_PAGE(i) & 0xFF), \ + .id = ZMK_HID_USAGE_ID(i), \ .implicit_modifiers = SELECT_MODS(i)}, #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 7909e1af..5b496c0f 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -198,8 +198,8 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { } if (strcmp(sticky_key->config->behavior.behavior_dev, "KEY_PRESS") == 0 && - HID_USAGE_ID(sticky_key->param1) == ev->keycode && - (HID_USAGE_PAGE(sticky_key->param1) & 0xFF) == ev->usage_page && + ZMK_HID_USAGE_ID(sticky_key->param1) == ev->keycode && + (ZMK_HID_USAGE_PAGE(sticky_key->param1) & 0xFF) == ev->usage_page && SELECT_MODS(sticky_key->param1) == ev->implicit_modifiers) { // don't catch key down events generated by the sticky key behavior itself continue; From 3528e1b49775f1ed0a59847640f6710e18d351f8 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 04:18:03 +0000 Subject: [PATCH 003/494] refactor: Move to newer API for IO channels. See: https://docs.zephyrproject.org/latest/releases/release-notes-2.6.html#api-changes --- app/drivers/sensor/battery/battery_voltage_divider.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index 8981fb3a..484ca4fc 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -18,7 +18,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct io_channel_config { - const char *label; uint8_t channel; }; @@ -119,10 +118,8 @@ static int bvd_init(const struct device *dev) { struct bvd_data *drv_data = dev->data; const struct bvd_config *drv_cfg = dev->config; - drv_data->adc = device_get_binding(drv_cfg->io_channel.label); - if (drv_data->adc == NULL) { - LOG_ERR("ADC %s failed to retrieve", drv_cfg->io_channel.label); + LOG_ERR("ADC failed to retrieve ADC driver"); return -ENODEV; } @@ -170,12 +167,12 @@ static int bvd_init(const struct device *dev) { return rc; } -static struct bvd_data bvd_data; +static struct bvd_data bvd_data = {.adc = DEVICE_DT_GET(DT_IO_CHANNELS_CTLR(DT_DRV_INST(0)))}; + static const struct bvd_config bvd_cfg = { .io_channel = { - DT_INST_IO_CHANNELS_LABEL(0), - DT_INST_IO_CHANNELS_INPUT(0), + DT_IO_CHANNELS_INPUT(DT_DRV_INST(0)), }, #if DT_INST_NODE_HAS_PROP(0, power_gpios) .power_gpios = From 6287819fccf0d208822f21fd14204e649149f304 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 04:21:30 +0000 Subject: [PATCH 004/494] refactor: Move to USB_DEVICE_STACK symbol. See: https://docs.zephyrproject.org/latest/releases/release-notes-2.7.html#changes-in-this-release --- app/CMakeLists.txt | 4 ++-- app/Kconfig | 4 ++-- app/boards/arm/bluemicro840/Kconfig.defconfig | 7 ++----- app/boards/arm/nice60/Kconfig.defconfig | 7 ++----- app/boards/arm/nice_nano/Kconfig.defconfig | 7 ++----- app/boards/arm/nrf52840_m2/Kconfig.defconfig | 7 ++----- app/boards/arm/nrfmicro/Kconfig.defconfig | 7 ++----- app/src/display/widgets/battery_status.c | 14 +++++++------- app/src/display/widgets/output_status.c | 2 +- app/src/power.c | 4 ++-- 10 files changed, 24 insertions(+), 39 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 0d547fbe..5f8dace8 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -42,7 +42,7 @@ target_sources(app PRIVATE src/events/sensor_event.c) target_sources_ifdef(CONFIG_ZMK_WPM app PRIVATE src/events/wpm_state_changed.c) target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/events/ble_active_profile_changed.c) target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/events/battery_state_changed.c) -target_sources_ifdef(CONFIG_USB app PRIVATE src/events/usb_conn_state_changed.c) +target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/events/usb_conn_state_changed.c) target_sources(app PRIVATE src/behaviors/behavior_reset.c) target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/behaviors/behavior_ext_power.c) if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL) @@ -78,7 +78,7 @@ endif() if (CONFIG_ZMK_SPLIT_BLE AND CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL) target_sources(app PRIVATE src/split/bluetooth/central.c) endif() -target_sources_ifdef(CONFIG_USB app PRIVATE src/usb.c) +target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c) target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/hog.c) target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/backlight.c) diff --git a/app/Kconfig b/app/Kconfig index 81637336..948eaeff 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -422,7 +422,7 @@ menu "Advanced" menu "Initialization Priorities" -if USB +if USB_DEVICE_STACK config ZMK_USB_INIT_PRIORITY int "USB Init Priority" @@ -526,7 +526,7 @@ config KERNEL_BIN_NAME config REBOOT default y -config USB +config USB_DEVICE_STACK default y if HAS_HW_NRF_USBD config ZMK_WPM diff --git a/app/boards/arm/bluemicro840/Kconfig.defconfig b/app/boards/arm/bluemicro840/Kconfig.defconfig index 2b55e17c..bc68f311 100644 --- a/app/boards/arm/bluemicro840/Kconfig.defconfig +++ b/app/boards/arm/bluemicro840/Kconfig.defconfig @@ -8,15 +8,12 @@ if BOARD_BLUEMICRO840_V1 config BOARD default "bluemicro840_v1" -if USB +if USB_DEVICE_STACK config USB_NRFX default y -config USB_DEVICE_STACK - default y - -endif # USB +endif # USB_DEVICE_STACK config BT_CTLR default BT diff --git a/app/boards/arm/nice60/Kconfig.defconfig b/app/boards/arm/nice60/Kconfig.defconfig index 81a7c035..42d417ab 100644 --- a/app/boards/arm/nice60/Kconfig.defconfig +++ b/app/boards/arm/nice60/Kconfig.defconfig @@ -6,15 +6,12 @@ if BOARD_NICE60 config ZMK_KEYBOARD_NAME default "nice!60" -if USB +if USB_DEVICE_STACK config USB_NRFX default y -config USB_DEVICE_STACK - default y - -endif # USB +endif # USB_DEVICE_STACK config BT_CTLR default BT diff --git a/app/boards/arm/nice_nano/Kconfig.defconfig b/app/boards/arm/nice_nano/Kconfig.defconfig index 876002bf..24571653 100644 --- a/app/boards/arm/nice_nano/Kconfig.defconfig +++ b/app/boards/arm/nice_nano/Kconfig.defconfig @@ -6,15 +6,12 @@ if BOARD_NICE_NANO || BOARD_NICE_NANO_V2 config BOARD default "nice_nano" -if USB +if USB_DEVICE_STACK config USB_NRFX default y -config USB_DEVICE_STACK - default y - -endif # USB +endif # USB_DEVICE_STACK config BT_CTLR default BT diff --git a/app/boards/arm/nrf52840_m2/Kconfig.defconfig b/app/boards/arm/nrf52840_m2/Kconfig.defconfig index f3e1f0eb..4e1679ba 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig.defconfig @@ -6,15 +6,12 @@ if BOARD_NRF52840_M2 config BOARD default "nrf52480_m2" -if USB +if USB_DEVICE_STACK config USB_NRFX default y -config USB_DEVICE_STACK - default y - -endif # USB +endif # USB_DEVICE_STACK config BT_CTLR default BT diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig index a3c02c22..754a430e 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -8,15 +8,12 @@ if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 config BOARD default "nrfmicro" -if USB +if USB_DEVICE_STACK config USB_NRFX default y -config USB_DEVICE_STACK - default y - -endif # USB +endif # USB_DEVICE_STACK config BT_CTLR default BT diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 362bdaa2..d74cc8ed 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -21,7 +21,7 @@ static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct battery_status_state { uint8_t level; -#if IS_ENABLED(CONFIG_USB) +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) bool usb_present; #endif }; @@ -31,11 +31,11 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat uint8_t level = state.level; -#if IS_ENABLED(CONFIG_USB) +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) if (state.usb_present) { strcpy(text, LV_SYMBOL_CHARGE); } -#endif /* IS_ENABLED(CONFIG_USB) */ +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ if (level > 95) { strcat(text, LV_SYMBOL_BATTERY_FULL); @@ -59,9 +59,9 @@ void battery_status_update_cb(struct battery_status_state state) { static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { return (struct battery_status_state) { .level = bt_bas_get_battery_level(), -#if IS_ENABLED(CONFIG_USB) +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) .usb_present = zmk_usb_is_powered(), -#endif /* IS_ENABLED(CONFIG_USB) */ +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ }; } @@ -69,9 +69,9 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, battery_status_update_cb, battery_status_get_state) ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); -#if IS_ENABLED(CONFIG_USB) +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); -#endif /* IS_ENABLED(CONFIG_USB) */ +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { widget->obj = lv_label_create(parent, NULL); diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 89993c69..fe99ac96 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -73,7 +73,7 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, output_status_update_cb, get_state) ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); -#if defined(CONFIG_USB) +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); #endif #if defined(CONFIG_ZMK_BLE) diff --git a/app/src/power.c b/app/src/power.c index 47ef3a3b..1803f62c 100644 --- a/app/src/power.c +++ b/app/src/power.c @@ -16,11 +16,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include bool is_usb_power_present() { -#ifdef CONFIG_USB +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) return zmk_usb_is_powered(); #else return false; -#endif /* CONFIG_USB */ +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ } struct pm_state_info pm_policy_next_state(int32_t ticks) { From 79ab60dfe588527beaa1c32e4cc1a8ab83774d97 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 04:22:46 +0000 Subject: [PATCH 005/494] refactor: Move to new PM API/Kconfig settings. --- app/CMakeLists.txt | 1 - app/Kconfig | 4 ---- app/src/activity.c | 16 ++++++++++++++-- app/src/power.c | 34 ---------------------------------- 4 files changed, 14 insertions(+), 41 deletions(-) delete mode 100644 app/src/power.c diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 5f8dace8..b760389f 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -22,7 +22,6 @@ zephyr_linker_sources(RODATA include/linker/zmk-events.ld) # Add your source file to the "app" target. This must come after # find_package(Zephyr) which defines the target. target_include_directories(app PRIVATE include) -target_sources_ifdef(CONFIG_ZMK_SLEEP app PRIVATE src/power.c) target_sources(app PRIVATE src/stdlib.c) target_sources(app PRIVATE src/activity.c) target_sources(app PRIVATE src/kscan.c) diff --git a/app/Kconfig b/app/Kconfig index 948eaeff..8be741ba 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -372,10 +372,6 @@ config ZMK_SLEEP if ZMK_SLEEP -choice SYS_PM_POLICY - default PM_POLICY_APP -endchoice - config PM_DEVICE default y diff --git a/app/src/activity.c b/app/src/activity.c index f31e608d..1fa75eb5 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include @@ -20,6 +20,18 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +#include +#endif + +bool is_usb_power_present() { +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + return zmk_usb_is_powered(); +#else + return false; +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ +} + static enum zmk_activity_state activity_state; static uint32_t activity_last_uptime; @@ -55,7 +67,7 @@ void activity_work_handler(struct k_work *work) { int32_t current = k_uptime_get(); int32_t inactive_time = current - activity_last_uptime; #if IS_ENABLED(CONFIG_ZMK_SLEEP) - if (inactive_time > MAX_SLEEP_MS) { + if (inactive_time > MAX_SLEEP_MS && !is_usb_power_present()) { // Put devices in low power mode before sleeping pm_power_state_force((struct pm_state_info){PM_STATE_STANDBY, 0, 0}); set_state(ZMK_ACTIVITY_SLEEP); diff --git a/app/src/power.c b/app/src/power.c deleted file mode 100644 index 1803f62c..00000000 --- a/app/src/power.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include - -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#include -#include - -bool is_usb_power_present() { -#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) - return zmk_usb_is_powered(); -#else - return false; -#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ -} - -struct pm_state_info pm_policy_next_state(int32_t ticks) { - if (zmk_activity_get_state() == ZMK_ACTIVITY_SLEEP && !is_usb_power_present()) { - return (struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}; - } - - return (struct pm_state_info){PM_STATE_ACTIVE, 0, 0}; -} - -__weak bool pm_policy_low_power_devices(enum pm_state state) { return pm_is_sleep_state(state); } From 2c5d5fde51fd392be283770725f78b10c67753f2 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 04:23:17 +0000 Subject: [PATCH 006/494] refactor: `k_work_queue` API updates. --- app/src/behaviors/behavior_hold_tap.c | 8 ++++---- app/src/behaviors/behavior_sticky_key.c | 10 +++++----- app/src/combo.c | 2 +- app/src/display/main.c | 6 +++--- app/src/hog.c | 5 +++-- app/src/split/bluetooth/central.c | 6 +++--- app/src/split/bluetooth/service.c | 6 ++++-- 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 548d6ef8..3bb7539c 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -71,7 +71,7 @@ struct active_hold_tap { int64_t timestamp; enum status status; const struct behavior_hold_tap_config *config; - struct k_delayed_work work; + struct k_work_delayable work; bool work_is_cancelled; // initialized to -1, which is to be interpreted as "no other key has been pressed yet" @@ -522,7 +522,7 @@ static int on_hold_tap_binding_pressed(struct zmk_behavior_binding *binding, // if this behavior was queued we have to adjust the timer to only // wait for the remaining time. int32_t tapping_term_ms_left = (hold_tap->timestamp + cfg->tapping_term_ms) - k_uptime_get(); - k_delayed_work_submit(&hold_tap->work, K_MSEC(tapping_term_ms_left)); + k_work_schedule(&hold_tap->work, K_MSEC(tapping_term_ms_left)); return ZMK_BEHAVIOR_OPAQUE; } @@ -537,7 +537,7 @@ static int on_hold_tap_binding_released(struct zmk_behavior_binding *binding, // If these events were queued, the timer event may be queued too late or not at all. // We insert a timer event before the TH_KEY_UP event to verify. - int work_cancel_result = k_delayed_work_cancel(&hold_tap->work); + int work_cancel_result = k_work_cancel_delayable(&hold_tap->work); if (event.timestamp > (hold_tap->timestamp + hold_tap->config->tapping_term_ms)) { decide_hold_tap(hold_tap, HT_TIMER_EVENT); } @@ -666,7 +666,7 @@ static int behavior_hold_tap_init(const struct device *dev) { if (init_first_run) { for (int i = 0; i < ZMK_BHV_HOLD_TAP_MAX_HELD; i++) { - k_delayed_work_init(&active_hold_taps[i].work, behavior_hold_tap_timer_work_handler); + k_work_init_delayable(&active_hold_taps[i].work, behavior_hold_tap_timer_work_handler); active_hold_taps[i].position = ZMK_BHV_HOLD_TAP_POSITION_NOT_USED; } } diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 5b496c0f..aa069a35 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -44,7 +44,7 @@ struct active_sticky_key { bool timer_started; bool timer_cancelled; int64_t release_at; - struct k_delayed_work release_timer; + struct k_work_delayable release_timer; // usage page and keycode for the key that is being modified by this sticky key uint8_t modified_key_usage_page; uint32_t modified_key_keycode; @@ -119,7 +119,7 @@ static inline int release_sticky_key_behavior(struct active_sticky_key *sticky_k } static int stop_timer(struct active_sticky_key *sticky_key) { - int timer_cancel_result = k_delayed_work_cancel(&sticky_key->release_timer); + int timer_cancel_result = k_work_cancel_delayable(&sticky_key->release_timer); if (timer_cancel_result == -EINPROGRESS) { // too late to cancel, we'll let the timer handler clear up. sticky_key->timer_cancelled = true; @@ -168,7 +168,7 @@ static int on_sticky_key_binding_released(struct zmk_behavior_binding *binding, // adjust timer in case this behavior was queued by a hold-tap int32_t ms_left = sticky_key->release_at - k_uptime_get(); if (ms_left > 0) { - k_delayed_work_submit(&sticky_key->release_timer, K_MSEC(ms_left)); + k_work_schedule(&sticky_key->release_timer, K_MSEC(ms_left)); } return ZMK_BEHAVIOR_OPAQUE; } @@ -268,8 +268,8 @@ static int behavior_sticky_key_init(const struct device *dev) { static bool init_first_run = true; if (init_first_run) { for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { - k_delayed_work_init(&active_sticky_keys[i].release_timer, - behavior_sticky_key_timer_handler); + k_work_init_delayable(&active_sticky_keys[i].release_timer, + behavior_sticky_key_timer_handler); active_sticky_keys[i].position = ZMK_BHV_STICKY_KEY_POSITION_FREE; } } diff --git a/app/src/combo.c b/app/src/combo.c index 2479057e..13ed1709 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -389,7 +389,7 @@ static void update_timeout_task() { k_work_cancel_delayable(&timeout_task); return; } - if (k_work_schedule(&timeout_task, K_MSEC(first_timeout - k_uptime_get())) == 0) { + if (k_work_schedule(&timeout_task, K_MSEC(first_timeout - k_uptime_get())) >= 0) { timeout_task_timeout_at = first_timeout; } } diff --git a/app/src/display/main.c b/app/src/display/main.c index 57fab2b0..5dfad910 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -95,9 +95,9 @@ int zmk_display_init() { } #if IS_ENABLED(CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED) - k_work_q_start(&display_work_q, display_work_stack_area, - K_THREAD_STACK_SIZEOF(display_work_stack_area), - CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY); + k_work_queue_start(&display_work_q, display_work_stack_area, + K_THREAD_STACK_SIZEOF(display_work_stack_area), + CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_PRIORITY, NULL); #endif screen = zmk_display_status_screen(); diff --git a/app/src/hog.c b/app/src/hog.c index e8aceca3..3dd3e874 100644 --- a/app/src/hog.c +++ b/app/src/hog.c @@ -262,8 +262,9 @@ int zmk_hog_send_consumer_report(struct zmk_hid_consumer_report_body *report) { }; int zmk_hog_init(const struct device *_arg) { - k_work_q_start(&hog_work_q, hog_q_stack, K_THREAD_STACK_SIZEOF(hog_q_stack), - CONFIG_ZMK_BLE_THREAD_PRIORITY); + static const struct k_work_queue_config queue_config = {.name = "HID Over GATT Send Work"}; + k_work_queue_start(&hog_work_q, hog_q_stack, K_THREAD_STACK_SIZEOF(hog_q_stack), + CONFIG_ZMK_BLE_THREAD_PRIORITY, &queue_config); return 0; } diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 8a0e79ea..07ab35a0 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -562,9 +562,9 @@ int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *bi } int zmk_split_bt_central_init(const struct device *_arg) { - k_work_q_start(&split_central_split_run_q, split_central_split_run_q_stack, - K_THREAD_STACK_SIZEOF(split_central_split_run_q_stack), - CONFIG_ZMK_BLE_THREAD_PRIORITY); + k_work_queue_start(&split_central_split_run_q, split_central_split_run_q_stack, + K_THREAD_STACK_SIZEOF(split_central_split_run_q_stack), + CONFIG_ZMK_BLE_THREAD_PRIORITY, NULL); bt_conn_cb_register(&conn_callbacks); return start_scan(); diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index 7de78506..5da5401d 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -152,8 +152,10 @@ int zmk_split_bt_position_released(uint8_t position) { } int service_init(const struct device *_arg) { - k_work_q_start(&service_work_q, service_q_stack, K_THREAD_STACK_SIZEOF(service_q_stack), - CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY); + static const struct k_work_queue_config queue_config = { + .name = "Split Peripheral Notification Queue"}; + k_work_queue_start(&service_work_q, service_q_stack, K_THREAD_STACK_SIZEOF(service_q_stack), + CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY, &queue_config); return 0; } From c5ab8a9444a4ab0170887d776c1b5c601ce776fa Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 04:23:50 +0000 Subject: [PATCH 007/494] refactor: Move the DT based CDC ACM setup. --- app/Kconfig | 9 --------- app/boards/arm/bdn9/bdn9_rev2.dts | 5 +++++ app/boards/arm/bluemicro840/bluemicro840_v1.dts | 5 +++++ app/boards/arm/bt60/bt60.dtsi | 5 +++++ app/boards/arm/dz60rgb/dz60rgb_rev1.dts | 5 +++++ app/boards/arm/ferris/ferris_rev02.dts | 5 +++++ app/boards/arm/mikoto/mikoto_520.dts | 5 +++++ app/boards/arm/nice60/nice60.dts | 5 +++++ app/boards/arm/nice_nano/nice_nano.dtsi | 7 ++++++- app/boards/arm/nrf52840_m2/nrf52840_m2.dts | 5 +++++ app/boards/arm/nrfmicro/nrfmicro_11.dts | 5 +++++ app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts | 5 +++++ app/boards/arm/nrfmicro/nrfmicro_13.dts | 5 +++++ app/boards/arm/planck/planck_rev6.dts | 7 ++++++- app/boards/arm/s40nc/s40nc.dts | 5 +++++ 15 files changed, 72 insertions(+), 11 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 8be741ba..b60999ba 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -477,15 +477,6 @@ config ZMK_LOG_LEVEL config USB_CDC_ACM_RINGBUF_SIZE default 1024 -config USB_CDC_ACM_DEVICE_NAME - default "CDC_ACM" - -config USB_CDC_ACM_DEVICE_COUNT - default 1 - -config UART_CONSOLE_ON_DEV_NAME - default "CDC_ACM_0" - config LOG_BUFFER_SIZE default 8192 diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index 43854a16..c005be17 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -14,6 +14,7 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan; /* TODO: Enable once the GPIO bitbanging driver supports STM32 zmk,underglow = &led_strip; @@ -82,6 +83,10 @@ &usb { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index 933df570..7f2db85b 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { @@ -73,6 +74,10 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/arm/bt60/bt60.dtsi b/app/boards/arm/bt60/bt60.dtsi index d5109e76..e684bc1d 100644 --- a/app/boards/arm/bt60/bt60.dtsi +++ b/app/boards/arm/bt60/bt60.dtsi @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -84,6 +85,10 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts index 1e2755d8..e2730d21 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts @@ -16,6 +16,7 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -67,6 +68,10 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC( &usb { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 848760fa..45c57dff 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -17,6 +17,7 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan; zmk,matrix_transform = &transform; /* TODO: Enable once we support the IC for underglow @@ -118,6 +119,10 @@ &rtc { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index de831c54..5ce17640 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { @@ -72,6 +73,10 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index f50f94a3..20f2a1a7 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; zmk,underglow = &led_strip; @@ -128,6 +129,10 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index 45f0e31d..52b92612 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -15,6 +15,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { @@ -56,13 +57,17 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { /* * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + * http: //docs.zephyrproject.org/latest/devices/dts/flash_partitions.html */ partitions { compatible = "fixed-partitions"; diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts index 6b613a1c..5ea852e9 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -15,6 +15,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { @@ -54,6 +55,10 @@ &usbd { compatible = "nordic,nrf-usbd"; status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 0dd8e8eb..82951b5f 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { @@ -59,6 +60,10 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index deea41fc..fdfba507 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { @@ -59,6 +60,10 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index bb40f3d0..d60417fd 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; }; leds { @@ -71,6 +72,10 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/arm/planck/planck_rev6.dts b/app/boards/arm/planck/planck_rev6.dts index 27d0dafc..ea45f33b 100644 --- a/app/boards/arm/planck/planck_rev6.dts +++ b/app/boards/arm/planck/planck_rev6.dts @@ -15,8 +15,9 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan0; - zmk,matrix_transform = &layout_grid_transform; + zmk,matrix_transform = &layout_grid_transform; }; kscan0: kscan { @@ -83,6 +84,10 @@ layout_2x2u_transform: &usb { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { diff --git a/app/boards/arm/s40nc/s40nc.dts b/app/boards/arm/s40nc/s40nc.dts index 58e0c2de..67a3c293 100644 --- a/app/boards/arm/s40nc/s40nc.dts +++ b/app/boards/arm/s40nc/s40nc.dts @@ -16,6 +16,7 @@ zephyr,code-partition = &code_partition; zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -95,6 +96,10 @@ &usbd { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { From 8afe12415378bcc59d34ee86b0f2f6d84edc4ce5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 14:41:43 -0400 Subject: [PATCH 008/494] fix(tests): Fix snapshots to account for formatting changes. --- .../keycode_events.snapshot | 10 ++--- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../combos-and-holdtaps-2/native_posix.keymap | 10 ++--- .../layer-filter-0/keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 40 +++++++++---------- .../keycode_events.snapshot | 16 ++++---- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 32 +++++++-------- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../tri-layer/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 16 ++++---- .../keycode_events.snapshot | 4 +- .../2-dn-timer-up/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../6-retro-tap/keycode_events.snapshot | 4 +- .../2-dn-timer-up/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../many-nested/keycode_events.snapshot | 16 ++++---- .../2-dn-timer-up/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../6-retro-tap/keycode_events.snapshot | 4 +- .../2-dn-timer-up/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../2-dn-timer-up/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../6-nested-timeouts/keycode_events.snapshot | 8 ++-- .../2-dn-timer-up/keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- .../press-release/keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 12 +++--- .../keycode_events.snapshot | 16 ++++---- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 4 +- .../keycode_events.snapshot | 4 +- app/tests/none/normal/native_posix_64.keymap | 8 ++++ .../10-callum-mods/keycode_events.snapshot | 8 ++-- .../10-sl-sl-kp/keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 8 ++-- .../keycode_events.snapshot | 8 ++-- .../9-sk-dn-up-dn-up/keycode_events.snapshot | 8 ++-- .../2a-hold1/keycode_events.snapshot | 4 +- .../2b-hold2/keycode_events.snapshot | 4 +- .../2c-hold3/keycode_events.snapshot | 4 +- .../3a-tap-int-mid/keycode_events.snapshot | 4 +- .../3b-tap-int-seq/keycode_events.snapshot | 4 +- .../3c-tap-int-after/keycode_events.snapshot | 4 +- .../3d-hold-int-mid/keycode_events.snapshot | 4 +- .../3e-hold-int-seq/keycode_events.snapshot | 4 +- .../3f-hold-int-after/keycode_events.snapshot | 4 +- .../5a-tdint-mid/keycode_events.snapshot | 4 +- .../5b-tdint-seq/keycode_events.snapshot | 4 +- .../5c-tdint-after/keycode_events.snapshot | 4 +- .../5d-tdint-multiple/keycode_events.snapshot | 8 ++-- .../to-layer/normal/keycode_events.snapshot | 4 +- .../early-key-release/keycode_events.snapshot | 4 +- .../normal/keycode_events.snapshot | 4 +- 94 files changed, 300 insertions(+), 292 deletions(-) create mode 100644 app/tests/none/normal/native_posix_64.keymap diff --git a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/keycode_events.snapshot b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/keycode_events.snapshot index fe705ba4..8910db99 100644 --- a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/keycode_events.snapshot +++ b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/keycode_events.snapshot @@ -3,12 +3,12 @@ pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 press: Modifiers set to 0x02 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x00 -caps_includelist: Comparing with 0x07 - 0x2d (with implicit mods: 0x02) -caps_includelist: Comparing with 0x07 - 0x2d (with implicit mods: 0x00) -caps_includelist: Continuing capsword, found included usage: 0x07 - 0x2d -pressed: usage_page 0x07 keycode 0x2d implicit_mods 0x00 explicit_mods 0x00 +caps_includelist: Comparing with 0x07 - 0x2D (with implicit mods: 0x02) +caps_includelist: Comparing with 0x07 - 0x2D (with implicit mods: 0x00) +caps_includelist: Continuing capsword, found included usage: 0x07 - 0x2D +pressed: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x00 -released: usage_page 0x07 keycode 0x2d implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x00 enhance_usage: Enhancing usage 0x04 with modifiers: 0x02 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 diff --git a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/keycode_events.snapshot b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/keycode_events.snapshot index eb24c4bb..f479db12 100644 --- a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/keycode_events.snapshot +++ b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/keycode_events.snapshot @@ -3,9 +3,9 @@ pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x02 explicit_mods 0x00 press: Modifiers set to 0x02 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x00 -pressed: usage_page 0x07 keycode 0x2d implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x00 -released: usage_page 0x07 keycode 0x2d implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x2D implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x00 diff --git a/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot index e1c02dae..16e8744e 100644 --- a/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot +++ b/app/tests/combo/combos-and-holdtaps-0/keycode_events.snapshot @@ -1,4 +1,4 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot index ff060370..257d7e34 100644 --- a/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot +++ b/app/tests/combo/combos-and-holdtaps-1/keycode_events.snapshot @@ -1,4 +1,4 @@ -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot b/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot index 325549fb..7a2ec83f 100644 --- a/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot +++ b/app/tests/combo/combos-and-holdtaps-2/keycode_events.snapshot @@ -1,2 +1,2 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/combos-and-holdtaps-2/native_posix.keymap b/app/tests/combo/combos-and-holdtaps-2/native_posix.keymap index f8dbe450..7a789808 100644 --- a/app/tests/combo/combos-and-holdtaps-2/native_posix.keymap +++ b/app/tests/combo/combos-and-holdtaps-2/native_posix.keymap @@ -26,12 +26,12 @@ keymap { compatible = "zmk,keymap"; - label ="Default keymap"; + label = "Default keymap"; default_layer { bindings = < - &mt LEFT_CONTROL A &mt RIGHT_CONTROL B - &none &none + &mt LEFT_CONTROL A &mt RIGHT_CONTROL B + &none &none >; }; }; @@ -39,7 +39,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,0) - ZMK_MOCK_PRESS(0,1,300) + ZMK_MOCK_PRESS(0,0,0) + ZMK_MOCK_PRESS(0,1,300) >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-0/keycode_events.snapshot b/app/tests/combo/layer-filter-0/keycode_events.snapshot index f845fd16..21bf0c3f 100644 --- a/app/tests/combo/layer-filter-0/keycode_events.snapshot +++ b/app/tests/combo/layer-filter-0/keycode_events.snapshot @@ -1,8 +1,8 @@ -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/overlapping-combos-0/keycode_events.snapshot b/app/tests/combo/overlapping-combos-0/keycode_events.snapshot index cc5b30f8..9e87293a 100644 --- a/app/tests/combo/overlapping-combos-0/keycode_events.snapshot +++ b/app/tests/combo/overlapping-combos-0/keycode_events.snapshot @@ -1,20 +1,20 @@ -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/overlapping-combos-1/keycode_events.snapshot b/app/tests/combo/overlapping-combos-1/keycode_events.snapshot index a80db25c..e6911236 100644 --- a/app/tests/combo/overlapping-combos-1/keycode_events.snapshot +++ b/app/tests/combo/overlapping-combos-1/keycode_events.snapshot @@ -1,8 +1,8 @@ -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/overlapping-combos-2/keycode_events.snapshot b/app/tests/combo/overlapping-combos-2/keycode_events.snapshot index ff060370..257d7e34 100644 --- a/app/tests/combo/overlapping-combos-2/keycode_events.snapshot +++ b/app/tests/combo/overlapping-combos-2/keycode_events.snapshot @@ -1,4 +1,4 @@ -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x06 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/overlapping-combos-3/keycode_events.snapshot b/app/tests/combo/overlapping-combos-3/keycode_events.snapshot index 3df81e52..38513aab 100644 --- a/app/tests/combo/overlapping-combos-3/keycode_events.snapshot +++ b/app/tests/combo/overlapping-combos-3/keycode_events.snapshot @@ -1,4 +1,4 @@ pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot b/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot index e6c88146..cca61244 100644 --- a/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot +++ b/app/tests/combo/partially-overlapping-combos/keycode_events.snapshot @@ -1,16 +1,16 @@ -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1c implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/press-release-long-combo-complete/keycode_events.snapshot b/app/tests/combo/press-release-long-combo-complete/keycode_events.snapshot index a9618a6c..cc6fa00e 100644 --- a/app/tests/combo/press-release-long-combo-complete/keycode_events.snapshot +++ b/app/tests/combo/press-release-long-combo-complete/keycode_events.snapshot @@ -1,2 +1,2 @@ -pressed: usage_page 0x07 keycode 0x1d implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1d implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1D implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1D implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/conditional-layer/chained-activation/keycode_events.snapshot b/app/tests/conditional-layer/chained-activation/keycode_events.snapshot index 422b075c..f847391f 100644 --- a/app/tests/conditional-layer/chained-activation/keycode_events.snapshot +++ b/app/tests/conditional-layer/chained-activation/keycode_events.snapshot @@ -2,8 +2,8 @@ mo_pressed: position 2 layer 1 mo_pressed: position 3 layer 2 cl_activate: layer 3 cl_activate: layer 4 -kp_pressed: usage_page 0x07 keycode 0x0c implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0c implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0C implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0C implicit_mods 0x00 explicit_mods 0x00 mo_released: position 3 layer 2 cl_deactivate: layer 3 cl_deactivate: layer 4 diff --git a/app/tests/conditional-layer/tri-layer-alt-order/keycode_events.snapshot b/app/tests/conditional-layer/tri-layer-alt-order/keycode_events.snapshot index 05337b29..46d6c03a 100644 --- a/app/tests/conditional-layer/tri-layer-alt-order/keycode_events.snapshot +++ b/app/tests/conditional-layer/tri-layer-alt-order/keycode_events.snapshot @@ -1,8 +1,8 @@ mo_pressed: position 3 layer 2 mo_pressed: position 2 layer 1 cl_activate: layer 3 -kp_pressed: usage_page 0x07 keycode 0x0a implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 mo_released: position 3 layer 2 cl_deactivate: layer 3 mo_released: position 2 layer 1 -kp_released: usage_page 0x07 keycode 0x0a implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/conditional-layer/tri-layer/keycode_events.snapshot b/app/tests/conditional-layer/tri-layer/keycode_events.snapshot index b23e61b2..cb452df5 100644 --- a/app/tests/conditional-layer/tri-layer/keycode_events.snapshot +++ b/app/tests/conditional-layer/tri-layer/keycode_events.snapshot @@ -1,8 +1,8 @@ mo_pressed: position 2 layer 1 mo_pressed: position 3 layer 2 cl_activate: layer 3 -kp_pressed: usage_page 0x07 keycode 0x0a implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0a implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 mo_released: position 3 layer 2 cl_deactivate: layer 3 mo_released: position 2 layer 1 diff --git a/app/tests/gresc/gresc-press-release/keycode_events.snapshot b/app/tests/gresc/gresc-press-release/keycode_events.snapshot index 7c4c32ca..061149ee 100644 --- a/app/tests/gresc/gresc-press-release/keycode_events.snapshot +++ b/app/tests/gresc/gresc-press-release/keycode_events.snapshot @@ -1,18 +1,18 @@ pressed: usage_page 0x07 keycode 0x29 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x29 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/gresc/gresc-two-instances/keycode_events.snapshot b/app/tests/gresc/gresc-two-instances/keycode_events.snapshot index 4a640a45..b33232ab 100644 --- a/app/tests/gresc/gresc-two-instances/keycode_events.snapshot +++ b/app/tests/gresc/gresc-two-instances/keycode_events.snapshot @@ -1,6 +1,6 @@ pressed: usage_page 0x07 keycode 0x29 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x29 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x35 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot index 926174b4..9b886067 100644 --- a/app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/2-dn-timer-up/keycode_events.snapshot @@ -1,5 +1,5 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot index 22c24df2..b9f92822 100644 --- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided tap (balanced decision moment key-up) kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot index 0c7ea497..0f2edc79 100644 --- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot index afbb52cf..d56fe18d 100644 --- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot @@ -2,6 +2,6 @@ kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot index 9c91aa5d..7fb95386 100644 --- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/keycode_events.snapshot @@ -1,10 +1,10 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 1 new undecided hold_tap ht_decide: 1 decided tap (balanced decision moment key-up) -kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 1 cleaning up hold-tap -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot index 242b31f2..b5b5886d 100644 --- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot index 55fd0854..55a620a8 100644 --- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot index 55fd0854..55a620a8 100644 --- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/6-retro-tap/keycode_events.snapshot b/app/tests/hold-tap/balanced/6-retro-tap/keycode_events.snapshot index 628625d7..8cc506ab 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/6-retro-tap/keycode_events.snapshot @@ -12,8 +12,8 @@ ht_binding_released: 0 cleaning up hold-tap ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) update_hold_status_for_retro_tap: Update hold tap 0 status to hold-interrupt -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/keycode_events.snapshot index 926174b4..9b886067 100644 --- a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/keycode_events.snapshot @@ -1,5 +1,5 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot index 242b31f2..b5b5886d 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot b/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot index 489fe477..b2d708b8 100644 --- a/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot +++ b/app/tests/hold-tap/balanced/many-nested/keycode_events.snapshot @@ -1,20 +1,20 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 1 new undecided hold_tap ht_decide: 1 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 2 new undecided hold_tap ht_binding_released: 0 cleaning up hold-tap ht_decide: 2 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 3 new undecided hold_tap ht_binding_released: 1 cleaning up hold-tap ht_decide: 3 decided hold-timer (balanced decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 2 cleaning up hold-tap -kp_released: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 3 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot index 827ac986..7298dc10 100644 --- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/keycode_events.snapshot @@ -1,5 +1,5 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (hold-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot index 84789bee..83e2182c 100644 --- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided tap (hold-preferred decision moment key-up) kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot index 4bac227b..fd0adb58 100644 --- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (hold-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot index 8ae35a38..7afa3fe9 100644 --- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot @@ -2,6 +2,6 @@ kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 ht_decide: 0 decided hold-timer (hold-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot index 865a985a..fcae0aac 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot @@ -1,10 +1,10 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 1 new undecided hold_tap ht_decide: 1 decided tap (hold-preferred decision moment key-up) -kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 1 cleaning up hold-tap -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot index 1d2b827e..026646cc 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot index 1d2b827e..026646cc 100644 --- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot index 1d2b827e..026646cc 100644 --- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot index ef3ea562..ad3ead5b 100644 --- a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/6-retro-tap/keycode_events.snapshot index dba93dba..a0d44794 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/keycode_events.snapshot @@ -12,8 +12,8 @@ ht_binding_released: 0 cleaning up hold-tap ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (hold-preferred decision moment timer) update_hold_status_for_retro_tap: Update hold tap 0 status to hold-interrupt -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot index 827ac986..7298dc10 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot @@ -1,5 +1,5 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (hold-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot index 1d2b827e..026646cc 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot index 4bf3e7ca..a8d82ae6 100644 --- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/keycode_events.snapshot @@ -1,5 +1,5 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot index e6a1450f..ace1f88b 100644 --- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided tap (tap-preferred decision moment key-up) kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot index b7f4e669..2ea80bcd 100644 --- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot index cdb1ee9a..ef6ab73b 100644 --- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/keycode_events.snapshot @@ -2,6 +2,6 @@ kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot index 54ac986b..11ab6451 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/keycode_events.snapshot @@ -1,10 +1,10 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 1 new undecided hold_tap ht_decide: 1 decided tap (tap-preferred decision moment key-up) -kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 1 cleaning up hold-tap -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot index 2d985568..a0a2e232 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot index 2d985568..a0a2e232 100644 --- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/keycode_events.snapshot index 54ac986b..11ab6451 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/keycode_events.snapshot @@ -1,10 +1,10 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 1 new undecided hold_tap ht_decide: 1 decided tap (tap-preferred decision moment key-up) -kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 1 cleaning up hold-tap -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot index 4bf3e7ca..a8d82ae6 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/keycode_events.snapshot @@ -1,5 +1,5 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot index 2d985568..a0a2e232 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-timer (tap-preferred decision moment timer) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/keycode_events.snapshot index a733739d..ad1b0911 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided tap (tap-unless-interrupted decision moment key-up) kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/keycode_events.snapshot index d2928131..7922ade4 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ -kp_pressed: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided tap (tap-unless-interrupted decision moment timer) kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe4 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE4 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/keycode_events.snapshot index b138d6cf..311a7a70 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/keycode_events.snapshot @@ -1,10 +1,10 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (tap-unless-interrupted decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_pressed: 1 new undecided hold_tap ht_decide: 1 decided tap (tap-unless-interrupted decision moment key-up) -kp_pressed: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0d implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 1 cleaning up hold-tap -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot index 6fa61725..2f348425 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (tap-unless-interrupted decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot index 6fa61725..2f348425 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (tap-unless-interrupted decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/keycode_events.snapshot index 6fa61725..2f348425 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (tap-unless-interrupted decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot index fc685a37..ae7c7946 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot +++ b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/keycode_events.snapshot @@ -1,7 +1,7 @@ ht_binding_pressed: 0 new undecided hold_tap ht_decide: 0 decided hold-interrupt (tap-unless-interrupted decision moment other-key-down) -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 ht_binding_released: 0 cleaning up hold-tap kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/key-repeat/ignore-other-usage-page-events/keycode_events.snapshot b/app/tests/key-repeat/ignore-other-usage-page-events/keycode_events.snapshot index c06d94a5..26830981 100644 --- a/app/tests/key-repeat/ignore-other-usage-page-events/keycode_events.snapshot +++ b/app/tests/key-repeat/ignore-other-usage-page-events/keycode_events.snapshot @@ -2,9 +2,9 @@ pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x00 -pressed: usage_page 0x0c keycode 0xe9 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x0C keycode 0xE9 implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x00 -released: usage_page 0x0c keycode 0xe9 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x0C keycode 0xE9 implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x00 diff --git a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/keycode_events.snapshot b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/keycode_events.snapshot index 628214a4..08f9e558 100644 --- a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/keycode_events.snapshot +++ b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/keycode_events.snapshot @@ -1,10 +1,10 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x01 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 press: Modifiers set to 0x01 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x01 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 release: Modifiers set to 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x01 explicit_mods 0x00 press: Modifiers set to 0x01 diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/keycode_events.snapshot b/app/tests/macros/mo-plus-modifier-from-hold-tap/keycode_events.snapshot index 9f47e064..6e1257c6 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/keycode_events.snapshot +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/keycode_events.snapshot @@ -1,4 +1,4 @@ -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/mo-plus-modifier-macro/keycode_events.snapshot b/app/tests/macros/mo-plus-modifier-macro/keycode_events.snapshot index 9f47e064..6e1257c6 100644 --- a/app/tests/macros/mo-plus-modifier-macro/keycode_events.snapshot +++ b/app/tests/macros/mo-plus-modifier-macro/keycode_events.snapshot @@ -1,4 +1,4 @@ -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/press-release/keycode_events.snapshot b/app/tests/macros/press-release/keycode_events.snapshot index ebe69d5c..d40cfb65 100644 --- a/app/tests/macros/press-release/keycode_events.snapshot +++ b/app/tests/macros/press-release/keycode_events.snapshot @@ -1,8 +1,8 @@ -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x12 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x12 implicit_mods 0x00 explicit_mods 0x00 -kp_pressed: usage_page 0x07 keycode 0x0a implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0a implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0A implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/wait-macro-release/keycode_events.snapshot b/app/tests/macros/wait-macro-release/keycode_events.snapshot index 509a1c48..21d47a29 100644 --- a/app/tests/macros/wait-macro-release/keycode_events.snapshot +++ b/app/tests/macros/wait-macro-release/keycode_events.snapshot @@ -1,16 +1,16 @@ qm: Iterating macro bindings - starting: 0, count: 4 queue_process_next: Invoking KEY_PRESS: 0x700e2 0x00 -kp_pressed: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 10ms queue_process_next: Invoking KEY_PRESS: 0x7002b 0x00 -kp_pressed: usage_page 0x07 keycode 0x2b implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 40ms queue_process_next: Invoking KEY_PRESS: 0x7002b 0x00 -kp_released: usage_page 0x07 keycode 0x2b implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 10ms -kp_pressed: usage_page 0x07 keycode 0x2b implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x2b implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x2B implicit_mods 0x00 explicit_mods 0x00 qm: Iterating macro bindings - starting: 5, count: 2 queue_process_next: Invoking KEY_PRESS: 0x700e2 0x00 -kp_released: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 0ms diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot index e146b9ca..ab200cbf 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/keycode_events.snapshot @@ -1,4 +1,4 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x0e +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x0E reg: Modifier 0 count 1 reg: Modifiers set to 0x01 reg: Modifier 1 count 1 @@ -6,19 +6,19 @@ reg: Modifiers set to 0x03 reg: Modifier 2 count 1 reg: Modifiers set to 0x07 reg: Modifier 3 count 1 -reg: Modifiers set to 0x0f -mods: Modifiers set to 0x0f +reg: Modifiers set to 0x0F +mods: Modifiers set to 0x0F pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -mods: Modifiers set to 0x0f +mods: Modifiers set to 0x0F released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -mods: Modifiers set to 0x0f -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x0e +mods: Modifiers set to 0x0F +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x0E unreg: Modifier 0 count: 0 unreg: Modifier 0 released -unreg: Modifiers set to 0x0e +unreg: Modifiers set to 0x0E unreg: Modifier 1 count: 0 unreg: Modifier 1 released -unreg: Modifiers set to 0x0c +unreg: Modifiers set to 0x0C unreg: Modifier 2 count: 0 unreg: Modifier 2 released unreg: Modifiers set to 0x08 diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot index 25b79445..1cbbf91b 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/keycode_events.snapshot @@ -1,16 +1,16 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 0 count 1 reg: Modifiers set to 0x01 mods: Modifiers set to 0x01 -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 0 count 2 reg: Modifiers set to 0x01 mods: Modifiers set to 0x01 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 1 unreg: Modifiers set to 0x01 mods: Modifiers set to 0x01 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released unreg: Modifiers set to 0x00 diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot index 545af6e7..47832094 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/keycode_events.snapshot @@ -1,8 +1,8 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 0 count 1 reg: Modifiers set to 0x01 mods: Modifiers set to 0x01 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released unreg: Modifiers set to 0x00 diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot index b7445420..85c14ca2 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/keycode_events.snapshot @@ -1,17 +1,17 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 0 count 1 reg: Modifiers set to 0x01 mods: Modifiers set to 0x01 -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 1 count 1 reg: Modifiers set to 0x03 mods: Modifiers set to 0x03 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released unreg: Modifiers set to 0x02 mods: Modifiers set to 0x02 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 1 count: 0 unreg: Modifier 1 released unreg: Modifiers set to 0x00 diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot index 74916a8c..80b24676 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/keycode_events.snapshot @@ -1,17 +1,17 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 0 count 1 reg: Modifiers set to 0x01 mods: Modifiers set to 0x01 -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 1 count 1 reg: Modifiers set to 0x03 mods: Modifiers set to 0x03 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 1 count: 0 unreg: Modifier 1 released unreg: Modifiers set to 0x01 mods: Modifiers set to 0x01 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released unreg: Modifiers set to 0x00 diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot index aece8bed..43edb961 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot @@ -1,10 +1,10 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 0 count 1 reg: Modifiers set to 0x01 mods: Modifiers set to 0x01 pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 mods: Modifiers set to 0x03 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released unreg: Modifiers set to 0x00 diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot index c24494fb..fdc7aec4 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/keycode_events.snapshot @@ -1,4 +1,4 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 reg: Modifier 0 count 1 reg: Modifiers set to 0x01 mods: Modifiers set to 0x01 @@ -6,7 +6,7 @@ pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 mods: Modifiers set to 0x03 released: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 mods: Modifiers set to 0x01 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released unreg: Modifiers set to 0x00 diff --git a/app/tests/none/normal/native_posix_64.keymap b/app/tests/none/normal/native_posix_64.keymap new file mode 100644 index 00000000..cbeb61dc --- /dev/null +++ b/app/tests/none/normal/native_posix_64.keymap @@ -0,0 +1,8 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = ; +}; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot b/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot index fd2217a5..3e46e581 100644 --- a/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot +++ b/app/tests/sticky-keys/10-callum-mods/keycode_events.snapshot @@ -1,8 +1,8 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/10-sl-sl-kp/keycode_events.snapshot b/app/tests/sticky-keys/10-sl-sl-kp/keycode_events.snapshot index fc0f29b9..922c582c 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/keycode_events.snapshot +++ b/app/tests/sticky-keys/10-sl-sl-kp/keycode_events.snapshot @@ -1,8 +1,8 @@ -pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/keycode_events.snapshot b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/keycode_events.snapshot index 7e745b51..5f43bbdf 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/keycode_events.snapshot +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/keycode_events.snapshot @@ -1,8 +1,8 @@ -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0x1b implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot b/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot index 374035fc..f1aa915b 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot +++ b/app/tests/sticky-keys/8-lsk-osk-combination/keycode_events.snapshot @@ -1,8 +1,8 @@ -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot b/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot index d5bd587e..6e3a0c3a 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/keycode_events.snapshot @@ -1,4 +1,4 @@ -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 -released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/2a-hold1/keycode_events.snapshot b/app/tests/tap-dance/2a-hold1/keycode_events.snapshot index 2a0965dc..5af4e5f0 100644 --- a/app/tests/tap-dance/2a-hold1/keycode_events.snapshot +++ b/app/tests/tap-dance/2a-hold1/keycode_events.snapshot @@ -1,5 +1,5 @@ td_binding_pressed: 0 created new tap dance td_binding_pressed: 0 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 0 tap dance keybind released -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/2b-hold2/keycode_events.snapshot b/app/tests/tap-dance/2b-hold2/keycode_events.snapshot index dbccfc94..0a44f746 100644 --- a/app/tests/tap-dance/2b-hold2/keycode_events.snapshot +++ b/app/tests/tap-dance/2b-hold2/keycode_events.snapshot @@ -2,6 +2,6 @@ td_binding_pressed: 0 created new tap dance td_binding_pressed: 0 tap dance pressed td_binding_released: 0 tap dance keybind released td_binding_pressed: 0 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 0 tap dance keybind released -kp_released: usage_page 0x07 keycode 0xe2 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/2c-hold3/keycode_events.snapshot b/app/tests/tap-dance/2c-hold3/keycode_events.snapshot index 3ac8e0e6..f8a232a1 100644 --- a/app/tests/tap-dance/2c-hold3/keycode_events.snapshot +++ b/app/tests/tap-dance/2c-hold3/keycode_events.snapshot @@ -4,6 +4,6 @@ td_binding_released: 0 tap dance keybind released td_binding_pressed: 0 tap dance pressed td_binding_released: 0 tap dance keybind released td_binding_pressed: 0 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 0 tap dance keybind released -kp_released: usage_page 0x07 keycode 0xe3 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE3 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/3a-tap-int-mid/keycode_events.snapshot b/app/tests/tap-dance/3a-tap-int-mid/keycode_events.snapshot index 715d0143..fe67e6e1 100644 --- a/app/tests/tap-dance/3a-tap-int-mid/keycode_events.snapshot +++ b/app/tests/tap-dance/3a-tap-int-mid/keycode_events.snapshot @@ -1,10 +1,10 @@ td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 1 created new tap dance td_binding_pressed: 1 tap dance pressed kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 1 tap dance keybind released kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 2 tap dance keybind released -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/3b-tap-int-seq/keycode_events.snapshot b/app/tests/tap-dance/3b-tap-int-seq/keycode_events.snapshot index a973e426..31113ffc 100644 --- a/app/tests/tap-dance/3b-tap-int-seq/keycode_events.snapshot +++ b/app/tests/tap-dance/3b-tap-int-seq/keycode_events.snapshot @@ -1,10 +1,10 @@ td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 1 created new tap dance td_binding_pressed: 1 tap dance pressed kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 2 tap dance keybind released -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 1 tap dance keybind released kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/3c-tap-int-after/keycode_events.snapshot b/app/tests/tap-dance/3c-tap-int-after/keycode_events.snapshot index 2c715537..38b560db 100644 --- a/app/tests/tap-dance/3c-tap-int-after/keycode_events.snapshot +++ b/app/tests/tap-dance/3c-tap-int-after/keycode_events.snapshot @@ -1,8 +1,8 @@ td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed td_binding_released: 2 tap dance keybind released -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 1 created new tap dance td_binding_pressed: 1 tap dance pressed kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/3d-hold-int-mid/keycode_events.snapshot b/app/tests/tap-dance/3d-hold-int-mid/keycode_events.snapshot index 7631c4ac..7787336f 100644 --- a/app/tests/tap-dance/3d-hold-int-mid/keycode_events.snapshot +++ b/app/tests/tap-dance/3d-hold-int-mid/keycode_events.snapshot @@ -1,10 +1,10 @@ td_binding_pressed: 0 created new tap dance td_binding_pressed: 0 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 1 created new tap dance td_binding_pressed: 1 tap dance pressed kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 1 tap dance keybind released kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 0 tap dance keybind released -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/3e-hold-int-seq/keycode_events.snapshot b/app/tests/tap-dance/3e-hold-int-seq/keycode_events.snapshot index ca13f8bc..052caec2 100644 --- a/app/tests/tap-dance/3e-hold-int-seq/keycode_events.snapshot +++ b/app/tests/tap-dance/3e-hold-int-seq/keycode_events.snapshot @@ -1,10 +1,10 @@ td_binding_pressed: 0 created new tap dance td_binding_pressed: 0 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 1 created new tap dance td_binding_pressed: 1 tap dance pressed kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 0 tap dance keybind released -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 1 tap dance keybind released kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/3f-hold-int-after/keycode_events.snapshot b/app/tests/tap-dance/3f-hold-int-after/keycode_events.snapshot index 044018e0..f4250f49 100644 --- a/app/tests/tap-dance/3f-hold-int-after/keycode_events.snapshot +++ b/app/tests/tap-dance/3f-hold-int-after/keycode_events.snapshot @@ -1,8 +1,8 @@ td_binding_pressed: 0 created new tap dance td_binding_pressed: 0 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 0 tap dance keybind released -kp_released: usage_page 0x07 keycode 0xe1 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 1 created new tap dance td_binding_pressed: 1 tap dance pressed kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/5a-tdint-mid/keycode_events.snapshot b/app/tests/tap-dance/5a-tdint-mid/keycode_events.snapshot index 301dc914..a84766e3 100644 --- a/app/tests/tap-dance/5a-tdint-mid/keycode_events.snapshot +++ b/app/tests/tap-dance/5a-tdint-mid/keycode_events.snapshot @@ -1,10 +1,10 @@ td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 3 created new tap dance td_binding_pressed: 3 tap dance pressed td_binding_released: 3 tap dance keybind released td_binding_released: 2 tap dance keybind released -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/5b-tdint-seq/keycode_events.snapshot b/app/tests/tap-dance/5b-tdint-seq/keycode_events.snapshot index 567ec079..4380a057 100644 --- a/app/tests/tap-dance/5b-tdint-seq/keycode_events.snapshot +++ b/app/tests/tap-dance/5b-tdint-seq/keycode_events.snapshot @@ -1,10 +1,10 @@ td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 3 created new tap dance td_binding_pressed: 3 tap dance pressed td_binding_released: 2 tap dance keybind released -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_released: 3 tap dance keybind released kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/5c-tdint-after/keycode_events.snapshot b/app/tests/tap-dance/5c-tdint-after/keycode_events.snapshot index cc1da902..4e54ac22 100644 --- a/app/tests/tap-dance/5c-tdint-after/keycode_events.snapshot +++ b/app/tests/tap-dance/5c-tdint-after/keycode_events.snapshot @@ -1,8 +1,8 @@ td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed td_binding_released: 2 tap dance keybind released -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 3 created new tap dance td_binding_pressed: 3 tap dance pressed td_binding_released: 3 tap dance keybind released diff --git a/app/tests/tap-dance/5d-tdint-multiple/keycode_events.snapshot b/app/tests/tap-dance/5d-tdint-multiple/keycode_events.snapshot index afb32824..e5e024a8 100644 --- a/app/tests/tap-dance/5d-tdint-multiple/keycode_events.snapshot +++ b/app/tests/tap-dance/5d-tdint-multiple/keycode_events.snapshot @@ -1,8 +1,8 @@ td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed td_binding_released: 2 tap dance keybind released -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 3 created new tap dance td_binding_pressed: 3 tap dance pressed td_binding_released: 3 tap dance keybind released @@ -11,5 +11,5 @@ kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 td_binding_pressed: 2 created new tap dance td_binding_pressed: 2 tap dance pressed td_binding_released: 2 tap dance keybind released -kp_pressed: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x1e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1E implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/to-layer/normal/keycode_events.snapshot b/app/tests/to-layer/normal/keycode_events.snapshot index 5ac5eb68..a98f7479 100644 --- a/app/tests/to-layer/normal/keycode_events.snapshot +++ b/app/tests/to-layer/normal/keycode_events.snapshot @@ -3,8 +3,8 @@ kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 1 layer 1 layer_changed: layer 1 state 1 to_released: position 1 layer 1 -kp_pressed: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x0E implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0E implicit_mods 0x00 explicit_mods 0x00 to_pressed: position 0 layer 0 layer_changed: layer 1 state 0 layer_changed: layer 0 state 1 diff --git a/app/tests/toggle-layer/early-key-release/keycode_events.snapshot b/app/tests/toggle-layer/early-key-release/keycode_events.snapshot index e0aa502f..8ac4a3d2 100644 --- a/app/tests/toggle-layer/early-key-release/keycode_events.snapshot +++ b/app/tests/toggle-layer/early-key-release/keycode_events.snapshot @@ -2,5 +2,5 @@ kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 tog_pressed: position 1 layer 1 kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 tog_released: position 1 layer 1 -kp_pressed: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/toggle-layer/normal/keycode_events.snapshot b/app/tests/toggle-layer/normal/keycode_events.snapshot index 8b5b0cc5..515772a4 100644 --- a/app/tests/toggle-layer/normal/keycode_events.snapshot +++ b/app/tests/toggle-layer/normal/keycode_events.snapshot @@ -1,4 +1,4 @@ tog_pressed: position 1 layer 1 tog_released: position 1 layer 1 -kp_pressed: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00 -kp_released: usage_page 0x0c keycode 0xb5 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x0C keycode 0xB5 implicit_mods 0x00 explicit_mods 0x00 From bf2fc68070520a350266875075c912e863fcbf7c Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 16:25:06 -0400 Subject: [PATCH 009/494] fix(underglow): Add newly required color-mapping prop. --- app/boards/arm/bdn9/bdn9_rev2.dts | 29 +++++++++-------- app/boards/arm/nice60/nice60.dts | 3 ++ app/boards/arm/nice_nano/nice_nano.dtsi | 2 +- .../shields/chalice/boards/nice_nano.overlay | 4 +++ .../chalice/boards/nice_nano_v2.overlay | 4 +++ .../shields/corne/boards/nice_nano.overlay | 4 +++ .../elephant42/boards/nice_nano_v2.overlay | 4 +++ .../shields/helix/boards/nice_nano.overlay | 4 +++ .../shields/jorne/boards/nice_nano.overlay | 3 ++ .../shields/kyria/boards/nice_nano.overlay | 3 ++ .../shields/kyria/boards/nice_nano_v2.overlay | 32 +++++++++++++++++++ .../shields/kyria/boards/nrfmicro_11.overlay | 3 ++ .../kyria/boards/nrfmicro_11_flipped.overlay | 3 ++ .../shields/kyria/boards/nrfmicro_13.overlay | 3 ++ .../shields/lily58/boards/nice_nano.overlay | 3 ++ .../shields/microdox/boards/nice_nano.overlay | 4 +++ .../shields/murphpad/boards/nice_nano.overlay | 4 +++ .../shields/nibble/boards/nice_nano.overlay | 3 ++ .../shields/redox/boards/nice_nano.overlay | 4 +++ .../reviung41/boards/nice_nano.overlay | 3 ++ .../romac_plus/boards/nice_nano.overlay | 3 ++ .../shields/tg4x/boards/nice_nano.overlay | 3 ++ .../shields/tidbit/boards/nice_nano.overlay | 3 ++ docs/docs/features/underglow.md | 17 ++++++++++ 24 files changed, 133 insertions(+), 15 deletions(-) create mode 100644 app/boards/shields/kyria/boards/nice_nano_v2.overlay diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index c005be17..3ce9758d 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -6,6 +6,7 @@ /dts-v1/; #include +#include / { model = "Keeb.io BDN9 rev2"; @@ -18,24 +19,24 @@ zmk,kscan = &kscan; /* TODO: Enable once the GPIO bitbanging driver supports STM32 zmk,underglow = &led_strip; - */ + */ }; - + kscan: kscan { compatible = "zmk,kscan-gpio-direct"; label = "KSCAN"; input-gpios - = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; /* @@ -47,7 +48,7 @@ chain-length = <9>; }; - */ + */ left_encoder: encoder_left { compatible = "alps,ec11"; @@ -96,7 +97,7 @@ &flash0 { /* * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions */ partitions { compatible = "fixed-partitions"; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index 20f2a1a7..ee38c9a5 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -6,6 +6,8 @@ /dts-v1/; #include + +#include #include / { @@ -124,6 +126,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R chain-length = <12>; /* LED strip length */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index 52b92612..6c9d081c 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -67,7 +67,7 @@ &flash0 { /* * For more information, see: - * http: //docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html */ partitions { compatible = "fixed-partitions"; diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index 21e28515..5a74582a 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,8 @@ chain-length = <14>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + + color-mapping = ; }; }; diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index 21e28515..5a74582a 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,8 @@ chain-length = <14>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + + color-mapping = ; }; }; diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index 83ebae04..e5f84063 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; /* Cannot be used together with i2c0. */ @@ -19,6 +21,8 @@ chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + + color-mapping = ; }; }; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index 6cd5de8c..87c8da21 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; /* Cannot be used together with i2c0. */ @@ -18,6 +20,8 @@ chain-length = <27>; /* There are per-key RGB and the LAST 6 are underglow */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + + color-mapping = ; }; }; diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index 78576d13..da7deed1 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -24,6 +26,8 @@ chain-length = <32>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + + color-mapping = ; }; }; diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index 03b868ce..2864fd60 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; /* Cannot be used together with i2c0. */ @@ -19,6 +21,7 @@ chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index 8be964b5..b774b4ba 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..b1e7fbb5 --- /dev/null +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -0,0 +1,32 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay index b88573b6..1cff5f77 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index c6a24665..80d0c898 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_13.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay index c6a24665..80d0c898 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_13.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index 0d28726d..69bfffa0 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -24,6 +26,7 @@ chain-length = <5>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index 1b84b6b5..360e7098 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -3,6 +3,9 @@ * * SPDX-License-Identifier: MIT */ + +#include + &spi1 { compatible = "nordic,nrf-spim"; /* Cannot be used together with i2c0. */ @@ -24,6 +27,7 @@ chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index b247334e..d7cdcff7 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ + #include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -24,6 +26,8 @@ chain-length = <8>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + + color-mapping = ; }; }; diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index 8da95ac1..0a08c770 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -24,6 +26,7 @@ chain-length = <10>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index b81ba195..d67e46f9 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ + #include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -24,6 +26,8 @@ chain-length = <5>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + + color-mapping = ; }; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index b6c89e80..b52faac6 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,7 @@ chain-length = <11>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index 17d11927..dc686af8 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,3 +1,5 @@ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -18,6 +20,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index 60492bec..fe7fbf18 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -24,6 +26,7 @@ chain-length = <7>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index 762a7403..d8a647e9 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: MIT */ +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -24,6 +26,7 @@ chain-length = <8>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index a093ecac..ac865826 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -67,6 +67,8 @@ To identify which pin number you need to put in the config you need do to a bit Here's an example on a definition that uses P0.06: ``` +#include + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; @@ -87,6 +89,9 @@ Here's an example on a definition that uses P0.06: chain-length = <10>; /* number of LEDs */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; ``` @@ -98,6 +103,13 @@ Ignoring these restrictions may result in poor wireless performance. You can fin ::: +:::note + +Standard WS2812 LEDs use a wire protocol where the bits for the colors green, red, and blue values are sent in that order. +If your board/shield uses LEDs that require the data sent in a different order, the `color-mapping` property ordering should be changed to match. + +::: + ### Other boards For other boards, you must select an SPI definition that has the `MOSI` pin as your data pin going to your LED strip. @@ -105,6 +117,8 @@ For other boards, you must select an SPI definition that has the `MOSI` pin as y Here's another example for a non-nRF52 board on `spi1`: ``` +#include + &spi1 { led_strip: ws2812@0 { @@ -119,6 +133,9 @@ Here's another example for a non-nRF52 board on `spi1`: chain-length = <10>; /* number of LEDs */ spi-one-frame = <0x70>; /* make sure to configure this properly for your SOC */ spi-zero-frame = <0x40>; /* make sure to configure this properly for your SOC */ + color-mapping = ; }; }; ``` From 4df83a9c0d4397a5cbbdcbc1b2ae680350205cdf Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 20:44:14 +0000 Subject: [PATCH 010/494] refactor: Move away from deprecated PM callback. --- app/drivers/display/il0323.c | 2 +- app/drivers/gpio/gpio_mcp23017.c | 2 +- app/drivers/kscan/kscan_composite.c | 5 ++--- app/drivers/kscan/kscan_gpio_demux.c | 2 +- app/drivers/kscan/kscan_gpio_direct.c | 2 +- app/drivers/kscan/kscan_gpio_matrix.c | 4 ++-- app/drivers/sensor/battery/battery_nrf_vddh.c | 2 +- app/drivers/sensor/battery/battery_voltage_divider.c | 2 +- app/drivers/sensor/ec11/ec11.c | 4 ++-- app/src/behaviors/behavior_bt.c | 2 +- app/src/behaviors/behavior_caps_word.c | 7 +++---- app/src/behaviors/behavior_ext_power.c | 2 +- app/src/behaviors/behavior_hold_tap.c | 4 ++-- app/src/behaviors/behavior_key_press.c | 5 ++--- app/src/behaviors/behavior_mod_morph.c | 7 +++---- app/src/behaviors/behavior_momentary_layer.c | 5 ++--- app/src/behaviors/behavior_none.c | 2 +- app/src/behaviors/behavior_outputs.c | 2 +- app/src/behaviors/behavior_reset.c | 6 +++--- app/src/behaviors/behavior_rgb_underglow.c | 5 ++--- app/src/behaviors/behavior_sensor_rotate_key_press.c | 4 ++-- app/src/behaviors/behavior_sticky_key.c | 4 ++-- app/src/behaviors/behavior_to_layer.c | 2 +- app/src/behaviors/behavior_toggle_layer.c | 5 ++--- app/src/behaviors/behavior_transparent.c | 2 +- 25 files changed, 41 insertions(+), 48 deletions(-) diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index 9ec8162f..b8117584 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -428,5 +428,5 @@ static struct display_driver_api il0323_driver_api = { .set_orientation = il0323_set_orientation, }; -DEVICE_DT_INST_DEFINE(0, il0323_init, device_pm_control_nop, &il0323_driver, NULL, POST_KERNEL, +DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, &il0323_driver, NULL, POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, &il0323_driver_api); \ No newline at end of file diff --git a/app/drivers/gpio/gpio_mcp23017.c b/app/drivers/gpio/gpio_mcp23017.c index eb38ce50..1df14e6b 100644 --- a/app/drivers/gpio/gpio_mcp23017.c +++ b/app/drivers/gpio/gpio_mcp23017.c @@ -325,7 +325,7 @@ static int mcp23017_init(const struct device *dev) { }; \ \ /* This has to init after SPI master */ \ - DEVICE_DT_INST_DEFINE(inst, mcp23017_init, device_pm_control_nop, &mcp23017_##inst##_drvdata, \ + DEVICE_DT_INST_DEFINE(inst, mcp23017_init, NULL, &mcp23017_##inst##_drvdata, \ &mcp23017_##inst##_config, POST_KERNEL, \ CONFIG_GPIO_MCP23017_INIT_PRIORITY, &api_table); diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index 0d40c6fa..35584d9c 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -118,6 +118,5 @@ static const struct kscan_composite_config kscan_composite_config = {}; static struct kscan_composite_data kscan_composite_data; -DEVICE_DT_INST_DEFINE(0, kscan_composite_init, device_pm_control_nop, &kscan_composite_data, - &kscan_composite_config, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &mock_driver_api); +DEVICE_DT_INST_DEFINE(0, kscan_composite_init, NULL, &kscan_composite_data, &kscan_composite_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &mock_driver_api); diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 0cfd3834..e064a942 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -246,7 +246,7 @@ struct kscan_gpio_item_config { .cols = {UTIL_LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, n)}, \ }; \ \ - DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, device_pm_control_nop, &kscan_gpio_data_##n, \ + DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ &kscan_gpio_config_##n, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY, \ &gpio_driver_api_##n); diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index c7be4e1f..3f4f5a1b 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -237,7 +237,7 @@ static const struct kscan_driver_api gpio_driver_api = { .inputs = {UTIL_LISTIFY(INST_INPUT_LEN(n), KSCAN_DIRECT_INPUT_ITEM, n)}, \ .num_of_inputs = INST_INPUT_LEN(n), \ .debounce_period = DT_INST_PROP(n, debounce_period)}; \ - DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, device_pm_control_nop, &kscan_gpio_data_##n, \ + DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ &kscan_gpio_config_##n, POST_KERNEL, CONFIG_ZMK_KSCAN_INIT_PRIORITY, \ &gpio_driver_api); diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 1e841239..b41e09b7 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -477,8 +477,8 @@ static const struct kscan_driver_api kscan_matrix_api = { .diode_direction = INST_DIODE_DIR(index), \ }; \ \ - DEVICE_DT_INST_DEFINE(index, &kscan_matrix_init, device_pm_control_nop, \ - &kscan_matrix_data_##index, &kscan_matrix_config_##index, APPLICATION, \ + DEVICE_DT_INST_DEFINE(index, &kscan_matrix_init, NULL, &kscan_matrix_data_##index, \ + &kscan_matrix_config_##index, APPLICATION, \ CONFIG_APPLICATION_INIT_PRIORITY, &kscan_matrix_api); DT_INST_FOREACH_STATUS_OKAY(KSCAN_MATRIX_INIT); diff --git a/app/drivers/sensor/battery/battery_nrf_vddh.c b/app/drivers/sensor/battery/battery_nrf_vddh.c index 90890344..60104a69 100644 --- a/app/drivers/sensor/battery/battery_nrf_vddh.c +++ b/app/drivers/sensor/battery/battery_nrf_vddh.c @@ -112,5 +112,5 @@ static int vddh_init(const struct device *dev) { static struct vddh_data vddh_data; -DEVICE_DT_INST_DEFINE(0, &vddh_init, device_pm_control_nop, &vddh_data, NULL, POST_KERNEL, +DEVICE_DT_INST_DEFINE(0, &vddh_init, NULL, &vddh_data, NULL, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &vddh_api); diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index 484ca4fc..09e5525e 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -186,5 +186,5 @@ static const struct bvd_config bvd_cfg = { .full_ohm = DT_INST_PROP(0, full_ohms), }; -DEVICE_DT_INST_DEFINE(0, &bvd_init, device_pm_control_nop, &bvd_data, &bvd_cfg, POST_KERNEL, +DEVICE_DT_INST_DEFINE(0, &bvd_init, NULL, &bvd_data, &bvd_cfg, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &bvd_api); diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 14ccc91b..2fe641fa 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -142,7 +142,7 @@ int ec11_init(const struct device *dev) { .b_flags = DT_INST_GPIO_FLAGS(n, b_gpios), \ COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ }; \ - DEVICE_DT_INST_DEFINE(n, ec11_init, device_pm_control_nop, &ec11_data_##n, &ec11_cfg_##n, \ - POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, &ec11_driver_api); + DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \ + CONFIG_SENSOR_INIT_PRIORITY, &ec11_driver_api); DT_INST_FOREACH_STATUS_OKAY(EC11_INST) diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 8f7dac94..79b805b6 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -49,7 +49,7 @@ static const struct behavior_driver_api behavior_bt_driver_api = { .binding_released = on_keymap_binding_released, }; -DEVICE_DT_INST_DEFINE(0, behavior_bt_init, device_pm_control_nop, NULL, NULL, APPLICATION, +DEVICE_DT_INST_DEFINE(0, behavior_bt_init, NULL, NULL, NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_bt_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 61f2efca..3af9a172 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -176,10 +176,9 @@ static int behavior_caps_word_init(const struct device *dev) { .continuations = {UTIL_LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ - DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, device_pm_control_nop, \ - &behavior_caps_word_data_##n, &behavior_caps_word_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_caps_word_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ + &behavior_caps_word_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_caps_word_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_ext_power.c b/app/src/behaviors/behavior_ext_power.c index 27793318..5db8aac2 100644 --- a/app/src/behaviors/behavior_ext_power.c +++ b/app/src/behaviors/behavior_ext_power.c @@ -74,7 +74,7 @@ static const struct behavior_driver_api behavior_ext_power_driver_api = { .locality = BEHAVIOR_LOCALITY_GLOBAL, }; -DEVICE_DT_INST_DEFINE(0, behavior_ext_power_init, device_pm_control_nop, NULL, NULL, APPLICATION, +DEVICE_DT_INST_DEFINE(0, behavior_ext_power_init, NULL, NULL, NULL, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY, &behavior_ext_power_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 3bb7539c..485b9dc3 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -688,8 +688,8 @@ static struct behavior_hold_tap_data behavior_hold_tap_data; .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ }; \ - DEVICE_DT_INST_DEFINE(n, behavior_hold_tap_init, device_pm_control_nop, \ - &behavior_hold_tap_data, &behavior_hold_tap_config_##n, APPLICATION, \ + DEVICE_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, &behavior_hold_tap_data, \ + &behavior_hold_tap_config_##n, APPLICATION, \ CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_hold_tap_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_key_press.c b/app/src/behaviors/behavior_key_press.c index b8d765c7..215da41d 100644 --- a/app/src/behaviors/behavior_key_press.c +++ b/app/src/behaviors/behavior_key_press.c @@ -36,8 +36,7 @@ static const struct behavior_driver_api behavior_key_press_driver_api = { .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released}; #define KP_INST(n) \ - DEVICE_DT_INST_DEFINE(n, behavior_key_press_init, device_pm_control_nop, NULL, NULL, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_key_press_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_key_press_init, NULL, NULL, NULL, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_press_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index 9d6eac17..a40bd365 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -90,10 +90,9 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; } .mods = DT_INST_PROP(n, mods), \ }; \ static struct behavior_mod_morph_data behavior_mod_morph_data_##n = {}; \ - DEVICE_DT_INST_DEFINE(n, behavior_mod_morph_init, device_pm_control_nop, \ - &behavior_mod_morph_data_##n, &behavior_mod_morph_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_mod_morph_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_mod_morph_init, NULL, &behavior_mod_morph_data_##n, \ + &behavior_mod_morph_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_mod_morph_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 8259b6c7..46e49fcc 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -39,6 +39,5 @@ static const struct behavior_mo_config behavior_mo_config = {}; static struct behavior_mo_data behavior_mo_data; -DEVICE_DT_INST_DEFINE(0, behavior_mo_init, device_pm_control_nop, &behavior_mo_data, - &behavior_mo_config, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_mo_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_mo_init, NULL, &behavior_mo_data, &behavior_mo_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_mo_driver_api); diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c index 93c1d1af..d53a4400 100644 --- a/app/src/behaviors/behavior_none.c +++ b/app/src/behaviors/behavior_none.c @@ -34,7 +34,7 @@ static const struct behavior_driver_api behavior_none_driver_api = { .binding_released = on_keymap_binding_released, }; -DEVICE_DT_INST_DEFINE(0, behavior_none_init, device_pm_control_nop, NULL, NULL, APPLICATION, +DEVICE_DT_INST_DEFINE(0, behavior_none_init, NULL, NULL, NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_none_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_outputs.c b/app/src/behaviors/behavior_outputs.c index f56468a1..366abd8f 100644 --- a/app/src/behaviors/behavior_outputs.c +++ b/app/src/behaviors/behavior_outputs.c @@ -42,7 +42,7 @@ static const struct behavior_driver_api behavior_outputs_driver_api = { .binding_pressed = on_keymap_binding_pressed, }; -DEVICE_DT_INST_DEFINE(0, behavior_out_init, device_pm_control_nop, NULL, NULL, APPLICATION, +DEVICE_DT_INST_DEFINE(0, behavior_out_init, NULL, NULL, NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_outputs_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index eb0477db..0705df73 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -42,9 +42,9 @@ static const struct behavior_driver_api behavior_reset_driver_api = { #define RST_INST(n) \ static const struct behavior_reset_config behavior_reset_config_##n = { \ .type = DT_INST_PROP(n, type)}; \ - DEVICE_DT_INST_DEFINE(n, behavior_reset_init, device_pm_control_nop, NULL, \ - &behavior_reset_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_reset_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_reset_init, NULL, NULL, &behavior_reset_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_reset_driver_api); DT_INST_FOREACH_STATUS_OKAY(RST_INST) diff --git a/app/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index 96f69048..3459cd22 100644 --- a/app/src/behaviors/behavior_rgb_underglow.c +++ b/app/src/behaviors/behavior_rgb_underglow.c @@ -149,8 +149,7 @@ static const struct behavior_driver_api behavior_rgb_underglow_driver_api = { .locality = BEHAVIOR_LOCALITY_GLOBAL, }; -DEVICE_DT_INST_DEFINE(0, behavior_rgb_underglow_init, device_pm_control_nop, NULL, NULL, - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_rgb_underglow_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_rgb_underglow_init, NULL, NULL, NULL, APPLICATION, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_rgb_underglow_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index c5b5a3f0..c4a34a94 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -59,8 +59,8 @@ static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_ .sensor_binding_triggered = on_sensor_binding_triggered}; #define KP_INST(n) \ - DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_key_press_init, device_pm_control_nop, NULL, \ - NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_key_press_init, NULL, NULL, NULL, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ &behavior_sensor_rotate_key_press_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index aa069a35..186a92d2 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -287,8 +287,8 @@ static struct behavior_sticky_key_data behavior_sticky_key_data; .ignore_modifiers = DT_INST_PROP(n, ignore_modifiers), \ .quick_release = DT_INST_PROP(n, quick_release), \ }; \ - DEVICE_DT_INST_DEFINE(n, behavior_sticky_key_init, device_pm_control_nop, \ - &behavior_sticky_key_data, &behavior_sticky_key_config_##n, APPLICATION, \ + DEVICE_DT_INST_DEFINE(n, behavior_sticky_key_init, NULL, &behavior_sticky_key_data, \ + &behavior_sticky_key_config_##n, APPLICATION, \ CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sticky_key_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) diff --git a/app/src/behaviors/behavior_to_layer.c b/app/src/behaviors/behavior_to_layer.c index a1707fc3..cce39d5d 100644 --- a/app/src/behaviors/behavior_to_layer.c +++ b/app/src/behaviors/behavior_to_layer.c @@ -37,7 +37,7 @@ static const struct behavior_driver_api behavior_to_driver_api = { .binding_released = to_keymap_binding_released, }; -DEVICE_DT_INST_DEFINE(0, behavior_to_init, device_pm_control_nop, NULL, NULL, APPLICATION, +DEVICE_DT_INST_DEFINE(0, behavior_to_init, NULL, NULL, NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_to_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c index 384f978a..a682c6fe 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -43,8 +43,7 @@ static const struct behavior_tog_config behavior_tog_config = {}; static struct behavior_tog_data behavior_tog_data; -DEVICE_DT_INST_DEFINE(0, behavior_tog_init, device_pm_control_nop, &behavior_tog_data, - &behavior_tog_config, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, - &behavior_tog_driver_api); +DEVICE_DT_INST_DEFINE(0, behavior_tog_init, NULL, &behavior_tog_data, &behavior_tog_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tog_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_transparent.c b/app/src/behaviors/behavior_transparent.c index 9d4f0dd7..1f36e7a6 100644 --- a/app/src/behaviors/behavior_transparent.c +++ b/app/src/behaviors/behavior_transparent.c @@ -34,7 +34,7 @@ static const struct behavior_driver_api behavior_transparent_driver_api = { .binding_released = on_keymap_binding_released, }; -DEVICE_DT_INST_DEFINE(0, behavior_transparent_init, device_pm_control_nop, NULL, NULL, APPLICATION, +DEVICE_DT_INST_DEFINE(0, behavior_transparent_init, NULL, NULL, NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_transparent_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ From ded79ba4222ab4f99dae673ef8f10f62f4a1ca2b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 Nov 2021 22:33:03 -0400 Subject: [PATCH 011/494] fix: Remove deprecated pinmux code. --- app/boards/arm/dz60rgb/CMakeLists.txt | 7 --- app/boards/arm/dz60rgb/pinmux.c | 67 --------------------------- app/boards/arm/planck/CMakeLists.txt | 5 -- app/boards/arm/planck/pinmux.c | 67 --------------------------- 4 files changed, 146 deletions(-) delete mode 100644 app/boards/arm/dz60rgb/CMakeLists.txt delete mode 100644 app/boards/arm/dz60rgb/pinmux.c delete mode 100644 app/boards/arm/planck/pinmux.c diff --git a/app/boards/arm/dz60rgb/CMakeLists.txt b/app/boards/arm/dz60rgb/CMakeLists.txt deleted file mode 100644 index 940af1fe..00000000 --- a/app/boards/arm/dz60rgb/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: MIT - -if(CONFIG_PINMUX) -zephyr_library() -zephyr_library_sources(pinmux.c) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) -endif() diff --git a/app/boards/arm/dz60rgb/pinmux.c b/app/boards/arm/dz60rgb/pinmux.c deleted file mode 100644 index 241c4ce1..00000000 --- a/app/boards/arm/dz60rgb/pinmux.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2017 I-SENSE group of ICCS - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include - -#include - -/* pin assignments for STM32F3DISCOVERY board */ -static const struct pin_config pinconf[] = { -#if DT_NODE_HAS_STATUS(DT_NODELABEL(usart1), okay) && CONFIG_SERIAL - {STM32_PIN_PC4, STM32F3_PINMUX_FUNC_PC4_USART1_TX}, - {STM32_PIN_PC5, STM32F3_PINMUX_FUNC_PC5_USART1_RX}, -#endif -#if DT_NODE_HAS_STATUS(DT_NODELABEL(usart2), okay) && CONFIG_SERIAL - {STM32_PIN_PA2, STM32F3_PINMUX_FUNC_PA2_USART2_TX}, - {STM32_PIN_PA3, STM32F3_PINMUX_FUNC_PA3_USART2_RX}, -#endif -#if DT_NODE_HAS_STATUS(DT_NODELABEL(i2c1), okay) && CONFIG_I2C - {STM32_PIN_PB6, STM32F3_PINMUX_FUNC_PB6_I2C1_SCL}, - {STM32_PIN_PB7, STM32F3_PINMUX_FUNC_PB7_I2C1_SDA}, -#endif -#if DT_NODE_HAS_STATUS(DT_NODELABEL(i2c2), okay) && CONFIG_I2C - {STM32_PIN_PA9, STM32F3_PINMUX_FUNC_PA9_I2C2_SCL}, - {STM32_PIN_PA10, STM32F3_PINMUX_FUNC_PA10_I2C2_SDA}, -#endif -#if DT_NODE_HAS_STATUS(DT_NODELABEL(spi1), okay) && CONFIG_SPI -#ifdef CONFIG_SPI_STM32_USE_HW_SS - {STM32_PIN_PA4, STM32F3_PINMUX_FUNC_PA4_SPI1_NSS}, -#endif /* CONFIG_SPI_STM32_USE_HW_SS */ - {STM32_PIN_PA5, STM32F3_PINMUX_FUNC_PA5_SPI1_SCK}, - {STM32_PIN_PA6, STM32F3_PINMUX_FUNC_PA6_SPI1_MISO}, - {STM32_PIN_PA7, STM32F3_PINMUX_FUNC_PA7_SPI1_MOSI}, -#endif -#if DT_NODE_HAS_STATUS(DT_NODELABEL(spi2), okay) && CONFIG_SPI -#ifdef CONFIG_SPI_STM32_USE_HW_SS - {STM32_PIN_PB12, STM32F3_PINMUX_FUNC_PB12_SPI2_NSS}, -#endif /* CONFIG_SPI_STM32_USE_HW_SS */ - {STM32_PIN_PB13, STM32F3_PINMUX_FUNC_PB13_SPI2_SCK}, - {STM32_PIN_PB14, STM32F3_PINMUX_FUNC_PB14_SPI2_MISO}, - {STM32_PIN_PB15, STM32F3_PINMUX_FUNC_PB15_SPI2_MOSI}, -#endif -#ifdef CONFIG_USB_DC_STM32 - {STM32_PIN_PA11, STM32F3_PINMUX_FUNC_PA11_USB_DM}, - {STM32_PIN_PA12, STM32F3_PINMUX_FUNC_PA12_USB_DP}, -#endif /* CONFIG_USB_DC_STM32 */ -#if DT_NODE_HAS_STATUS(DT_NODELABEL(can1), okay) && CONFIG_CAN - {STM32_PIN_PD0, STM32F3_PINMUX_FUNC_PD0_CAN1_RX}, - {STM32_PIN_PD1, STM32F3_PINMUX_FUNC_PD1_CAN1_TX}, -#endif -}; - -static int pinmux_stm32_init(const struct device *port) { - ARG_UNUSED(port); - - stm32_setup_pins(pinconf, ARRAY_SIZE(pinconf)); - - return 0; -} - -SYS_INIT(pinmux_stm32_init, PRE_KERNEL_1, CONFIG_PINMUX_STM32_DEVICE_INITIALIZATION_PRIORITY); \ No newline at end of file diff --git a/app/boards/arm/planck/CMakeLists.txt b/app/boards/arm/planck/CMakeLists.txt index 6a0ec73e..91bd0988 100644 --- a/app/boards/arm/planck/CMakeLists.txt +++ b/app/boards/arm/planck/CMakeLists.txt @@ -2,8 +2,3 @@ list(APPEND EXTRA_DTC_FLAGS "-qq") -if(CONFIG_PINMUX) -zephyr_library() -zephyr_library_sources(pinmux.c) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) -endif() diff --git a/app/boards/arm/planck/pinmux.c b/app/boards/arm/planck/pinmux.c deleted file mode 100644 index 9080aa45..00000000 --- a/app/boards/arm/planck/pinmux.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2017 I-SENSE group of ICCS - * - * SPDX-License-Identifier: MIT - */ - -#include -#include -#include -#include -#include - -#include - -/* pin assignments for STM32F3DISCOVERY board */ -static const struct pin_config pinconf[] = { -#ifdef CONFIG_UART_1 - {STM32_PIN_PC4, STM32F3_PINMUX_FUNC_PC4_USART1_TX}, - {STM32_PIN_PC5, STM32F3_PINMUX_FUNC_PC5_USART1_RX}, -#endif /* CONFIG_UART_1 */ -#ifdef CONFIG_UART_2 - {STM32_PIN_PA2, STM32F3_PINMUX_FUNC_PA2_USART2_TX}, - {STM32_PIN_PA3, STM32F3_PINMUX_FUNC_PA3_USART2_RX}, -#endif /* CONFIG_UART_2 */ -#ifdef CONFIG_I2C_1 - {STM32_PIN_PB6, STM32F3_PINMUX_FUNC_PB6_I2C1_SCL}, - {STM32_PIN_PB7, STM32F3_PINMUX_FUNC_PB7_I2C1_SDA}, -#endif /* CONFIG_I2C_1 */ -#ifdef CONFIG_I2C_2 - {STM32_PIN_PA9, STM32F3_PINMUX_FUNC_PA9_I2C2_SCL}, - {STM32_PIN_PA10, STM32F3_PINMUX_FUNC_PA10_I2C2_SDA}, -#endif /* CONFIG_I2C_2 */ -#ifdef CONFIG_SPI_1 -#ifdef CONFIG_SPI_STM32_USE_HW_SS - {STM32_PIN_PA4, STM32F3_PINMUX_FUNC_PA4_SPI1_NSS}, -#endif /* CONFIG_SPI_STM32_USE_HW_SS */ - {STM32_PIN_PA5, STM32F3_PINMUX_FUNC_PA5_SPI1_SCK}, - {STM32_PIN_PA6, STM32F3_PINMUX_FUNC_PA6_SPI1_MISO}, - {STM32_PIN_PA7, STM32F3_PINMUX_FUNC_PA7_SPI1_MOSI}, -#endif /* CONFIG_SPI_1 */ -#ifdef CONFIG_SPI_2 -#ifdef CONFIG_SPI_STM32_USE_HW_SS - {STM32_PIN_PB12, STM32F3_PINMUX_FUNC_PB12_SPI2_NSS}, -#endif /* CONFIG_SPI_STM32_USE_HW_SS */ - {STM32_PIN_PB13, STM32F3_PINMUX_FUNC_PB13_SPI2_SCK}, - {STM32_PIN_PB14, STM32F3_PINMUX_FUNC_PB14_SPI2_MISO}, - {STM32_PIN_PB15, STM32F3_PINMUX_FUNC_PB15_SPI2_MOSI}, -#endif /* CONFIG_SPI_2 */ -#ifdef CONFIG_USB_DC_STM32 - {STM32_PIN_PA11, STM32F3_PINMUX_FUNC_PA11_USB_DM}, - {STM32_PIN_PA12, STM32F3_PINMUX_FUNC_PA12_USB_DP}, -#endif /* CONFIG_USB_DC_STM32 */ -#ifdef CONFIG_CAN_1 - {STM32_PIN_PD0, STM32F3_PINMUX_FUNC_PD0_CAN1_RX}, - {STM32_PIN_PD1, STM32F3_PINMUX_FUNC_PD1_CAN1_TX}, -#endif /* CONFIG_CAN_1 */ -}; - -static int pinmux_stm32_init(const struct device *port) { - ARG_UNUSED(port); - - stm32_setup_pins(pinconf, ARRAY_SIZE(pinconf)); - - return 0; -} - -SYS_INIT(pinmux_stm32_init, PRE_KERNEL_1, CONFIG_PINMUX_STM32_DEVICE_INITIALIZATION_PRIORITY); From df2e9933009bcc322188f5be1db1724aa7c00819 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 9 Nov 2021 04:19:55 +0000 Subject: [PATCH 012/494] feat(ble): Disable `BT_GATT_AUTO_SEC_REQ`. * Better compatibility w/ some operating systems, we already set security level on connects. --- app/Kconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index b60999ba..5551ed31 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -132,6 +132,9 @@ config ZMK_BLE_CLEAR_BONDS_ON_START config BT_GATT_NOTIFY_MULTIPLE default n +config BT_GATT_AUTO_SEC_REQ + default n + config BT_DEVICE_APPEARANCE default 961 From 94ac100b6b9a5d15c0d2ef881be8615ef1e4996b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 11 Dec 2021 22:39:41 -0500 Subject: [PATCH 013/494] refactor: Move to Zephyr v3.0.0 + ZMK fixes. --- .devcontainer/Dockerfile | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/hardware-metadata-validation.yml | 2 +- .github/workflows/test.yml | 2 +- app/src/behaviors/behavior_none.c | 1 - app/src/behaviors/behavior_reset.c | 2 +- app/src/behaviors/behavior_transparent.c | 1 - app/src/split_listener.c | 1 - app/west.yml | 10 ++++------ 9 files changed, 9 insertions(+), 14 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 7aed4880..21a7fd5a 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/zmkfirmware/zmk-dev-arm:2.5 +FROM docker.io/zmkfirmware/zmk-dev-arm:3.0 COPY .bashrc tmp RUN mv /tmp/.bashrc ~/.bashrc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bfb195fe..03814a48 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: if: ${{ always() }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:2.5 + image: docker.io/zmkfirmware/zmk-build-arm:3.0 needs: compile-matrix strategy: matrix: diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 5c2fd375..7b5ec927 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -29,7 +29,7 @@ jobs: validate-metadata: runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-dev-arm:2.5 + image: docker.io/zmkfirmware/zmk-dev-arm:3.0 steps: - uses: actions/checkout@v2 - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e8cdcedf..cbe60d04 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: integration_test: runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:2.5 + image: docker.io/zmkfirmware/zmk-build-arm:3.0 steps: - name: Checkout uses: actions/checkout@v2 diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c index d53a4400..1e7eb2b0 100644 --- a/app/src/behaviors/behavior_none.c +++ b/app/src/behaviors/behavior_none.c @@ -7,7 +7,6 @@ #define DT_DRV_COMPAT zmk_behavior_none #include -#include #include #include diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index 0705df73..47b11fa4 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -7,7 +7,7 @@ #define DT_DRV_COMPAT zmk_behavior_reset #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_transparent.c b/app/src/behaviors/behavior_transparent.c index 1f36e7a6..2ba05747 100644 --- a/app/src/behaviors/behavior_transparent.c +++ b/app/src/behaviors/behavior_transparent.c @@ -7,7 +7,6 @@ #define DT_DRV_COMPAT zmk_behavior_transparent #include -#include #include #include diff --git a/app/src/split_listener.c b/app/src/split_listener.c index 01cd89d9..3f3763ae 100644 --- a/app/src/split_listener.c +++ b/app/src/split_listener.c @@ -5,7 +5,6 @@ */ #include -#include #include #include diff --git a/app/west.yml b/app/west.yml index cab02a5a..964d54c8 100644 --- a/app/west.yml +++ b/app/west.yml @@ -4,12 +4,14 @@ manifest: url-base: https://github.com/zephyrproject-rtos - name: zmkfirmware url-base: https://github.com/zmkfirmware + - name: petejohanson + url-base: https://github.com/petejohanson - name: microsoft url-base: https://github.com/microsoft projects: - name: zephyr - remote: zmkfirmware - revision: v2.5.0+zmk-fixes + remote: petejohanson + revision: v3.0.0+zmk-fixes clone-depth: 1 import: # TODO: Rename once upstream offers option like `exclude` or `denylist` @@ -33,9 +35,5 @@ manifest: - openthread - edtt - trusted-firmware-m - - name: uf2 - remote: microsoft - path: tools/uf2 - clone-depth: 1 self: west-commands: scripts/west-commands.yml From 9203ae217bab6f1edcbf13f010054afc4191d14c Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 20 Feb 2022 15:08:40 -0500 Subject: [PATCH 014/494] fix(activity): Use proper PM state for sleep. --- app/src/activity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/activity.c b/app/src/activity.c index 1fa75eb5..469ccdf7 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -69,8 +69,8 @@ void activity_work_handler(struct k_work *work) { #if IS_ENABLED(CONFIG_ZMK_SLEEP) if (inactive_time > MAX_SLEEP_MS && !is_usb_power_present()) { // Put devices in low power mode before sleeping - pm_power_state_force((struct pm_state_info){PM_STATE_STANDBY, 0, 0}); set_state(ZMK_ACTIVITY_SLEEP); + pm_power_state_set((struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { From cc51562f789209e9ae7b45cb1c152181d6c37bc7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 21 Feb 2022 23:26:34 -0500 Subject: [PATCH 015/494] fix(boards): Move ARM clock config to DTS. --- app/boards/arm/bdn9/bdn9_rev2.dts | 49 ++++++++++++++------ app/boards/arm/bdn9/bdn9_rev2_defconfig | 18 ++----- app/boards/arm/ferris/ferris_rev02.dts | 20 ++++++++ app/boards/arm/ferris/ferris_rev02_defconfig | 12 +---- app/boards/arm/planck/planck_rev6.dts | 25 +++++++++- app/boards/arm/planck/planck_rev6_defconfig | 13 +----- app/boards/arm/proton_c/proton_c.dts | 36 +++++++++++++- app/boards/arm/proton_c/proton_c_defconfig | 15 +----- 8 files changed, 122 insertions(+), 66 deletions(-) diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index 3ce9758d..a28a3ae5 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -6,6 +6,7 @@ /dts-v1/; #include +#include #include / { @@ -19,7 +20,7 @@ zmk,kscan = &kscan; /* TODO: Enable once the GPIO bitbanging driver supports STM32 zmk,underglow = &led_strip; - */ + */ }; kscan: kscan { @@ -27,16 +28,16 @@ label = "KSCAN"; input-gpios - = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; /* @@ -48,7 +49,7 @@ chain-length = <9>; }; - */ + */ left_encoder: encoder_left { compatible = "alps,ec11"; @@ -82,8 +83,28 @@ }; }; +&clk_hsi { + status = "okay"; +}; + +&pll { + status = "okay"; + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; +}; + &usb { status = "okay"; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; cdc_acm_uart: cdc_acm_uart { compatible = "zephyr,cdc-acm-uart"; label = "CDC_ACM_0"; @@ -97,7 +118,7 @@ &flash0 { /* * For more information, see: - * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions */ partitions { compatible = "fixed-partitions"; @@ -105,7 +126,7 @@ #size-cells = <1>; /* Set 6Kb of storage at the end of the 128Kb of flash */ - storage_partition: partition@3e800 { + storage_partition: partition@1e800 { label = "storage"; reg = <0x0001e800 0x00001800>; }; diff --git a/app/boards/arm/bdn9/bdn9_rev2_defconfig b/app/boards/arm/bdn9/bdn9_rev2_defconfig index 31395716..24dddb93 100644 --- a/app/boards/arm/bdn9/bdn9_rev2_defconfig +++ b/app/boards/arm/bdn9/bdn9_rev2_defconfig @@ -11,11 +11,11 @@ CONFIG_FPU=y # enable GPIO CONFIG_GPIO=y -# Needed for matrix to properly work -CONFIG_ZMK_KSCAN_DIRECT_POLLING=y +# Enable pinctrl +CONFIG_PINCTRL=y -# Enable pinmux -CONFIG_PINMUX=y +# Poll to avoid interrupt overlap issues +CONFIG_ZMK_KSCAN_DIRECT_POLLING=y # Needed to reduce this to size that will fit on F072 CONFIG_HEAP_MEM_POOL_SIZE=1024 @@ -23,13 +23,3 @@ CONFIG_HEAP_MEM_POOL_SIZE=1024 # clock configuration CONFIG_CLOCK_CONTROL=y -# Clock configuration for Cube Clock control driver -CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y -# use HSI as PLL input -CONFIG_CLOCK_STM32_PLL_SRC_HSI=y -# produce 72MHz clock at PLL output -CONFIG_CLOCK_STM32_PLL_PREDIV=1 -CONFIG_CLOCK_STM32_PLL_MULTIPLIER=12 -CONFIG_CLOCK_STM32_AHB_PRESCALER=1 -CONFIG_CLOCK_STM32_APB1_PRESCALER=2 -CONFIG_CLOCK_STM32_APB2_PRESCALER=1 diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 45c57dff..dbf3f6e2 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -99,6 +99,7 @@ &i2c2 { pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; + pinctrl-names = "default"; status = "okay"; clock-frequency = ; @@ -117,6 +118,25 @@ status = "okay"; }; +&clk_hsi { + status = "okay"; +}; + +&pll { + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; +}; + + &rtc { status = "okay"; cdc_acm_uart: cdc_acm_uart { diff --git a/app/boards/arm/ferris/ferris_rev02_defconfig b/app/boards/arm/ferris/ferris_rev02_defconfig index 99c0b329..8742cd86 100644 --- a/app/boards/arm/ferris/ferris_rev02_defconfig +++ b/app/boards/arm/ferris/ferris_rev02_defconfig @@ -7,7 +7,7 @@ CONFIG_SOC_STM32F072XB=y CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=48000000 # enable PINMUX -CONFIG_PINMUX=y +CONFIG_PINCTRL=y # enable GPIO CONFIG_GPIO=y @@ -31,13 +31,3 @@ CONFIG_HEAP_MEM_POOL_SIZE=1024 # clock configuration CONFIG_CLOCK_CONTROL=y -# Clock configuration for Cube Clock control driver -CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y -# use HSI as PLL input -CONFIG_CLOCK_STM32_PLL_SRC_HSI=y -# produce 48MHz clock at PLL output -# CONFIG_CLOCK_STM32_PLL_PREDIV=1 -CONFIG_CLOCK_STM32_PLL_MULTIPLIER=6 -CONFIG_CLOCK_STM32_AHB_PRESCALER=1 -CONFIG_CLOCK_STM32_APB1_PRESCALER=1 -# CONFIG_CLOCK_STM32_APB2_PRESCALER=1 diff --git a/app/boards/arm/planck/planck_rev6.dts b/app/boards/arm/planck/planck_rev6.dts index ea45f33b..97239595 100644 --- a/app/boards/arm/planck/planck_rev6.dts +++ b/app/boards/arm/planck/planck_rev6.dts @@ -1,11 +1,12 @@ /* - * Copyright (c) 2017 I-SENSE group of ICCS + * Copyright (c) 2020 The ZMK Contributors * * SPDX-License-Identifier: MIT */ /dts-v1/; #include +#include #include / { @@ -83,6 +84,8 @@ layout_2x2u_transform: }; &usb { + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; status = "okay"; cdc_acm_uart: cdc_acm_uart { compatible = "zephyr,cdc-acm-uart"; @@ -90,6 +93,26 @@ layout_2x2u_transform: }; }; +&clk_hse { + status = "okay"; + clock-frequency = ; +}; + +&pll { + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; +}; + &flash0 { /* * For more information, see: diff --git a/app/boards/arm/planck/planck_rev6_defconfig b/app/boards/arm/planck/planck_rev6_defconfig index e34ce002..a78ea45d 100644 --- a/app/boards/arm/planck/planck_rev6_defconfig +++ b/app/boards/arm/planck/planck_rev6_defconfig @@ -8,21 +8,10 @@ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 # enable pinmux CONFIG_PINMUX=y +CONFIG_PINCTRL=y # enable GPIO CONFIG_GPIO=y # clock configuration CONFIG_CLOCK_CONTROL=y - -# Clock configuration for Cube Clock control driver -CONFIG_CLOCK_STM32_HSE_CLOCK=8000000 -CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y -# use HSE as PLL input -CONFIG_CLOCK_STM32_PLL_SRC_HSE=y -# produce 72MHz clock at PLL output -CONFIG_CLOCK_STM32_PLL_PREDIV=1 -CONFIG_CLOCK_STM32_PLL_MULTIPLIER=9 -CONFIG_CLOCK_STM32_AHB_PRESCALER=1 -CONFIG_CLOCK_STM32_APB1_PRESCALER=2 -CONFIG_CLOCK_STM32_APB2_PRESCALER=1 diff --git a/app/boards/arm/proton_c/proton_c.dts b/app/boards/arm/proton_c/proton_c.dts index 5a367d40..df63427f 100644 --- a/app/boards/arm/proton_c/proton_c.dts +++ b/app/boards/arm/proton_c/proton_c.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Pete Johanson + * Copyright (c) 2020 The ZMK Contributors * * SPDX-License-Identifier: MIT */ @@ -16,6 +16,11 @@ chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart0; + }; + + aliases { + led0 = &led; }; leds { @@ -29,18 +34,47 @@ &usart1 { pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; + pinctrl-names = "default"; }; &spi2 { pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; + pinctrl-names = "default"; }; &i2c1 { pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>; + pinctrl-names = "default"; +}; + +&clk_hse { + status = "okay"; + clock-frequency = ; +}; + +&pll { + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; }; &usb { + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; status = "okay"; + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { diff --git a/app/boards/arm/proton_c/proton_c_defconfig b/app/boards/arm/proton_c/proton_c_defconfig index 0f624616..32e1ade9 100644 --- a/app/boards/arm/proton_c/proton_c_defconfig +++ b/app/boards/arm/proton_c/proton_c_defconfig @@ -8,8 +8,8 @@ CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 # Floating Point Options CONFIG_FPU=y -# enable pinmux -CONFIG_PINMUX=y +# enable pinctrl +CONFIG_PINCTRL=y # enable GPIO CONFIG_GPIO=y @@ -17,14 +17,3 @@ CONFIG_GPIO=y # clock configuration CONFIG_CLOCK_CONTROL=y -# Clock configuration for Cube Clock control driver -CONFIG_CLOCK_STM32_HSE_CLOCK=8000000 -CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y -# use HSE as PLL input -CONFIG_CLOCK_STM32_PLL_SRC_HSE=y -# produce 72MHz clock at PLL output -CONFIG_CLOCK_STM32_PLL_PREDIV=1 -CONFIG_CLOCK_STM32_PLL_MULTIPLIER=9 -CONFIG_CLOCK_STM32_AHB_PRESCALER=1 -CONFIG_CLOCK_STM32_APB1_PRESCALER=2 -CONFIG_CLOCK_STM32_APB2_PRESCALER=1 From 4eb8f8cd23df49d366034da674293bef01c2aacd Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 22 Feb 2022 12:03:34 -0500 Subject: [PATCH 016/494] refactor(boards): Use Zephyr UF2 generation. --- app/boards/arm/bluemicro840/CMakeLists.txt | 8 -------- app/boards/arm/bluemicro840/bluemicro840_v1_defconfig | 1 + app/boards/arm/bt60/CMakeLists.txt | 8 -------- app/boards/arm/bt60/bt60_v1_defconfig | 1 + app/boards/arm/bt60/bt60_v1_hs_defconfig | 1 + app/boards/arm/mikoto/CMakeLists.txt | 8 -------- app/boards/arm/mikoto/mikoto_520_defconfig | 1 + app/boards/arm/nice60/CMakeLists.txt | 8 -------- app/boards/arm/nice60/nice60_defconfig | 1 + app/boards/arm/nice_nano/CMakeLists.txt | 8 -------- app/boards/arm/nice_nano/nice_nano_defconfig | 1 + app/boards/arm/nice_nano/nice_nano_v2_defconfig | 1 + app/boards/arm/nrf52840_m2/CMakeLists.txt | 11 ----------- app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig | 1 + app/boards/arm/nrfmicro/CMakeLists.txt | 8 -------- app/boards/arm/nrfmicro/nrfmicro_11_defconfig | 1 + app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig | 1 + app/boards/arm/nrfmicro/nrfmicro_13_defconfig | 1 + app/boards/arm/s40nc/CMakeLists.txt | 8 -------- app/boards/arm/s40nc/s40nc_defconfig | 1 + 20 files changed, 12 insertions(+), 67 deletions(-) delete mode 100644 app/boards/arm/bluemicro840/CMakeLists.txt delete mode 100644 app/boards/arm/bt60/CMakeLists.txt delete mode 100644 app/boards/arm/nice60/CMakeLists.txt delete mode 100644 app/boards/arm/nice_nano/CMakeLists.txt delete mode 100644 app/boards/arm/nrf52840_m2/CMakeLists.txt delete mode 100644 app/boards/arm/s40nc/CMakeLists.txt diff --git a/app/boards/arm/bluemicro840/CMakeLists.txt b/app/boards/arm/bluemicro840/CMakeLists.txt deleted file mode 100644 index 00952c30..00000000 --- a/app/boards/arm/bluemicro840/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x26000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig index 96f03ca4..b8e4e805 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig +++ b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig @@ -11,6 +11,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/bt60/CMakeLists.txt b/app/boards/arm/bt60/CMakeLists.txt deleted file mode 100644 index 00952c30..00000000 --- a/app/boards/arm/bt60/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x26000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) diff --git a/app/boards/arm/bt60/bt60_v1_defconfig b/app/boards/arm/bt60/bt60_v1_defconfig index 0f13395b..813dcece 100644 --- a/app/boards/arm/bt60/bt60_v1_defconfig +++ b/app/boards/arm/bt60/bt60_v1_defconfig @@ -15,6 +15,7 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/bt60/bt60_v1_hs_defconfig b/app/boards/arm/bt60/bt60_v1_hs_defconfig index 27a22490..f2327fd3 100644 --- a/app/boards/arm/bt60/bt60_v1_hs_defconfig +++ b/app/boards/arm/bt60/bt60_v1_hs_defconfig @@ -15,6 +15,7 @@ CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/mikoto/CMakeLists.txt b/app/boards/arm/mikoto/CMakeLists.txt index cd4843af..12cf9b1c 100644 --- a/app/boards/arm/mikoto/CMakeLists.txt +++ b/app/boards/arm/mikoto/CMakeLists.txt @@ -1,11 +1,3 @@ -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x26000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) if(CONFIG_PINMUX) zephyr_library() diff --git a/app/boards/arm/mikoto/mikoto_520_defconfig b/app/boards/arm/mikoto/mikoto_520_defconfig index 925711c0..d5fd8958 100644 --- a/app/boards/arm/mikoto/mikoto_520_defconfig +++ b/app/boards/arm/mikoto/mikoto_520_defconfig @@ -11,6 +11,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/nice60/CMakeLists.txt b/app/boards/arm/nice60/CMakeLists.txt deleted file mode 100644 index f833ff2e..00000000 --- a/app/boards/arm/nice60/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x1000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) diff --git a/app/boards/arm/nice60/nice60_defconfig b/app/boards/arm/nice60/nice60_defconfig index 3a3a978f..9fac3a30 100644 --- a/app/boards/arm/nice60/nice60_defconfig +++ b/app/boards/arm/nice60/nice60_defconfig @@ -12,6 +12,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/nice_nano/CMakeLists.txt b/app/boards/arm/nice_nano/CMakeLists.txt deleted file mode 100644 index 00952c30..00000000 --- a/app/boards/arm/nice_nano/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x26000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) diff --git a/app/boards/arm/nice_nano/nice_nano_defconfig b/app/boards/arm/nice_nano/nice_nano_defconfig index 393d61fe..1ff025ec 100644 --- a/app/boards/arm/nice_nano/nice_nano_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_defconfig @@ -11,6 +11,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/nice_nano/nice_nano_v2_defconfig b/app/boards/arm/nice_nano/nice_nano_v2_defconfig index d061e389..206e51c2 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_v2_defconfig @@ -11,6 +11,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/nrf52840_m2/CMakeLists.txt b/app/boards/arm/nrf52840_m2/CMakeLists.txt deleted file mode 100644 index 044f93cd..00000000 --- a/app/boards/arm/nrf52840_m2/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x26000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig index 2f563c38..b7671ba9 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig @@ -12,6 +12,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/nrfmicro/CMakeLists.txt b/app/boards/arm/nrfmicro/CMakeLists.txt index cd4843af..12cf9b1c 100644 --- a/app/boards/arm/nrfmicro/CMakeLists.txt +++ b/app/boards/arm/nrfmicro/CMakeLists.txt @@ -1,11 +1,3 @@ -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x26000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) if(CONFIG_PINMUX) zephyr_library() diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig index c1ac8364..3f6a447d 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig @@ -11,6 +11,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig index b35cb791..efe924f2 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig @@ -11,6 +11,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig index cac11642..06758784 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig @@ -11,6 +11,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y diff --git a/app/boards/arm/s40nc/CMakeLists.txt b/app/boards/arm/s40nc/CMakeLists.txt deleted file mode 100644 index f833ff2e..00000000 --- a/app/boards/arm/s40nc/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -set_property(GLOBAL APPEND PROPERTY extra_post_build_commands - COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/../tools/uf2/utils/uf2conv.py - -c - -b 0x1000 - -f 0xADA52840 - -o ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.uf2 - ${PROJECT_BINARY_DIR}/${CONFIG_KERNEL_BIN_NAME}.bin -) diff --git a/app/boards/arm/s40nc/s40nc_defconfig b/app/boards/arm/s40nc/s40nc_defconfig index e9bbfc17..31972781 100644 --- a/app/boards/arm/s40nc/s40nc_defconfig +++ b/app/boards/arm/s40nc/s40nc_defconfig @@ -12,6 +12,7 @@ CONFIG_ARM_MPU=y CONFIG_GPIO=y CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y CONFIG_MPU_ALLOW_FLASH_WRITE=y CONFIG_NVS=y From 917c6a06602cdd428dc995c9799b72bd070179d3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 23 Feb 2022 19:17:31 +0000 Subject: [PATCH 017/494] fix(power): Fix ext power generic driver. * Adjust for device API changes to fetch ext power driver instance from settings callback. * New PM action callback API. --- app/src/ext_power_generic.c | 49 ++++++++++--------------------------- 1 file changed, 13 insertions(+), 36 deletions(-) diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 367cf3a2..3f83bd95 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -32,9 +33,6 @@ struct ext_power_generic_data { #if IS_ENABLED(CONFIG_SETTINGS) bool settings_init; #endif -#ifdef CONFIG_PM_DEVICE - uint32_t pm_state; -#endif }; #if IS_ENABLED(CONFIG_SETTINGS) @@ -94,7 +92,7 @@ static int ext_power_settings_set(const char *name, size_t len, settings_read_cb int rc; if (settings_name_steq(name, DT_INST_LABEL(0), &next) && !next) { - const struct device *ext_power = device_get_binding(DT_INST_LABEL(0)); + const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; if (len != sizeof(data->status)) { @@ -142,10 +140,6 @@ static int ext_power_generic_init(const struct device *dev) { return -EIO; } -#ifdef CONFIG_PM_DEVICE - data->pm_state = DEVICE_PM_ACTIVE_STATE; -#endif - #if IS_ENABLED(CONFIG_SETTINGS) settings_subsys_init(); @@ -179,35 +173,17 @@ static int ext_power_generic_init(const struct device *dev) { } #ifdef CONFIG_PM_DEVICE -static int ext_power_generic_pm_control(const struct device *dev, uint32_t ctrl_command, - void *context, device_pm_cb cb, void *arg) { - int rc; - struct ext_power_generic_data *data = dev->data; - - switch (ctrl_command) { - case DEVICE_PM_SET_POWER_STATE: - if (*((uint32_t *)context) == DEVICE_PM_ACTIVE_STATE) { - data->pm_state = DEVICE_PM_ACTIVE_STATE; - rc = 0; - } else { - ext_power_generic_disable(dev); - data->pm_state = DEVICE_PM_LOW_POWER_STATE; - rc = 0; - } - break; - case DEVICE_PM_GET_POWER_STATE: - *((uint32_t *)context) = data->pm_state; - rc = 0; - break; +static int ext_power_generic_pm_action(const struct device *dev, enum pm_device_action action) { + switch (action) { + case PM_DEVICE_ACTION_TURN_ON: + ext_power_generic_enable(dev); + return 0; + case PM_DEVICE_ACTION_TURN_OFF: + ext_power_generic_disable(dev); + return 0; default: - rc = -EINVAL; + return -ENOTSUP; } - - if (cb != NULL) { - cb(dev, rc, context, arg); - } - - return rc; } #endif /* CONFIG_PM_DEVICE */ @@ -230,7 +206,8 @@ static const struct ext_power_api api = {.enable = ext_power_generic_enable, #define ZMK_EXT_POWER_INIT_PRIORITY 81 -DEVICE_DT_INST_DEFINE(0, ext_power_generic_init, &ext_power_generic_pm_control, &data, &config, +PM_DEVICE_DT_INST_DEFINE(0, ext_power_generic_pm_action); +DEVICE_DT_INST_DEFINE(0, ext_power_generic_init, PM_DEVICE_DT_INST_GET(0), &data, &config, POST_KERNEL, ZMK_EXT_POWER_INIT_PRIORITY, &api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ From 5015a88545c43d10822407d12a095889622865be Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 1 Mar 2022 03:46:43 +0000 Subject: [PATCH 018/494] fix(split): Proper role checking in BT callbacks. * Properly react to events only for connections with the correct role. --- app/src/ble.c | 18 +++++++++++++++++- app/src/split/bluetooth/central.c | 17 ++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/app/src/ble.c b/app/src/ble.c index a930cadc..d9121583 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -377,9 +377,17 @@ static bool is_conn_active_profile(const struct bt_conn *conn) { static void connected(struct bt_conn *conn, uint8_t err) { char addr[BT_ADDR_LE_STR_LEN]; - bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); + struct bt_conn_info info; LOG_DBG("Connected thread: %p", k_current_get()); + bt_conn_get_info(conn, &info); + + if (info.role != BT_CONN_ROLE_PERIPHERAL) { + LOG_DBG("SKIPPING FOR ROLE %d", info.role); + return; + } + + bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); advertising_status = ZMK_ADV_NONE; if (err) { @@ -408,11 +416,19 @@ static void connected(struct bt_conn *conn, uint8_t err) { static void disconnected(struct bt_conn *conn, uint8_t reason) { char addr[BT_ADDR_LE_STR_LEN]; + struct bt_conn_info info; bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); LOG_DBG("Disconnected from %s (reason 0x%02x)", log_strdup(addr), reason); + bt_conn_get_info(conn, &info); + + if (info.role != BT_CONN_ROLE_PERIPHERAL) { + LOG_DBG("SKIPPING FOR ROLE %d", info.role); + return; + } + // We need to do this in a work callback, otherwise the advertising update will still see the // connection for a profile as active, and not start advertising yet. k_work_submit(&update_advertising_work); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 07ab35a0..7eacc675 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -395,6 +395,8 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { } else { param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); + LOG_DBG("Initiating new connnection"); + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); if (err) { LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, @@ -445,9 +447,17 @@ static int start_scan(void) { static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { char addr[BT_ADDR_LE_STR_LEN]; + struct bt_conn_info info; bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); + bt_conn_get_info(conn, &info); + + if (info.role != BT_CONN_ROLE_CENTRAL) { + LOG_DBG("SKIPPING FOR ROLE %d", info.role); + return; + } + if (conn_err) { LOG_ERR("Failed to connect to %s (%u)", log_strdup(addr), conn_err); @@ -465,12 +475,17 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { char addr[BT_ADDR_LE_STR_LEN]; + int err; bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); LOG_DBG("Disconnected: %s (reason %d)", log_strdup(addr), reason); - release_peripheral_slot_for_conn(conn); + err = release_peripheral_slot_for_conn(conn); + + if (err < 0) { + return; + } start_scan(); } From 9368f6200cb778a09c93c0fa6b9182f79d4c3874 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 10 Mar 2022 15:03:20 -0500 Subject: [PATCH 019/494] fix(display): Add zephyr,display chosen nodes. --- app/boards/shields/corne/corne.dtsi | 1 + app/boards/shields/jorne/jorne.dtsi | 1 + app/boards/shields/knob_goblin/knob_goblin.overlay | 1 + app/boards/shields/kyria/kyria_common.dtsi | 3 ++- app/boards/shields/lily58/lily58.dtsi | 1 + app/boards/shields/lotus58/lotus58.dtsi | 3 ++- app/boards/shields/microdox/microdox.dtsi | 1 + app/boards/shields/murphpad/murphpad.overlay | 1 + app/boards/shields/nibble/nibble.overlay | 1 + app/boards/shields/sofle/sofle.dtsi | 3 ++- app/boards/shields/tidbit/tidbit.dtsi | 1 + app/boards/shields/zodiark/zodiark.dtsi | 3 ++- 12 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index 167c0916..e81afcf8 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index a84798cc..6f43393d 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/shields/knob_goblin/knob_goblin.overlay b/app/boards/shields/knob_goblin/knob_goblin.overlay index 82cc3dc3..d3ba8c5b 100644 --- a/app/boards/shields/knob_goblin/knob_goblin.overlay +++ b/app/boards/shields/knob_goblin/knob_goblin.overlay @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; }; diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index 479f090c..c52ab05a 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -44,7 +45,7 @@ &pro_micro_i2c { status = "okay"; - ssd1306@3c { + oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; label = "DISPLAY"; diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 8e8ed3f2..4efa1069 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/shields/lotus58/lotus58.dtsi b/app/boards/shields/lotus58/lotus58.dtsi index fb0d174f..1df0bf38 100644 --- a/app/boards/shields/lotus58/lotus58.dtsi +++ b/app/boards/shields/lotus58/lotus58.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -71,7 +72,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 &pro_micro_i2c { status = "okay"; - ssd1306@3c { + oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; label = "DISPLAY"; diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index d489430e..b8d47b2a 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index 25bd10f9..c66f2aef 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; }; diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index 9e2fced8..13f2c2fe 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/shields/sofle/sofle.dtsi b/app/boards/shields/sofle/sofle.dtsi index 9646b59d..71dc04d8 100644 --- a/app/boards/shields/sofle/sofle.dtsi +++ b/app/boards/shields/sofle/sofle.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -71,7 +72,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) &pro_micro_i2c { status = "okay"; - ssd1306@3c { + oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; label = "DISPLAY"; diff --git a/app/boards/shields/tidbit/tidbit.dtsi b/app/boards/shields/tidbit/tidbit.dtsi index 2b08ad49..ba97a57a 100644 --- a/app/boards/shields/tidbit/tidbit.dtsi +++ b/app/boards/shields/tidbit/tidbit.dtsi @@ -90,6 +90,7 @@ }; chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/shields/zodiark/zodiark.dtsi b/app/boards/shields/zodiark/zodiark.dtsi index 0adb7f67..cda0b1a6 100644 --- a/app/boards/shields/zodiark/zodiark.dtsi +++ b/app/boards/shields/zodiark/zodiark.dtsi @@ -8,6 +8,7 @@ / { chosen { + zephyr,display = &oled; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -71,7 +72,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R &pro_micro_i2c { status = "okay"; - ssd1306@3c { + oled: ssd1306@3c { compatible = "solomon,ssd1306fb"; reg = <0x3c>; label = "DISPLAY"; From 97e62f2da5bf8c4500aab4887bef02d912bb0137 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 14 Mar 2022 22:23:20 -0400 Subject: [PATCH 020/494] feat(boards): Add Seeed(uino) XIAO interconnect * Document the Seeed(uino) XIAO interconnect * Add metadata files for two upstream boards, XIAO and XIAO BLE. * Add conf and overlay files to properly configure the boards for ZMK use. --- .../arm/seeeduino_xiao/seeeduino_xiao.zmk.yml | 9 +++++ .../seeeduino_xiao_ble.zmk.yml | 10 ++++++ .../seeed_xiao/seeed_xiao.zmk.yml | 10 ++++++ app/boards/seeeduino_xiao.conf | 5 +++ app/boards/seeeduino_xiao.overlay | 19 +++++++++++ app/boards/seeeduino_xiao_ble.conf | 8 +++++ app/boards/seeeduino_xiao_ble.overlay | 33 +++++++++++++++++++ 7 files changed, 94 insertions(+) create mode 100644 app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml create mode 100644 app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml create mode 100644 app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml create mode 100644 app/boards/seeeduino_xiao.conf create mode 100644 app/boards/seeeduino_xiao.overlay create mode 100644 app/boards/seeeduino_xiao_ble.conf create mode 100644 app/boards/seeeduino_xiao_ble.overlay diff --git a/app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml b/app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml new file mode 100644 index 00000000..1225fb31 --- /dev/null +++ b/app/boards/arm/seeeduino_xiao/seeeduino_xiao.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: seeeduino_xiao +name: Seeeduino XIAO +type: board +arch: arm +outputs: + - usb +url: https://wiki.seeedstudio.com/Seeeduino-XIAO/ +exposes: [seeed_xiao] diff --git a/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml b/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml new file mode 100644 index 00000000..360bd04b --- /dev/null +++ b/app/boards/arm/seeeduino_xiao_ble/seeeduino_xiao_ble.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: seeeduino_xiao_ble +name: Seeeduino XIAO BLE +type: board +arch: arm +outputs: + - usb + - ble +url: https://wiki.seeedstudio.com/XIAO_BLE/ +exposes: [seeed_xiao] diff --git a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml new file mode 100644 index 00000000..cb9f6b56 --- /dev/null +++ b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: seeed_xiao +name: Seeed XIAO +type: interconnect +url: https://wiki.seeedstudio.com/Seeeduino-XIAO/ +manufacturer: Seeed +description: | + The Seeed(uino) XIAO is a popular smaller format micro-controller, that has gained popularity as an alterative + to the SparkFun Pro Micro. Since its creation, several pin compatible controllers, such + as the Seeeduino XIAO BLE, Adafruit QT Py and Adafruit QT Py RP2040, have become available. diff --git a/app/boards/seeeduino_xiao.conf b/app/boards/seeeduino_xiao.conf new file mode 100644 index 00000000..f0db8ed1 --- /dev/null +++ b/app/boards/seeeduino_xiao.conf @@ -0,0 +1,5 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y diff --git a/app/boards/seeeduino_xiao.overlay b/app/boards/seeeduino_xiao.overlay new file mode 100644 index 00000000..70080286 --- /dev/null +++ b/app/boards/seeeduino_xiao.overlay @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + }; +}; + +&usb0 { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + diff --git a/app/boards/seeeduino_xiao_ble.conf b/app/boards/seeeduino_xiao_ble.conf new file mode 100644 index 00000000..92367028 --- /dev/null +++ b/app/boards/seeeduino_xiao_ble.conf @@ -0,0 +1,8 @@ + +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay new file mode 100644 index 00000000..7e0d4ff9 --- /dev/null +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + }; + + vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 510000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&usbd { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + From 35db784b5db48f8ce6d9cd3944c226d697d04312 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 15 Mar 2022 00:29:23 -0400 Subject: [PATCH 021/494] fix: Change detection fixes for interconnect files. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 03814a48..999aad3a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -249,7 +249,7 @@ jobs: } break; case "interconnect": - break; + return []; } }); }))).flat(); From 953f5212a8c225745284bb3f86e13b1fd7505eb5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 24 Mar 2022 11:38:14 +0000 Subject: [PATCH 022/494] refactor(tests): Move to native_posix_64 target. * Allows removing multilib from docker images * Run properly in aarch64 host docker containers for testing on Rasberry Pi. * Small sticky-keys fix to initialize w/ correct constant for max uin32_t value. --- app/boards/native_posix_64.conf | 11 +++++++++++ app/boards/native_posix_64.overlay | 18 ++++++++++++++++++ app/run-test.sh | 4 ++-- app/src/behaviors/behavior_sticky_key.c | 2 +- ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 .../native_posix_64.keymap | 17 +++++++++++++++++ ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 .../native_posix_64.keymap | 13 +++++++++++++ ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 ...{native_posix.conf => native_posix_64.conf} | 0 ...ive_posix.keymap => native_posix_64.keymap} | 0 179 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 app/boards/native_posix_64.conf create mode 100644 app/boards/native_posix_64.overlay rename app/tests/backlight/basic/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/backlight/basic/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/backlight/config-brt/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/backlight/config-brt/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/backlight/config-on/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/backlight/config-on/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/backlight/config-step/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/backlight/config-step/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/backlight/cycle/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/backlight/cycle/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/backlight/low-brightness/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/backlight/low-brightness/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/caps-word/continue-with-non-alpha-continue-list-item/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/caps-word/continue-with-non-modified-numeric-usage-id/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/caps-word/deactivate-by-non-alpha-non-continuation/{native_posix.keymap => native_posix_64.keymap} (100%) create mode 100644 app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap rename app/tests/combo/combos-and-holdtaps-0/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/combos-and-holdtaps-1/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/combos-and-holdtaps-2/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/layer-filter-0/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/layer-filter-1/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/multiple-timeouts/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/overlapping-combos-0/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/overlapping-combos-1/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/overlapping-combos-2/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/overlapping-combos-3/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/partially-overlapping-combos/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press-release-long-combo-complete/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press-release-long-combo-incomplete/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press-release-long-combo-wrong-last-key/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press-timeout/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press1-press2-release1-release2/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press1-press2-release2-release1/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/press1-release1-press2-release2/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/slowrelease-disabled/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/combo/slowrelease-enabled/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/conditional-layer/chained-activation/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/conditional-layer/mo-overlap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/conditional-layer/multiple-configs/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/conditional-layer/quad-layer/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/conditional-layer/tri-layer-alt-order/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/conditional-layer/tri-layer/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/gresc/gresc-press-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/gresc/gresc-two-instances/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/1-dn-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/2-dn-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/5-quick-tap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/6-retro-tap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/balanced/many-nested/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/1-dn-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/2-dn-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/5-quick-tap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/6-retro-tap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/1-dn-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/2-dn-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/5-quick-tap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/6-nested-timeouts/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/1-dn-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/key-repeat/ignore-other-usage-page-events/{native_posix.keymap => native_posix_64.keymap} (100%) create mode 100644 app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap rename app/tests/key-repeat/press-and-release-with-explicit-modifiers/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/keypress/kp-press-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/macros/basic/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/macros/mo-plus-modifier-from-hold-tap/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/macros/mo-plus-modifier-macro/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/macros/press-mid-macro/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/macros/press-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/macros/timing-override/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/macros/wait-macro-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/momentary-layer/1-normal/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/momentary-layer/2-early-key-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/momentary-layer/3-covered/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/momentary-layer/4-nested/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/momentary-layer/5-nested-early-key-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/none/layered/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/1-os-dn-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/10-callum-mods/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/10-sl-sl-kp/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/8-lsk-osk-combination/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/sticky-keys/9-sk-dn-up-dn-up/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/1a-tap1/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/1b-tap2/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/1c-tap3/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/2a-hold1/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/2b-hold2/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/2c-hold3/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/3a-tap-int-mid/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/3b-tap-int-seq/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/3c-tap-int-after/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/3d-hold-int-mid/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/3e-hold-int-seq/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/3f-hold-int-after/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/4a-single/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/5a-tdint-mid/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/5b-tdint-seq/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/5c-tdint-after/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/tap-dance/5d-tdint-multiple/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/to-layer/normal/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/toggle-layer/early-key-release/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/toggle-layer/normal/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/transparent/layered/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/transparent/normal/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/wpm/1-single_keypress/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/wpm/1-single_keypress/{native_posix.keymap => native_posix_64.keymap} (100%) rename app/tests/wpm/2-multiple_keypress/{native_posix.conf => native_posix_64.conf} (100%) rename app/tests/wpm/2-multiple_keypress/{native_posix.keymap => native_posix_64.keymap} (100%) diff --git a/app/boards/native_posix_64.conf b/app/boards/native_posix_64.conf new file mode 100644 index 00000000..7d3e62b7 --- /dev/null +++ b/app/boards/native_posix_64.conf @@ -0,0 +1,11 @@ +CONFIG_KSCAN=n +CONFIG_ZMK_KSCAN_MOCK_DRIVER=y +CONFIG_ZMK_KSCAN_GPIO_DRIVER=n +CONFIG_GPIO=n +# Enable to have the native posix build expose USBIP device(s) +# CONFIG_ZMK_USB=y +CONFIG_LOG=y +CONFIG_LOG_BACKEND_SHOW_COLOR=n +CONFIG_ZMK_LOG_LEVEL_DBG=y +CONFIG_DEBUG=y +CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 diff --git a/app/boards/native_posix_64.overlay b/app/boards/native_posix_64.overlay new file mode 100644 index 00000000..2c1ed79d --- /dev/null +++ b/app/boards/native_posix_64.overlay @@ -0,0 +1,18 @@ +#include +#include +#include + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; + + rows = <2>; + columns = <2>; + exit-after; + }; +}; diff --git a/app/run-test.sh b/app/run-test.sh index da4803d6..9777f185 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -13,7 +13,7 @@ if [ $path = "all" ]; then path="tests" fi -testcases=$(find $path -name native_posix.keymap -exec dirname \{\} \;) +testcases=$(find $path -name native_posix_64.keymap -exec dirname \{\} \;) num_cases=$(echo "$testcases" | wc -l) if [ $num_cases -gt 1 ]; then echo "" > ./build/tests/pass-fail.log @@ -26,7 +26,7 @@ fi testcase="$path" echo "Running $testcase:" -west build -d build/$testcase -b native_posix -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1 +west build -d build/$testcase -b native_posix_64 -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1 if [ $? -gt 0 ]; then echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log exit 1 diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 186a92d2..904a84fe 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -26,7 +26,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define ZMK_BHV_STICKY_KEY_MAX_HELD 10 -#define ZMK_BHV_STICKY_KEY_POSITION_FREE ULONG_MAX +#define ZMK_BHV_STICKY_KEY_POSITION_FREE UINT32_MAX struct behavior_sticky_key_config { uint32_t release_after_ms; diff --git a/app/tests/backlight/basic/native_posix.conf b/app/tests/backlight/basic/native_posix_64.conf similarity index 100% rename from app/tests/backlight/basic/native_posix.conf rename to app/tests/backlight/basic/native_posix_64.conf diff --git a/app/tests/backlight/basic/native_posix.keymap b/app/tests/backlight/basic/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/basic/native_posix.keymap rename to app/tests/backlight/basic/native_posix_64.keymap diff --git a/app/tests/backlight/config-brt/native_posix.conf b/app/tests/backlight/config-brt/native_posix_64.conf similarity index 100% rename from app/tests/backlight/config-brt/native_posix.conf rename to app/tests/backlight/config-brt/native_posix_64.conf diff --git a/app/tests/backlight/config-brt/native_posix.keymap b/app/tests/backlight/config-brt/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/config-brt/native_posix.keymap rename to app/tests/backlight/config-brt/native_posix_64.keymap diff --git a/app/tests/backlight/config-on/native_posix.conf b/app/tests/backlight/config-on/native_posix_64.conf similarity index 100% rename from app/tests/backlight/config-on/native_posix.conf rename to app/tests/backlight/config-on/native_posix_64.conf diff --git a/app/tests/backlight/config-on/native_posix.keymap b/app/tests/backlight/config-on/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/config-on/native_posix.keymap rename to app/tests/backlight/config-on/native_posix_64.keymap diff --git a/app/tests/backlight/config-step/native_posix.conf b/app/tests/backlight/config-step/native_posix_64.conf similarity index 100% rename from app/tests/backlight/config-step/native_posix.conf rename to app/tests/backlight/config-step/native_posix_64.conf diff --git a/app/tests/backlight/config-step/native_posix.keymap b/app/tests/backlight/config-step/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/config-step/native_posix.keymap rename to app/tests/backlight/config-step/native_posix_64.keymap diff --git a/app/tests/backlight/cycle/native_posix.conf b/app/tests/backlight/cycle/native_posix_64.conf similarity index 100% rename from app/tests/backlight/cycle/native_posix.conf rename to app/tests/backlight/cycle/native_posix_64.conf diff --git a/app/tests/backlight/cycle/native_posix.keymap b/app/tests/backlight/cycle/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/cycle/native_posix.keymap rename to app/tests/backlight/cycle/native_posix_64.keymap diff --git a/app/tests/backlight/low-brightness/native_posix.conf b/app/tests/backlight/low-brightness/native_posix_64.conf similarity index 100% rename from app/tests/backlight/low-brightness/native_posix.conf rename to app/tests/backlight/low-brightness/native_posix_64.conf diff --git a/app/tests/backlight/low-brightness/native_posix.keymap b/app/tests/backlight/low-brightness/native_posix_64.keymap similarity index 100% rename from app/tests/backlight/low-brightness/native_posix.keymap rename to app/tests/backlight/low-brightness/native_posix_64.keymap diff --git a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix.keymap b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap similarity index 100% rename from app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix.keymap rename to app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap diff --git a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix.keymap b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap similarity index 100% rename from app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix.keymap rename to app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap diff --git a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix.keymap b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap similarity index 100% rename from app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix.keymap rename to app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap new file mode 100644 index 00000000..e0695564 --- /dev/null +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10000) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,30) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,1000) + >; +}; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-0/native_posix.keymap rename to app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-1/native_posix.keymap rename to app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap diff --git a/app/tests/combo/combos-and-holdtaps-2/native_posix.keymap b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap similarity index 100% rename from app/tests/combo/combos-and-holdtaps-2/native_posix.keymap rename to app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap diff --git a/app/tests/combo/layer-filter-0/native_posix.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap similarity index 100% rename from app/tests/combo/layer-filter-0/native_posix.keymap rename to app/tests/combo/layer-filter-0/native_posix_64.keymap diff --git a/app/tests/combo/layer-filter-1/native_posix.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap similarity index 100% rename from app/tests/combo/layer-filter-1/native_posix.keymap rename to app/tests/combo/layer-filter-1/native_posix_64.keymap diff --git a/app/tests/combo/multiple-timeouts/native_posix.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap similarity index 100% rename from app/tests/combo/multiple-timeouts/native_posix.keymap rename to app/tests/combo/multiple-timeouts/native_posix_64.keymap diff --git a/app/tests/combo/overlapping-combos-0/native_posix.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-0/native_posix.keymap rename to app/tests/combo/overlapping-combos-0/native_posix_64.keymap diff --git a/app/tests/combo/overlapping-combos-1/native_posix.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-1/native_posix.keymap rename to app/tests/combo/overlapping-combos-1/native_posix_64.keymap diff --git a/app/tests/combo/overlapping-combos-2/native_posix.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-2/native_posix.keymap rename to app/tests/combo/overlapping-combos-2/native_posix_64.keymap diff --git a/app/tests/combo/overlapping-combos-3/native_posix.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap similarity index 100% rename from app/tests/combo/overlapping-combos-3/native_posix.keymap rename to app/tests/combo/overlapping-combos-3/native_posix_64.keymap diff --git a/app/tests/combo/partially-overlapping-combos/native_posix.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap similarity index 100% rename from app/tests/combo/partially-overlapping-combos/native_posix.keymap rename to app/tests/combo/partially-overlapping-combos/native_posix_64.keymap diff --git a/app/tests/combo/press-release-long-combo-complete/native_posix.keymap b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press-release-long-combo-complete/native_posix.keymap rename to app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press-release-long-combo-incomplete/native_posix.keymap rename to app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap diff --git a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix.keymap b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press-release-long-combo-wrong-last-key/native_posix.keymap rename to app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap diff --git a/app/tests/combo/press-release/native_posix.keymap b/app/tests/combo/press-release/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press-release/native_posix.keymap rename to app/tests/combo/press-release/native_posix_64.keymap diff --git a/app/tests/combo/press-timeout/native_posix.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press-timeout/native_posix.keymap rename to app/tests/combo/press-timeout/native_posix_64.keymap diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press1-press2-release1-release2/native_posix.keymap rename to app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press1-press2-release2-release1/native_posix.keymap rename to app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap similarity index 100% rename from app/tests/combo/press1-release1-press2-release2/native_posix.keymap rename to app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap diff --git a/app/tests/combo/slowrelease-disabled/native_posix.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap similarity index 100% rename from app/tests/combo/slowrelease-disabled/native_posix.keymap rename to app/tests/combo/slowrelease-disabled/native_posix_64.keymap diff --git a/app/tests/combo/slowrelease-enabled/native_posix.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap similarity index 100% rename from app/tests/combo/slowrelease-enabled/native_posix.keymap rename to app/tests/combo/slowrelease-enabled/native_posix_64.keymap diff --git a/app/tests/conditional-layer/chained-activation/native_posix.keymap b/app/tests/conditional-layer/chained-activation/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/chained-activation/native_posix.keymap rename to app/tests/conditional-layer/chained-activation/native_posix_64.keymap diff --git a/app/tests/conditional-layer/mo-overlap/native_posix.keymap b/app/tests/conditional-layer/mo-overlap/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/mo-overlap/native_posix.keymap rename to app/tests/conditional-layer/mo-overlap/native_posix_64.keymap diff --git a/app/tests/conditional-layer/multiple-configs/native_posix.keymap b/app/tests/conditional-layer/multiple-configs/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/multiple-configs/native_posix.keymap rename to app/tests/conditional-layer/multiple-configs/native_posix_64.keymap diff --git a/app/tests/conditional-layer/quad-layer/native_posix.keymap b/app/tests/conditional-layer/quad-layer/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/quad-layer/native_posix.keymap rename to app/tests/conditional-layer/quad-layer/native_posix_64.keymap diff --git a/app/tests/conditional-layer/tri-layer-alt-order/native_posix.keymap b/app/tests/conditional-layer/tri-layer-alt-order/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer-alt-order/native_posix.keymap rename to app/tests/conditional-layer/tri-layer-alt-order/native_posix_64.keymap diff --git a/app/tests/conditional-layer/tri-layer/native_posix.keymap b/app/tests/conditional-layer/tri-layer/native_posix_64.keymap similarity index 100% rename from app/tests/conditional-layer/tri-layer/native_posix.keymap rename to app/tests/conditional-layer/tri-layer/native_posix_64.keymap diff --git a/app/tests/gresc/gresc-press-release/native_posix.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap similarity index 100% rename from app/tests/gresc/gresc-press-release/native_posix.keymap rename to app/tests/gresc/gresc-press-release/native_posix_64.keymap diff --git a/app/tests/gresc/gresc-two-instances/native_posix.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap similarity index 100% rename from app/tests/gresc/gresc-two-instances/native_posix.keymap rename to app/tests/gresc/gresc-two-instances/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/1-dn-up/native_posix.keymap rename to app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/2-dn-timer-up/native_posix.keymap rename to app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix.keymap rename to app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix.keymap b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix.keymap rename to app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/5-quick-tap/native_posix.keymap rename to app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/6-retro-tap/native_posix.keymap rename to app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix.keymap rename to app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix.keymap rename to app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/many-nested/native_posix.keymap rename to app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/1-dn-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix.keymap b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix.keymap rename to app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/1-dn-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix.keymap b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix.keymap rename to app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix.keymap rename to app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap diff --git a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix.keymap b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/ignore-other-usage-page-events/native_posix.keymap rename to app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap new file mode 100644 index 00000000..42f6514b --- /dev/null +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap @@ -0,0 +1,13 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,1,9000) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,30) + ZMK_MOCK_RELEASE(0,0,3000) + >; +}; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix.keymap b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix.keymap rename to app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap diff --git a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix.keymap b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap similarity index 100% rename from app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix.keymap rename to app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap diff --git a/app/tests/keypress/kp-press-release/native_posix.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap similarity index 100% rename from app/tests/keypress/kp-press-release/native_posix.keymap rename to app/tests/keypress/kp-press-release/native_posix_64.keymap diff --git a/app/tests/macros/basic/native_posix.keymap b/app/tests/macros/basic/native_posix_64.keymap similarity index 100% rename from app/tests/macros/basic/native_posix.keymap rename to app/tests/macros/basic/native_posix_64.keymap diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap similarity index 100% rename from app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix.keymap rename to app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap similarity index 100% rename from app/tests/macros/mo-plus-modifier-macro/native_posix.keymap rename to app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap diff --git a/app/tests/macros/press-mid-macro/native_posix.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap similarity index 100% rename from app/tests/macros/press-mid-macro/native_posix.keymap rename to app/tests/macros/press-mid-macro/native_posix_64.keymap diff --git a/app/tests/macros/press-release/native_posix.keymap b/app/tests/macros/press-release/native_posix_64.keymap similarity index 100% rename from app/tests/macros/press-release/native_posix.keymap rename to app/tests/macros/press-release/native_posix_64.keymap diff --git a/app/tests/macros/timing-override/native_posix.keymap b/app/tests/macros/timing-override/native_posix_64.keymap similarity index 100% rename from app/tests/macros/timing-override/native_posix.keymap rename to app/tests/macros/timing-override/native_posix_64.keymap diff --git a/app/tests/macros/wait-macro-release/native_posix.keymap b/app/tests/macros/wait-macro-release/native_posix_64.keymap similarity index 100% rename from app/tests/macros/wait-macro-release/native_posix.keymap rename to app/tests/macros/wait-macro-release/native_posix_64.keymap diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix.keymap rename to app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix.keymap rename to app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix.keymap rename to app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix.keymap rename to app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix.keymap rename to app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap similarity index 100% rename from app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix.keymap rename to app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap diff --git a/app/tests/momentary-layer/1-normal/native_posix.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap similarity index 100% rename from app/tests/momentary-layer/1-normal/native_posix.keymap rename to app/tests/momentary-layer/1-normal/native_posix_64.keymap diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap similarity index 100% rename from app/tests/momentary-layer/2-early-key-release/native_posix.keymap rename to app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap diff --git a/app/tests/momentary-layer/3-covered/native_posix.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap similarity index 100% rename from app/tests/momentary-layer/3-covered/native_posix.keymap rename to app/tests/momentary-layer/3-covered/native_posix_64.keymap diff --git a/app/tests/momentary-layer/4-nested/native_posix.keymap b/app/tests/momentary-layer/4-nested/native_posix_64.keymap similarity index 100% rename from app/tests/momentary-layer/4-nested/native_posix.keymap rename to app/tests/momentary-layer/4-nested/native_posix_64.keymap diff --git a/app/tests/momentary-layer/5-nested-early-key-release/native_posix.keymap b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap similarity index 100% rename from app/tests/momentary-layer/5-nested-early-key-release/native_posix.keymap rename to app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap diff --git a/app/tests/none/layered/native_posix.keymap b/app/tests/none/layered/native_posix_64.keymap similarity index 100% rename from app/tests/none/layered/native_posix.keymap rename to app/tests/none/layered/native_posix_64.keymap diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/1-os-dn-up/native_posix.keymap rename to app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/10-callum-mods/native_posix.keymap rename to app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/10-sl-sl-kp/native_posix.keymap rename to app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix.keymap rename to app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix.keymap rename to app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix.keymap rename to app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix.keymap rename to app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix.keymap rename to app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix.keymap rename to app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix.keymap rename to app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix.keymap rename to app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/8-lsk-osk-combination/native_posix.keymap rename to app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap similarity index 100% rename from app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix.keymap rename to app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap diff --git a/app/tests/tap-dance/1a-tap1/native_posix.keymap b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/1a-tap1/native_posix.keymap rename to app/tests/tap-dance/1a-tap1/native_posix_64.keymap diff --git a/app/tests/tap-dance/1b-tap2/native_posix.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/1b-tap2/native_posix.keymap rename to app/tests/tap-dance/1b-tap2/native_posix_64.keymap diff --git a/app/tests/tap-dance/1c-tap3/native_posix.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/1c-tap3/native_posix.keymap rename to app/tests/tap-dance/1c-tap3/native_posix_64.keymap diff --git a/app/tests/tap-dance/2a-hold1/native_posix.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/2a-hold1/native_posix.keymap rename to app/tests/tap-dance/2a-hold1/native_posix_64.keymap diff --git a/app/tests/tap-dance/2b-hold2/native_posix.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/2b-hold2/native_posix.keymap rename to app/tests/tap-dance/2b-hold2/native_posix_64.keymap diff --git a/app/tests/tap-dance/2c-hold3/native_posix.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/2c-hold3/native_posix.keymap rename to app/tests/tap-dance/2c-hold3/native_posix_64.keymap diff --git a/app/tests/tap-dance/3a-tap-int-mid/native_posix.keymap b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3a-tap-int-mid/native_posix.keymap rename to app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap diff --git a/app/tests/tap-dance/3b-tap-int-seq/native_posix.keymap b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3b-tap-int-seq/native_posix.keymap rename to app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap diff --git a/app/tests/tap-dance/3c-tap-int-after/native_posix.keymap b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3c-tap-int-after/native_posix.keymap rename to app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap diff --git a/app/tests/tap-dance/3d-hold-int-mid/native_posix.keymap b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3d-hold-int-mid/native_posix.keymap rename to app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap diff --git a/app/tests/tap-dance/3e-hold-int-seq/native_posix.keymap b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3e-hold-int-seq/native_posix.keymap rename to app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap diff --git a/app/tests/tap-dance/3f-hold-int-after/native_posix.keymap b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/3f-hold-int-after/native_posix.keymap rename to app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap diff --git a/app/tests/tap-dance/4a-single/native_posix.keymap b/app/tests/tap-dance/4a-single/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/4a-single/native_posix.keymap rename to app/tests/tap-dance/4a-single/native_posix_64.keymap diff --git a/app/tests/tap-dance/5a-tdint-mid/native_posix.keymap b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5a-tdint-mid/native_posix.keymap rename to app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap diff --git a/app/tests/tap-dance/5b-tdint-seq/native_posix.keymap b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5b-tdint-seq/native_posix.keymap rename to app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap diff --git a/app/tests/tap-dance/5c-tdint-after/native_posix.keymap b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5c-tdint-after/native_posix.keymap rename to app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap diff --git a/app/tests/tap-dance/5d-tdint-multiple/native_posix.keymap b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap similarity index 100% rename from app/tests/tap-dance/5d-tdint-multiple/native_posix.keymap rename to app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap diff --git a/app/tests/to-layer/normal/native_posix.keymap b/app/tests/to-layer/normal/native_posix_64.keymap similarity index 100% rename from app/tests/to-layer/normal/native_posix.keymap rename to app/tests/to-layer/normal/native_posix_64.keymap diff --git a/app/tests/toggle-layer/early-key-release/native_posix.keymap b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap similarity index 100% rename from app/tests/toggle-layer/early-key-release/native_posix.keymap rename to app/tests/toggle-layer/early-key-release/native_posix_64.keymap diff --git a/app/tests/toggle-layer/normal/native_posix.keymap b/app/tests/toggle-layer/normal/native_posix_64.keymap similarity index 100% rename from app/tests/toggle-layer/normal/native_posix.keymap rename to app/tests/toggle-layer/normal/native_posix_64.keymap diff --git a/app/tests/transparent/layered/native_posix.keymap b/app/tests/transparent/layered/native_posix_64.keymap similarity index 100% rename from app/tests/transparent/layered/native_posix.keymap rename to app/tests/transparent/layered/native_posix_64.keymap diff --git a/app/tests/transparent/normal/native_posix.keymap b/app/tests/transparent/normal/native_posix_64.keymap similarity index 100% rename from app/tests/transparent/normal/native_posix.keymap rename to app/tests/transparent/normal/native_posix_64.keymap diff --git a/app/tests/wpm/1-single_keypress/native_posix.conf b/app/tests/wpm/1-single_keypress/native_posix_64.conf similarity index 100% rename from app/tests/wpm/1-single_keypress/native_posix.conf rename to app/tests/wpm/1-single_keypress/native_posix_64.conf diff --git a/app/tests/wpm/1-single_keypress/native_posix.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap similarity index 100% rename from app/tests/wpm/1-single_keypress/native_posix.keymap rename to app/tests/wpm/1-single_keypress/native_posix_64.keymap diff --git a/app/tests/wpm/2-multiple_keypress/native_posix.conf b/app/tests/wpm/2-multiple_keypress/native_posix_64.conf similarity index 100% rename from app/tests/wpm/2-multiple_keypress/native_posix.conf rename to app/tests/wpm/2-multiple_keypress/native_posix_64.conf diff --git a/app/tests/wpm/2-multiple_keypress/native_posix.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap similarity index 100% rename from app/tests/wpm/2-multiple_keypress/native_posix.keymap rename to app/tests/wpm/2-multiple_keypress/native_posix_64.keymap From 3c4ff9c82cd8265961b702dbe9cc61156912f6e9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 25 Mar 2022 02:34:08 +0000 Subject: [PATCH 023/494] fix(docs): Proper links to new SDK version. --- docs/docs/development/setup.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/docs/development/setup.md b/docs/docs/development/setup.md index 00a484b3..26d667b6 100644 --- a/docs/docs/development/setup.md +++ b/docs/docs/development/setup.md @@ -280,10 +280,10 @@ platform. To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: ``` -export ZSDK_VERSION=0.12.4 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-x86_64-linux-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-x86_64-linux-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-x86_64-linux-setup.run" +export ZSDK_VERSION=0.13.2 +wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ + sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ + rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" ``` The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. @@ -315,10 +315,10 @@ export CROSS_COMPILE=/usr/bin/arm-none-eabi- To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: ``` -export ZSDK_VERSION=0.12.4 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-x86_64-linux-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-x86_64-linux-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-x86_64-linux-setup.run" +export ZSDK_VERSION=0.13.2 +wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ + sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ + rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" ``` The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. From f4fb5c6fbaf9f97aab997d876549f5f588956752 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 28 Mar 2022 11:57:51 -0400 Subject: [PATCH 024/494] fix(build): Add local vendor prefix file. Properly document `zmk` local vendor prefix. --- app/dts/bindings/vendor-prefixes.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/dts/bindings/vendor-prefixes.txt diff --git a/app/dts/bindings/vendor-prefixes.txt b/app/dts/bindings/vendor-prefixes.txt new file mode 100644 index 00000000..72066dfb --- /dev/null +++ b/app/dts/bindings/vendor-prefixes.txt @@ -0,0 +1 @@ +zmk ZMK Project \ No newline at end of file From b4db1b893be1f51476a44b8ec8bd36ab6cbc3a0f Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 9 Mar 2022 04:44:20 +0000 Subject: [PATCH 025/494] feat(blog): Add Zephyr 3.0 upgrade post. --- docs/blog/2022-04-02-zephyr-3-0.md | 219 +++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 docs/blog/2022-04-02-zephyr-3-0.md diff --git a/docs/blog/2022-04-02-zephyr-3-0.md b/docs/blog/2022-04-02-zephyr-3-0.md new file mode 100644 index 00000000..19785790 --- /dev/null +++ b/docs/blog/2022-04-02-zephyr-3-0.md @@ -0,0 +1,219 @@ +--- +title: "Zephyr 3.0 Update" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [firmware, zephyr, core] +--- + +I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/1143) to upgrade ZMK to [Zephyr 3.0](https://docs.zephyrproject.org/3.0.0/releases/release-notes-3.0.html)! + +[petejohanson] did the upgrade work to adjust ZMK for the Zephyr changes. + +- Moving to Zephyr's UF2 build integration that was submitted upstream by [petejohanson] +- Additional `color-mapping` property needed for ws2812 LED strep devicetree nodes +- Zephyr core API changes, including delayed work, USB/HID +- Adjust for pinctrl changes on stm32 +- Fixes for power management and log formatter changes + +## Getting The Changes + +Use the following steps to update to the latest tooling in order to properly use the new ZMK changes: + +### User Config Repositories Using GitHub Actions + +Existing user config repositories using Github Actions to build will pull down Zephyr 3.0 automatically, however to build properly, the repository needs to be updated to use the `stable` Docker image tag for the build: + +- Open `.github/workflows/build.yml` in your editor/IDE +- Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found + +:::note + +If you created your user config repository a while ago, you may find that your `build.yml` file instead references +a `zephyr-west-action-arm` custom GitHub Action instead. In this case, the upgrade is not as direct. We suggest that +instead you [re-create your config repository](/docs/user-setup) to get an updated setup using the new automation +approach. + +::: + +### VS Code & Docker (Dev Container) + +If you build locally using VS Code & Docker then: + +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- reload the project +- if you are prompted to rebuild the remote container, click `Rebuild` +- otherwise, press `F1` and run `Remote Containers: Rebuild Container` +- Once the container has rebuilt and reloaded, run `west update` to pull the updated Zephyr version and its dependencies. + +Once the container has rebuilt, VS Code will be running the 3.0 Docker image. + +### Local Host Development + +The following steps will get you building ZMK locally against Zephyr 3.0: + +- Run the updated [toolchain installation](/docs/development/setup#toolchain-installation) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- run `west update` to pull the updated Zephyr version and its dependencies + +From there, you should be ready to build as normal! + +## Board/Shield Changes + +The following changes have [already been completed](https://github.com/zmkfirmware/zmk/pull/1143/commits) for all boards/shields in ZMK `main` branch. For existing or new PRs, or out of tree boards, the following changes are necessary to properly work with the latest changes. + +### RGB Underglow + +Zephyr's WS2812 `led_strip` driver added a new required property. When adding [underglow](/docs/features/underglow#adding-rgb-underglow-to-a-board) to a board, you now must also add a `color-mapping` property, like: + +``` +led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* number of LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; +}; +``` + +:::note + +Standard WS2812 LEDs use a wire protocol where the bits for the colors green, red, and blue values are sent in that order. +If your board/shield uses LEDs that require the data sent in a different order, the `color-mapping` property ordering should be changed to match. + +::: + +### Display Selection + +Zephyr moved to using a `chosen` node named `zephyr,display` to select the display device to be used with LVGL, the underlying display library we use. + +For example, for a shield with: + +``` +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "SSD1306"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-invdir; + segment-remap; + com-sequential; + prechargep = <0x22>; + }; +}; +``` + +You would add a `chosen` node like: + +``` +/ { + chosen { + zephyr,display = &oled; + }; +}; +``` + +### USB Logging + +Zephyr unified the way the console/logging device is selected, removing the hacks that special-cased the USB CDC ACM output. +Now, the CDC ACM device is configured in the devicetree as well. To ensure that USB logging properly works with custom board definitions, +two sections of the `.dts` file need updating. + +Underneath the USB device, add the CDC ACM node: + +``` +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; +``` + +Then, an additional `chosen` node (near the top of the file) will mark the CDC ACM device as the console: + +``` +/ { + chosen { + ... + zephyr,console = &cdc_acm_uart; + }; + ... +}; +``` + +### UF2 Builds + +Previously, to get ZMK to build a UF2 image to flash to a given board required adding a `CMakeLists.txt` file that added a custom post build command. +Now, the only thing necessary to have Zephyr build a UF2 is to add the following to your `_defconfig` file: + +``` +CONFIG_BUILD_OUTPUT_UF2=y +``` + +If updating an existing board, be sure to remove the previous `CMakeLists.txt` file to avoid generating the UF2 twice during a `west build`. + +For more details on the implementation, see [zephyr#31066](https://github.com/zephyrproject-rtos/zephyr/pull/31066). + +### STM32 Clock Configuration + +Clock configuration moved to devicetree as well, out of the Kconfig files. Here is a sample config for a board that uses the HSI for the PLL source: + +``` +&clk_hsi { + status = "okay"; +}; + +&pll { + prediv = <1>; + mul = <12>; + clocks = <&clk_hsi>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; +}; +``` + +After adding the nodes, be sure to remove the clock/PLL related configuration from the `_defconfig` file. + +## Seeeduino XIAO + +The Seeed(uino) XIAO has gained in popularity for use on smaller boards, and gained more traction with the release of the new XIAO BLE board, +powered by the popular nRF52840 SoC. As part of the 3.0 update, we've also more fully integrated the XIAO and XIAO BLE to make it easier to +build keyboard (shields) using either controller. + +## Future Hardware + +One of the exciting items that's one step closer as part of this work is [support for Raspberry Pi Pico/RP2040](https://github.com/zmkfirmware/zmk/issues/1085). +With Zephyr 3.0 merged, this start the process for getting those controllers/chips supported by ZMK. Follow the issue to keep track of progress. +This will also enable us to support the XIAO compatible Adafruit Qt Py RP2040 and XIAO RP2040. + +## Thanks! + +Thanks to all the testers who have helped verify ZMK functionality on the newer Zephyr version. + +[petejohanson]: https://github.com/petejohanson From af4753cae1197c1410c59a5321a9ccce02071fc9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 3 Apr 2022 04:37:42 +0000 Subject: [PATCH 026/494] fix(behaviors): Missed refactor for PM callback. --- app/src/behaviors/behavior_backlight.c | 2 +- app/src/behaviors/behavior_key_repeat.c | 7 +++---- app/src/behaviors/behavior_macro.c | 4 ++-- app/src/behaviors/behavior_tap_dance.c | 6 +++--- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app/src/behaviors/behavior_backlight.c b/app/src/behaviors/behavior_backlight.c index 8876c1f1..a1eaaf86 100644 --- a/app/src/behaviors/behavior_backlight.c +++ b/app/src/behaviors/behavior_backlight.c @@ -91,7 +91,7 @@ static const struct behavior_driver_api behavior_backlight_driver_api = { .locality = BEHAVIOR_LOCALITY_GLOBAL, }; -DEVICE_DT_INST_DEFINE(0, behavior_backlight_init, device_pm_control_nop, NULL, NULL, APPLICATION, +DEVICE_DT_INST_DEFINE(0, behavior_backlight_init, NULL, NULL, NULL, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_backlight_driver_api); #endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_key_repeat.c b/app/src/behaviors/behavior_key_repeat.c index 22de37d9..ad29cb0a 100644 --- a/app/src/behaviors/behavior_key_repeat.c +++ b/app/src/behaviors/behavior_key_repeat.c @@ -116,10 +116,9 @@ static int behavior_key_repeat_init(const struct device *dev) { .usage_pages = DT_INST_PROP(n, usage_pages), \ .usage_pages_count = DT_INST_PROP_LEN(n, usage_pages), \ }; \ - DEVICE_DT_INST_DEFINE(n, behavior_key_repeat_init, device_pm_control_nop, \ - &behavior_key_repeat_data_##n, &behavior_key_repeat_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_key_repeat_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_key_repeat_init, NULL, &behavior_key_repeat_data_##n, \ + &behavior_key_repeat_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_key_repeat_driver_api); DT_INST_FOREACH_STATUS_OKAY(KR_INST) diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 92ee2c43..a6430a53 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -178,8 +178,8 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, 100), \ .count = DT_INST_PROP_LEN(n, bindings), \ .bindings = TRANSFORMED_BEHAVIORS(n)}; \ - DEVICE_DT_INST_DEFINE(n, behavior_macro_init, device_pm_control_nop, \ - &behavior_macro_state_##n, &behavior_macro_config_##n, APPLICATION, \ + DEVICE_DT_INST_DEFINE(n, behavior_macro_init, NULL, &behavior_macro_state_##n, \ + &behavior_macro_config_##n, APPLICATION, \ CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); DT_INST_FOREACH_STATUS_OKAY(MACRO_INST) diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 5a0cd9e7..3bad2901 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -250,9 +250,9 @@ static int behavior_tap_dance_init(const struct device *dev) { .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ .behaviors = behavior_tap_dance_config_##n##_bindings, \ .behavior_count = DT_INST_PROP_LEN(n, bindings)}; \ - DEVICE_DT_INST_DEFINE(n, behavior_tap_dance_init, device_pm_control_nop, NULL, \ - &behavior_tap_dance_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_tap_dance_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_tap_dance_init, NULL, NULL, &behavior_tap_dance_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_tap_dance_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) From 140c9c546df5ad08d473d4464f4a171dddaff7db Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 3 Apr 2022 05:10:37 +0000 Subject: [PATCH 027/494] fix(blog): Add note about DTS output step. * The DTS output step needs to be removed for the builds. --- docs/blog/2022-04-02-zephyr-3-0.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/blog/2022-04-02-zephyr-3-0.md b/docs/blog/2022-04-02-zephyr-3-0.md index 19785790..0785a334 100644 --- a/docs/blog/2022-04-02-zephyr-3-0.md +++ b/docs/blog/2022-04-02-zephyr-3-0.md @@ -27,6 +27,15 @@ Existing user config repositories using Github Actions to build will pull down Z - Open `.github/workflows/build.yml` in your editor/IDE - Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found +- Locate and delete the lines for the DTS output step, which is no longer needed: + + ``` + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + ``` :::note From fbe0e822dc3a637d039ffc5f51f7bf8e0a7a42f1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 3 Apr 2022 05:31:05 +0000 Subject: [PATCH 028/494] fix(blog): Whitespace issue w/ blog addition. --- docs/blog/2022-04-02-zephyr-3-0.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/blog/2022-04-02-zephyr-3-0.md b/docs/blog/2022-04-02-zephyr-3-0.md index 0785a334..44a4fa72 100644 --- a/docs/blog/2022-04-02-zephyr-3-0.md +++ b/docs/blog/2022-04-02-zephyr-3-0.md @@ -29,13 +29,13 @@ Existing user config repositories using Github Actions to build will pull down Z - Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found - Locate and delete the lines for the DTS output step, which is no longer needed: - ``` - - name: ${{ steps.variables.outputs.display-name }} DTS File - if: ${{ always() }} - run: | - if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi - if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi - ``` + ``` + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + ``` :::note From 27ba5fdfb3f8d828636a2f433603268ddf30fa3b Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 11 Feb 2022 21:23:23 -0800 Subject: [PATCH 029/494] fix(docs): Improve powershell command for setup script for failure cases --- docs/docs/user-setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index de47680f..faa4bef8 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -82,7 +82,7 @@ bash -c "$(wget https://zmk.dev/setup.sh -O -)" '' --wget ``` -iex ((New-Object System.Net.WebClient).DownloadString('https://zmk.dev/setup.ps1')) +powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://zmk.dev/setup.ps1'))" ``` From 3eb3548a00c6fdfcfed6e94cecbc5e3667709cb3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 3 Apr 2022 04:17:36 +0000 Subject: [PATCH 030/494] refactor(tests): Use GH Actions matrix for tests. * To parallelize our tests, generate a dynamic matrix of tests to run. --- .github/workflows/test.yml | 24 +++++++++++++++++++++--- app/run-test.sh | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cbe60d04..61bf7183 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,24 @@ on: - "app/src/**" jobs: - integration_test: + collect-tests: + outputs: + test-dirs: ${{ steps.test-dirs.outputs.test-dirs }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Find test directories + id: test-dirs + run: | + cd app/tests/ + export TESTS=$(ls -d * | jq -R -s -c 'split("\n")[:-1]') + echo "::set-output name=test-dirs::${TESTS}" + run-tests: + needs: collect-tests + strategy: + matrix: + test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} runs-on: ubuntu-latest container: image: docker.io/zmkfirmware/zmk-build-arm:3.0 @@ -43,8 +60,9 @@ jobs: run: west update - name: Export Zephyr CMake package (west zephyr-export) run: west zephyr-export - - name: Test all - run: west test + - name: Test ${{ matrix.test }} + working-directory: app + run: west test tests/${{ matrix.test }} - name: Archive artifacts if: ${{ always() }} uses: actions/upload-artifact@v2 diff --git a/app/run-test.sh b/app/run-test.sh index 9777f185..068fdbb4 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -15,7 +15,7 @@ fi testcases=$(find $path -name native_posix_64.keymap -exec dirname \{\} \;) num_cases=$(echo "$testcases" | wc -l) -if [ $num_cases -gt 1 ]; then +if [ $num_cases -gt 1 ] || [ "$testcases" != "$path" ]; then echo "" > ./build/tests/pass-fail.log echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh err=$? From e77c3fc8d15f7f23487d650f511c56998570f9a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Apr 2022 03:37:35 +0000 Subject: [PATCH 031/494] chore(deps): bump axios from 0.21.1 to 0.21.4 in /docs Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index d8d3cf9b..73487897 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8402,11 +8402,11 @@ } }, "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dependencies": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "node_modules/babel-plugin-apply-mdx-type-prop": { @@ -27530,11 +27530,11 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "babel-plugin-apply-mdx-type-prop": { From ec80a8139e3af5468ccadabf8d3f75fedfd83129 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 03:04:46 +0000 Subject: [PATCH 032/494] chore(deps): bump minimist from 1.2.5 to 1.2.6 in /docs Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 73487897..8356ebeb 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -14751,9 +14751,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -32384,9 +32384,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mixin-deep": { "version": "1.3.2", From 089602fec0847b2a1fd49e434b8c9083f1dcc0a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Feb 2022 02:49:18 +0000 Subject: [PATCH 033/494] chore(deps): bump url-parse from 1.4.7 to 1.5.10 in /docs Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.10. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.10) --- updated-dependencies: - dependency-name: url-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 8356ebeb..9c95a130 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -19904,9 +19904,9 @@ } }, "node_modules/url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -20774,15 +20774,6 @@ "node": ">=0.10.0" } }, - "node_modules/webpack-dev-server/node_modules/url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/webpack-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", @@ -36253,9 +36244,9 @@ } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -36917,15 +36908,6 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1" } - }, - "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } } } }, From 60d367cbb9ca085316986a40b90b32f7a6c08fe0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 5 Apr 2022 16:25:49 +0000 Subject: [PATCH 034/494] refactor(docs): Bump to docusaurus 2.0.0-beta.18 * Fix up the config to use proper locations. --- docs/docusaurus.config.js | 9 +- docs/package-lock.json | 34503 ++++++------------------------------ docs/package.json | 8 +- 3 files changed, 5641 insertions(+), 28879 deletions(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index b1c1b5c0..536fa922 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -19,10 +19,6 @@ module.exports = { colorMode: { respectPrefersColorScheme: true, }, - googleAnalytics: { - trackingID: "UA-145201102-2", - anonymizeIP: true, - }, // sidebarCollapsible: false, navbar: { title: "ZMK Firmware", @@ -109,6 +105,7 @@ module.exports = { copyright: `Copyright © ${new Date().getFullYear()} ZMK Project Contributors. Creative Commons License`, }, algolia: { + appId: "USXLDJ14JE", apiKey: "75325855fc90356828fe212d38e5ca34", indexName: "zmkfirmware", }, @@ -117,6 +114,10 @@ module.exports = { [ "@docusaurus/preset-classic", { + googleAnalytics: { + trackingID: "UA-145201102-2", + anonymizeIP: true, + }, docs: { // It is recommended to set document id as docs home page (`docs/` path). sidebarPath: require.resolve("./sidebars.js"), diff --git a/docs/package-lock.json b/docs/package-lock.json index 9c95a130..24e40eaa 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -1,21241 +1,156 @@ { "name": "docs", "version": "0.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "docs", - "version": "0.0.0", - "dependencies": { - "@docusaurus/core": "^2.0.0-beta.3", - "@docusaurus/preset-classic": "^2.0.0-beta.3", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.16", - "@mdx-js/react": "^1.6.22", - "classnames": "^2.2.6", - "js-yaml": "^4.1.0", - "react": "^17.0.2", - "react-async": "^10.0.1", - "react-copy-to-clipboard": "^5.0.3", - "react-dom": "^17.0.2", - "react-toastify": "^7.0.4", - "web-tree-sitter": "^0.19.4" - }, - "devDependencies": { - "@docusaurus/module-type-aliases": "^2.0.0-beta.3", - "@docusaurus/types": "^2.0.0-beta.3", - "@tsconfig/docusaurus": "^1.0.2", - "@types/js-yaml": "^4.0.5", - "@types/react": "^17.0.3", - "@types/react-helmet": "^6.1.0", - "@types/react-router-dom": "^5.1.7", - "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-mdx": "^1.13.0", - "eslint-plugin-react": "^7.28.0", - "json-schema-to-typescript": "^10.1.5", - "mustache": "^4.2.0", - "null-loader": "^4.0.0", - "prebuild-webpack-plugin": "^1.1.1", - "prettier": "2.3.1", - "string-replace-loader": "^3.0.3", - "typescript": "^4.2.3", - "webpack": "^5.46.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.1.tgz", - "integrity": "sha512-/SLS6636Wpl7eFiX7eEy0E3wBo60sUm1qRYybJBDt1fs8reiJ1+OSy+dZgrLBfLL4mSFqRIIUHXbVp25QdZ+iw==", - "dependencies": { - "@algolia/autocomplete-shared": "1.2.1" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.1.tgz", - "integrity": "sha512-Lf4PpPVgHNXm1ytrnVdrZYV7hAYSCpAI/TrebF8UC6xflPY6sKb1RL/2OfrO9On7SDjPBtNd+6MArSar5JmK0g==", - "dependencies": { - "@algolia/autocomplete-shared": "1.2.1" - }, - "peerDependencies": { - "@algolia/client-search": "^4.9.1", - "algoliasearch": "^4.9.1" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.1.tgz", - "integrity": "sha512-RHCwcXAYFwDXTlomstjWRFIzOfyxtQ9KmViacPE5P5hxUSSjkmG3dAb77xdydift1PaZNbho5TNTCi5UZe0RpA==" - }, - "node_modules/@algolia/client-personalization": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.3.tgz", - "integrity": "sha512-NS7Nx8EJ/nduGXT8CFo5z7kLF0jnFehTP3eC+z+GOEESH3rrs7uR12IZHxv5QhQswZa9vl925zCOZDcDVoENCg==", - "dependencies": { - "@algolia/client-common": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/cache-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.3.tgz", - "integrity": "sha512-q13cPPUmtf8a2suBC4kySSr97EyulSXuxUkn7l1tZUCX/k1y5KNheMp8npBy8Kc8gPPmHpacxddRSfOncjiKFw==" - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.3.tgz", - "integrity": "sha512-uFyP2Z14jG2hsFRbAoavna6oJf4NTXaSDAZgouZUZlHlBp5elM38sjNeA5HR9/D9J/GjwaB1SgB7iUiIWYBB4w==", - "dependencies": { - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/logger-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.3.tgz", - "integrity": "sha512-M6xi+qov2bkgg1H9e1Qtvq/E/eKsGcgz8RBbXNzqPIYoDGZNkv+b3b8YMo3dxd4Wd6M24HU1iqF3kmr1LaXndg==" - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/requester-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.3.tgz", - "integrity": "sha512-PNfLHmg0Hujugs3rx55uz/ifv7b9HVdSFQDb2hj0O5xZaBEuQCNOXC6COrXR8+9VEfqp2swpg7zwgtqFxh+BtQ==" - }, - "node_modules/@algolia/client-personalization/node_modules/@algolia/transporter": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.3.tgz", - "integrity": "sha512-n1lRyKDbrckbMEgm7QXtj3nEWUuzA3aKLzVQ43/F/RCFib15j4IwtmYhXR6OIBRSc7+T0Hm48S0J6F+HeYCQkw==", - "dependencies": { - "@algolia/cache-common": "4.10.3", - "@algolia/logger-common": "4.10.3", - "@algolia/requester-common": "4.10.3" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", - "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==" - }, - "node_modules/@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", - "dependencies": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", - "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", - "dependencies": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.12.0", - "semver": "^5.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", - "dependencies": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dependencies": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "dependencies": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dependencies": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", - "dependencies": { - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dependencies": { - "lodash": "^4.17.19" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dependencies": { - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dependencies": { - "@babel/types": "^7.11.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", - "dependencies": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "node_modules/@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", - "dependencies": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - } - }, - "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", - "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "dependencies": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "dependencies": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", - "dependencies": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", - "dependencies": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd/node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "dependencies": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", - "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "dependencies": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", - "dependencies": { - "@babel/types": "^7.14.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", - "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "dependencies": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", - "dependencies": { - "@babel/types": "^7.14.8" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", - "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex/node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-new-target/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "dependencies": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/plugin-transform-object-super/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", - "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", - "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", - "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", - "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", - "dependencies": { - "regenerator-transform": "^0.14.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-spread/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "dependencies": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", - "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.7", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", - "dependencies": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-react/node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-typescript/node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", - "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", - "dependencies": { - "core-js-pure": "^3.15.0", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/template/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/template/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/template/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/template/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "dependencies": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/template/node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/traverse/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/traverse/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@babel/traverse/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/types": { - "version": "7.14.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz", - "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.37.tgz", - "integrity": "sha512-EUr2AhvFw+TYPrkfePjDWh3NqpJgpwM8v6n8Mf0rUnL/ThxXKsdamzfBqWCWAh+N1o+eeGqypvy+p8Fp8dZXhQ==" - }, - "node_modules/@docsearch/react": { - "version": "3.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.37.tgz", - "integrity": "sha512-W/O3OfL+LLQTlGXrT8/d7ztBYKgZmDWweu9f0O/41zV6Hirzo/qZEWzr25ky8utFUcMwj1pfTHLOp1F9UCtLAQ==", - "dependencies": { - "@algolia/autocomplete-core": "1.2.1", - "@algolia/autocomplete-preset-algolia": "1.2.1", - "@docsearch/css": "3.0.0-alpha.37", - "algoliasearch": "^4.0.0" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 18.0.0", - "react": ">= 16.8.0 < 18.0.0", - "react-dom": ">= 16.8.0 < 18.0.0" - } - }, - "node_modules/@docusaurus/core": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.3.tgz", - "integrity": "sha512-vzKmQsvOCte9odf0ZRU2h5UzdI1km5D0NU3Ee6xn06VydYZ169B1IF5KV1LWHSYklnsEmzizJ/jeopFCry0cGg==", - "dependencies": { - "@babel/core": "^7.12.16", - "@babel/generator": "^7.12.15", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.12.15", - "@babel/preset-env": "^7.12.16", - "@babel/preset-react": "^7.12.13", - "@babel/preset-typescript": "^7.12.16", - "@babel/runtime": "^7.12.5", - "@babel/runtime-corejs3": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@docusaurus/cssnano-preset": "2.0.0-beta.3", - "@docusaurus/react-loadable": "5.5.0", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-common": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "@slorber/static-site-generator-webpack-plugin": "^4.0.0", - "@svgr/webpack": "^5.5.0", - "autoprefixer": "^10.2.5", - "babel-loader": "^8.2.2", - "babel-plugin-dynamic-import-node": "2.3.0", - "boxen": "^5.0.1", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "clean-css": "^5.1.2", - "commander": "^5.1.0", - "copy-webpack-plugin": "^9.0.0", - "core-js": "^3.9.1", - "css-loader": "^5.1.1", - "css-minimizer-webpack-plugin": "^3.0.1", - "cssnano": "^5.0.4", - "del": "^6.0.0", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^1.12.1", - "express": "^4.17.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "github-slugger": "^1.3.0", - "globby": "^11.0.2", - "html-minifier-terser": "^5.1.1", - "html-tags": "^3.1.0", - "html-webpack-plugin": "^5.3.2", - "import-fresh": "^3.3.0", - "is-root": "^2.1.0", - "leven": "^3.1.0", - "lodash": "^4.17.20", - "mini-css-extract-plugin": "^1.6.0", - "module-alias": "^2.2.2", - "nprogress": "^0.2.0", - "postcss": "^8.2.15", - "postcss-loader": "^5.3.0", - "prompts": "^2.4.1", - "react-dev-utils": "^11.0.1", - "react-error-overlay": "^6.0.9", - "react-helmet": "^6.1.0", - "react-loadable": "^5.5.0", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.2.0", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.2.0", - "resolve-pathname": "^3.0.0", - "rtl-detect": "^1.0.3", - "semver": "^7.3.4", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.4", - "std-env": "^2.2.1", - "strip-ansi": "^6.0.0", - "terser-webpack-plugin": "^5.1.3", - "tslib": "^2.2.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^5.3.0", - "webpack": "^5.40.0", - "webpack-bundle-analyzer": "^4.4.2", - "webpack-dev-server": "^3.11.2", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.0-3" - }, - "bin": { - "docusaurus": "bin/docusaurus.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "dependencies": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", - "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "dependencies": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", - "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", - "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-wrap-function": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-wrap-function": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", - "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", - "dependencies": { - "@babel/helper-function-name": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/helpers/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", - "dependencies": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", - "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", - "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-classes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", - "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-for-of": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", - "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", - "dependencies": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", - "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-modules-amd/node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", - "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-modules-commonjs/node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/plugin-transform-parameters": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", - "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/preset-env": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", - "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", - "dependencies": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@docusaurus/core/node_modules/autoprefixer": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.1.tgz", - "integrity": "sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-lite": "^1.0.30001243", - "colorette": "^1.2.2", - "fraction.js": "^4.1.1", - "normalize-range": "^0.1.2", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/@docusaurus/core/node_modules/babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/@docusaurus/core/node_modules/boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/@docusaurus/core/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@docusaurus/core/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@docusaurus/core/node_modules/copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", - "dependencies": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/@docusaurus/core/node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", - "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", - "dependencies": { - "@types/json-schema": "^7.0.7", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@docusaurus/core/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@docusaurus/core/node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", - "dependencies": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/css-loader/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/@docusaurus/core/node_modules/css-loader/node_modules/schema-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", - "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", - "dependencies": { - "@types/json-schema": "^7.0.7", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@docusaurus/core/node_modules/cssnano": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", - "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "cssnano-preset-default": "^5.1.3", - "is-resolvable": "^1.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/@docusaurus/core/node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - }, - "node_modules/@docusaurus/core/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@docusaurus/core/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@docusaurus/core/node_modules/glob-parent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.0.tgz", - "integrity": "sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@docusaurus/core/node_modules/html-webpack-plugin": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz", - "integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==", - "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", - "lodash": "^4.17.21", - "pretty-error": "^3.0.4", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/@docusaurus/core/node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/@docusaurus/core/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/core/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@docusaurus/core/node_modules/postcss-loader": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", - "integrity": "sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/@docusaurus/core/node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/@docusaurus/core/node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/@docusaurus/core/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@docusaurus/core/node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/webpackbar": { - "version": "5.0.0-3", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", - "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.1.0", - "consola": "^2.15.0", - "figures": "^3.2.0", - "pretty-time": "^1.1.0", - "std-env": "^2.2.1", - "text-table": "^0.2.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.3.tgz", - "integrity": "sha512-k7EkNPluB+TV++oZB8Je4EQ6Xs6cR0SvgIU9vdXm00qyPCu38MMfRwSY4HnsVUV797T/fQUD91zkuwhyXCUGLA==", - "dependencies": { - "cssnano-preset-advanced": "^5.1.1", - "postcss": "^8.2.15", - "postcss-sort-media-queries": "^3.10.11" - } - }, - "node_modules/@docusaurus/mdx-loader": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.3.tgz", - "integrity": "sha512-xH6zjNokZD2D7Y+Af3gMO692lwfw5N3NzxuLqMF3D0HPHOLrokDeIeVPeY/EBJBxZiXgqWGZ/ESewNDU1ZUfRQ==", - "dependencies": { - "@babel/parser": "^7.12.16", - "@babel/traverse": "^7.12.13", - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@mdx-js/mdx": "^1.6.21", - "@mdx-js/react": "^1.6.21", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "github-slugger": "^1.3.0", - "gray-matter": "^4.0.3", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.1.0", - "stringify-object": "^3.3.0", - "unist-util-visit": "^2.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.40.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/mdx-loader/node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@docusaurus/mdx-loader/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.6", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.6.tgz", - "integrity": "sha512-TrJ0u4F3mZ7uQNga22why3SsoNwlHp6vltDLlWI80jZmZpnk9BJglpcR8MPOTSEjyUgMxJ6B3q0PA/rWzupWZA==", - "dev": true - }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.3.tgz", - "integrity": "sha512-QynxHVzS3jItnDbmu9wkASyMxrduauqONVqYHrL4x2pC4kzSTIrcDnOK1JXUJAuDg9XY66ISWQ8dN7YZOpU+4Q==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/mdx-loader": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "chalk": "^4.1.1", - "escape-string-regexp": "^4.0.0", - "feed": "^4.2.2", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "loader-utils": "^2.0.0", - "lodash": "^4.17.20", - "reading-time": "^1.3.0", - "remark-admonitions": "^1.2.1", - "tslib": "^2.2.0", - "webpack": "^5.40.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.3.tgz", - "integrity": "sha512-lB9UjDyFtq89tpyif+JDIJ/gtwtSTEwOBNTLAzOsg4ZIfNLfyifrWN4ci0TkZV0xShWUHqGp36/5XTpHRn1jJQ==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/mdx-loader": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "chalk": "^4.1.1", - "combine-promises": "^1.1.0", - "escape-string-regexp": "^4.0.0", - "execa": "^5.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "import-fresh": "^3.2.2", - "js-yaml": "^4.0.0", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", - "remark-admonitions": "^1.2.1", - "shelljs": "^0.8.4", - "tslib": "^2.2.0", - "utility-types": "^3.10.0", - "webpack": "^5.40.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@docusaurus/plugin-content-docs/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.3.tgz", - "integrity": "sha512-lV6ZoSkkVwN10kQLE4sEAubaEnzXjKBQBhMCx49wkrvRwKzjBoRnfWV8qAswN1KU2YZZL1ixFpcr8+oXvhxkuA==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/mdx-loader": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "globby": "^11.0.2", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "remark-admonitions": "^1.2.1", - "slash": "^3.0.0", - "tslib": "^2.1.0", - "webpack": "^5.40.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-debug": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.3.tgz", - "integrity": "sha512-EeHUcCPsr9S1tsyRo42SnhrCCOlcvkcA8CR4pOofiJkG1gJ8IwhY9fNOLJM7dYs0bMtViiqXy5fD2jUib4G1jw==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "react-json-view": "^1.21.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.3.tgz", - "integrity": "sha512-e6tO1FCIdAqIjcLAUaHugz/dErAP/wx67WyN6bWSdAMJRobmav+TFesE2iVzzIMxuRB3pY0Y7TtLL5dF5xpIsg==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.3.tgz", - "integrity": "sha512-p48CK7ZwThs9wc/UEv+zG3lZ/Eh4Rwg2c0MBBLYATGE+Wwh6HIyilhjQAj4dC6wf9iYvCZFXX2pNOr+cKKafIA==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.3.tgz", - "integrity": "sha512-ilEJ3Xb8zbShjGhdRHGAm4OZ0bUwFxtMtcTyqLlGmk9r0U2h0CWcaS+geJfLwgUJkwgKZfGdDrmTpmf8oeGQvw==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-common": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "fs-extra": "^10.0.0", - "sitemap": "^7.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/plugin-sitemap/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@docusaurus/preset-classic": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.3.tgz", - "integrity": "sha512-32B/7X3H8XX5jBqg23veEqNJ0JtKCG0Va+7wTX9+B36tMyPnsq3H3m0m5XICfX/NGfPICfjw/oCN2CEAYFd47Q==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/plugin-content-blog": "2.0.0-beta.3", - "@docusaurus/plugin-content-docs": "2.0.0-beta.3", - "@docusaurus/plugin-content-pages": "2.0.0-beta.3", - "@docusaurus/plugin-debug": "2.0.0-beta.3", - "@docusaurus/plugin-google-analytics": "2.0.0-beta.3", - "@docusaurus/plugin-google-gtag": "2.0.0-beta.3", - "@docusaurus/plugin-sitemap": "2.0.0-beta.3", - "@docusaurus/theme-classic": "2.0.0-beta.3", - "@docusaurus/theme-search-algolia": "2.0.0-beta.3" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/react-loadable": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", - "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", - "dependencies": { - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.3.tgz", - "integrity": "sha512-d2I4r9FQ67hCTGq+fkz0tDNvpCLxm/HAtjuu+XsZkX6Snh50XpWYfwOD4w8oFbbup5Imli2q7Z8Q2+9izphizw==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/plugin-content-blog": "2.0.0-beta.3", - "@docusaurus/plugin-content-docs": "2.0.0-beta.3", - "@docusaurus/plugin-content-pages": "2.0.0-beta.3", - "@docusaurus/theme-common": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-common": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "@mdx-js/mdx": "^1.6.21", - "@mdx-js/react": "^1.6.21", - "chalk": "^4.1.1", - "clsx": "^1.1.1", - "copy-text-to-clipboard": "^3.0.1", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "infima": "0.2.0-alpha.26", - "lodash": "^4.17.20", - "parse-numeric-range": "^1.2.0", - "postcss": "^8.2.15", - "prism-react-renderer": "^1.2.1", - "prismjs": "^1.23.0", - "prop-types": "^15.7.2", - "react-router-dom": "^5.2.0", - "rtlcss": "^3.1.2" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@docusaurus/theme-classic/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@docusaurus/theme-common": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.3.tgz", - "integrity": "sha512-XuiqpfQyOWGniN7d8uMfUQ3OmCc70u+O0ObPUONj7gFglCzwu33Izx05gNrV9ekhnpQ1pkPcvGU7Soe9Hc5i6g==", - "dependencies": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/plugin-content-blog": "2.0.0-beta.3", - "@docusaurus/plugin-content-docs": "2.0.0-beta.3", - "@docusaurus/plugin-content-pages": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "prism-react-renderer": "^1.2.1", - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.3.tgz", - "integrity": "sha512-fxWxcXGmqjwuA7zYRAbwqSANx3PVVjYUehV9SI28u5qq8U2tSYflhd1nGogM6guiV+Er6u8gwO91PL6wg3/vBA==", - "dependencies": { - "@docsearch/react": "^3.0.0-alpha.36", - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/theme-common": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "algoliasearch": "^4.8.4", - "algoliasearch-helper": "^3.3.4", - "clsx": "^1.1.1", - "eta": "^1.12.1", - "lodash": "^4.17.20" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/@docusaurus/types": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.3.tgz", - "integrity": "sha512-ivQ6L1ahju06ldTvFsZLQxcN6DP32iIB7DscxWVRqP0eyuyX2xAy+jrASqih3lB8lyw0JJaaDEeVE5fjroAQ/Q==", - "dependencies": { - "commander": "^5.1.0", - "joi": "^17.4.0", - "querystring": "0.2.0", - "webpack": "^5.40.0", - "webpack-merge": "^5.8.0" - } - }, - "node_modules/@docusaurus/types/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "node_modules/@docusaurus/types/node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@docusaurus/types/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/@docusaurus/types/node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@docusaurus/utils": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.3.tgz", - "integrity": "sha512-DApc6xcb3CvvsBCfRU6Zk3KoZa4mZfCJA4XRv5zhlhaSb0GFuAo7KQ353RUu6d0eYYylY3GGRABXkxRE1SEClA==", - "dependencies": { - "@docusaurus/types": "2.0.0-beta.3", - "@types/github-slugger": "^1.3.0", - "chalk": "^4.1.1", - "escape-string-regexp": "^4.0.0", - "fs-extra": "^10.0.0", - "gray-matter": "^4.0.3", - "lodash": "^4.17.20", - "resolve-pathname": "^3.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@docusaurus/utils-common": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.3.tgz", - "integrity": "sha512-KJgDN4G2MzJcHy+OR2e/xgEwRy+vX26pzwtjPkRjNf24CPa0BwFbRmR5apbltCgTB10vT6xroStc8Quv/286Cg==", - "dependencies": { - "@docusaurus/types": "2.0.0-beta.3", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@docusaurus/utils-validation": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.3.tgz", - "integrity": "sha512-jGX78NNrxDZFgDjLaa6wuJ/eKDoHdZFG2CVX3uCaIGe1x8eTMG2/e/39GzbZl+W7VHYpW0bzdf/5dFhaKLfQbQ==", - "dependencies": { - "@docusaurus/utils": "2.0.0-beta.3", - "chalk": "^4.1.1", - "joi": "^17.4.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@docusaurus/utils/node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==", - "hasInstallScript": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", - "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", - "hasInstallScript": true, - "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.16.tgz", - "integrity": "sha512-aLmzDwC9rEOAJv2UJdMns89VZR5Ry4IHu5dQQh24Z/lWKEm44lfQr1UNalZlkUaQN8d155tNh+CS7ntntj1VMA==", - "dependencies": { - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || >=1.3.0-beta1", - "react": ">=16.x" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true - }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "dependencies": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-function-name/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helpers/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helpers/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@mdx-js/mdx/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@mdx-js/mdx/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@mdx-js/mdx/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@mdx-js/mdx/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@mdx-js/mdx/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.15", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz", - "integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==" - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-PSv4RIVO1Y3kvHxjvqeVisk3E9XFoO04uwYBDWe217MFqKspplYswTuKLiJu0aLORQWzuQjfVsSlLPojwfYsLw==", - "dependencies": { - "bluebird": "^3.7.1", - "cheerio": "^0.22.0", - "eval": "^0.1.4", - "url": "^0.11.0", - "webpack-sources": "^1.4.3" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dependencies": { - "@babel/types": "^7.12.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/@svgr/plugin-svgo/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/@svgr/plugin-svgo/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "node_modules/@svgr/plugin-svgo/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/webpack/node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", - "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tsconfig/docusaurus": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.2.tgz", - "integrity": "sha512-x4rRVb346vjyym6QbeB1Tv01XXwhbkujOmvDmtf0bT20oc2gbDhbmwpskKqZ5Of2Q/Vk4jNk1WMiLsZdJ9t7Dw==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" - }, - "node_modules/@types/github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" - }, - "node_modules/@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.2.tgz", - "integrity": "sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==", - "dev": true - }, - "node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" - }, - "node_modules/@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" - }, - "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", - "dev": true - }, - "node_modules/@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" - }, - "node_modules/@types/node": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.3.tgz", - "integrity": "sha512-8h7k1YgQKxKXWckzFCMfsIwn0Y61UK6tlD6y2lOb3hTOIMlK3t9/QwHOhc81TwU+RMf0As5fj7NPjroERCnejQ==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" - }, - "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" - }, - "node_modules/@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-PYRoU1XJFOzQ3BHvWL1T8iDNbRjdMDJMT5hFmZKGbsq09kbSqJy61uwEpTrbTNWDopVphUT34zUSVLK9pjsgYQ==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", - "dev": true, - "dependencies": { - "@types/history": "*", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", - "dev": true, - "dependencies": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/sax": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", - "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" - }, - "node_modules/@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", - "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/algoliasearch": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.3.tgz", - "integrity": "sha512-OLY0AWlPKGLbSaw14ivMB7BT5fPdp8VdzY4L8FtzZnqmLKsyes24cltGlf7/X96ACkYEcT390SReCDt/9SUIRg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.10.3", - "@algolia/cache-common": "4.10.3", - "@algolia/cache-in-memory": "4.10.3", - "@algolia/client-account": "4.10.3", - "@algolia/client-analytics": "4.10.3", - "@algolia/client-common": "4.10.3", - "@algolia/client-personalization": "4.10.3", - "@algolia/client-search": "4.10.3", - "@algolia/logger-common": "4.10.3", - "@algolia/logger-console": "4.10.3", - "@algolia/requester-browser-xhr": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/requester-node-http": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "node_modules/algoliasearch-helper": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.5.4.tgz", - "integrity": "sha512-t+FLhXYnPZiwjYe5ExyN962HQY8mi3KwRju3Lyf6OBgtRdx30d6mqvtClXf5NeBihH45Xzj6t4Y5YyvAI432XA==", - "dependencies": { - "events": "^1.1.1" - }, - "peerDependencies": { - "algoliasearch": ">= 3.1 < 5" - } - }, - "node_modules/algoliasearch-helper/node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/cache-browser-local-storage": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.3.tgz", - "integrity": "sha512-TD1N7zg5lb56/PLjjD4bBl2eccEvVHhC7yfgFu2r9k5tf+gvbGxEZ3NhRZVKu2MObUIcEy2VR4LVLxOQu45Hlg==", - "dependencies": { - "@algolia/cache-common": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/cache-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.3.tgz", - "integrity": "sha512-q13cPPUmtf8a2suBC4kySSr97EyulSXuxUkn7l1tZUCX/k1y5KNheMp8npBy8Kc8gPPmHpacxddRSfOncjiKFw==" - }, - "node_modules/algoliasearch/node_modules/@algolia/cache-in-memory": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.3.tgz", - "integrity": "sha512-JhPajhOXAjUP+TZrZTh6KJpF5VKTKyWK2aR1cD8NtrcVHwfGS7fTyfXfVm5BqBqkD9U0gVvufUt/mVyI80aZww==", - "dependencies": { - "@algolia/cache-common": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-account": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.3.tgz", - "integrity": "sha512-S/IsJB4s+e1xYctdpW3nAbwrR2y3pjSo9X21fJGoiGeIpTRdvQG7nydgsLkhnhcgAdLnmqBapYyAqMGmlcyOkg==", - "dependencies": { - "@algolia/client-common": "4.10.3", - "@algolia/client-search": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-analytics": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.3.tgz", - "integrity": "sha512-vlHTbBqJktRgclh3v7bPQLfZvFIqY4erNFIZA5C7nisCj9oLeTgzefoUrr+R90+I+XjfoLxnmoeigS1Z1yg1vw==", - "dependencies": { - "@algolia/client-common": "4.10.3", - "@algolia/client-search": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.3.tgz", - "integrity": "sha512-uFyP2Z14jG2hsFRbAoavna6oJf4NTXaSDAZgouZUZlHlBp5elM38sjNeA5HR9/D9J/GjwaB1SgB7iUiIWYBB4w==", - "dependencies": { - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/client-search": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.3.tgz", - "integrity": "sha512-Zwnp2G94IrNFKWCG/k7epI5UswRkPvL9FCt7/slXe2bkjP2y/HA37gzRn+9tXoLVRwd7gBzrtOA4jFKIyjrtVw==", - "dependencies": { - "@algolia/client-common": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/logger-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.3.tgz", - "integrity": "sha512-M6xi+qov2bkgg1H9e1Qtvq/E/eKsGcgz8RBbXNzqPIYoDGZNkv+b3b8YMo3dxd4Wd6M24HU1iqF3kmr1LaXndg==" - }, - "node_modules/algoliasearch/node_modules/@algolia/logger-console": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.3.tgz", - "integrity": "sha512-vVgRI7b4PHjgBdRkv/cRz490twvkLoGdpC4VYzIouSrKj8SIVLRhey3qgXk7oQXi3xoxVAv6NrklHfpO8Bpx0w==", - "dependencies": { - "@algolia/logger-common": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.3.tgz", - "integrity": "sha512-4WIk1zreFbc1EF6+gsfBTQvwSNjWc20zJAAExRWql/Jq5yfVHmwOqi/CajA53/cXKFBqo80DAMRvOiwP+hOLYw==", - "dependencies": { - "@algolia/requester-common": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.3.tgz", - "integrity": "sha512-PNfLHmg0Hujugs3rx55uz/ifv7b9HVdSFQDb2hj0O5xZaBEuQCNOXC6COrXR8+9VEfqp2swpg7zwgtqFxh+BtQ==" - }, - "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.3.tgz", - "integrity": "sha512-A9ZcGfEvgqf0luJApdNcIhsRh6MShn2zn2tbjwjGG1joF81w+HUY+BWuLZn56vGwAA9ZB9n00IoJJpxibbfofg==", - "dependencies": { - "@algolia/requester-common": "4.10.3" - } - }, - "node_modules/algoliasearch/node_modules/@algolia/transporter": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.3.tgz", - "integrity": "sha512-n1lRyKDbrckbMEgm7QXtj3nEWUuzA3aKLzVQ43/F/RCFib15j4IwtmYhXR6OIBRSc7+T0Hm48S0J6F+HeYCQkw==", - "dependencies": { - "@algolia/cache-common": "4.10.3", - "@algolia/logger-common": "4.10.3", - "@algolia/requester-common": "4.10.3" - } - }, - "node_modules/alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dependencies": { - "string-width": "^3.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.0.tgz", - "integrity": "sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", - "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" - } - }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", - "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", - "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", - "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.14.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.2.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/bail": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dependencies": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "node_modules/bonjour/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", - "dependencies": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001245", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", - "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", - "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cheerio/node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/cheerio/node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "engines": { - "node": "*" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/cheerio/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/cheerio/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chrome-trace-event/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "node_modules/clean-css": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.3.tgz", - "integrity": "sha512-qGXzUCDpLwAlPx0kYeU4QXjzQIcIYZbJjD4FNm7NnSjoP0hYMVZhHOpUYJ6AwfkMX2cceLRq54MeCgHy/va1cA==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.1.1", - "d": "^1.0.1", - "es5-ext": "^0.10.51", - "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", - "timers-ext": "^0.1.7" - } - }, - "node_modules/cli-color/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/coa/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/coa/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/coa/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.1.0.tgz", - "integrity": "sha512-H5sDP9XDk2uP+x/xSGkgB9SEFc1bojdI5DMKU0jmSXQtml2GIe48dj1DcSS0e53QQAHn+JKqUXbGeGX24xWD7w==" - }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, - "node_modules/combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" - }, - "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz", - "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", - "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", - "dependencies": { - "browserslist": "^4.16.6", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/core-js-compat/node_modules/electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/core-js-pure": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz", - "integrity": "sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "dependencies": { - "node-fetch": "2.6.1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-color-names": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", - "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", - "engines": { - "node": "*" - } - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "p-limit": "^3.0.2", - "postcss": "^8.3.5", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/cssnano": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", - "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "cssnano-preset-default": "^5.1.3", - "is-resolvable": "^1.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano-preset-advanced": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.1.3.tgz", - "integrity": "sha512-pS4+Q2Hoo/FevZs2JqA2BG8Vn5o5VeXgj+z6kGndKTq3RFYvlKeJ1ZPnLXo9zyYKwmSqWW0rWqtGxxmigIte0Q==", - "dependencies": { - "autoprefixer": "^10.2.0", - "cssnano-preset-default": "^5.1.3", - "postcss-discard-unused": "^5.0.1", - "postcss-merge-idents": "^5.0.1", - "postcss-reduce-idents": "^5.0.1", - "postcss-zindex": "^5.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-advanced/node_modules/autoprefixer": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.1.tgz", - "integrity": "sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-lite": "^1.0.30001243", - "colorette": "^1.2.2", - "fraction.js": "^4.1.1", - "normalize-range": "^0.1.2", - "postcss-value-parser": "^4.1.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/cssnano-preset-advanced/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/cssnano-preset-advanced/node_modules/electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - }, - "node_modules/cssnano-preset-default": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz", - "integrity": "sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==", - "dependencies": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^2.0.1", - "postcss-calc": "^8.0.0", - "postcss-colormin": "^5.2.0", - "postcss-convert-values": "^5.0.1", - "postcss-discard-comments": "^5.0.1", - "postcss-discard-duplicates": "^5.0.1", - "postcss-discard-empty": "^5.0.1", - "postcss-discard-overridden": "^5.0.1", - "postcss-merge-longhand": "^5.0.2", - "postcss-merge-rules": "^5.0.2", - "postcss-minify-font-values": "^5.0.1", - "postcss-minify-gradients": "^5.0.1", - "postcss-minify-params": "^5.0.1", - "postcss-minify-selectors": "^5.1.0", - "postcss-normalize-charset": "^5.0.1", - "postcss-normalize-display-values": "^5.0.1", - "postcss-normalize-positions": "^5.0.1", - "postcss-normalize-repeat-style": "^5.0.1", - "postcss-normalize-string": "^5.0.1", - "postcss-normalize-timing-functions": "^5.0.1", - "postcss-normalize-unicode": "^5.0.1", - "postcss-normalize-url": "^5.0.2", - "postcss-normalize-whitespace": "^5.0.1", - "postcss-ordered-values": "^5.0.2", - "postcss-reduce-initial": "^5.0.1", - "postcss-reduce-transforms": "^5.0.1", - "postcss-svgo": "^5.0.2", - "postcss-unique-selectors": "^5.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/cssnano-preset-default/node_modules/css-declaration-sorter": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz", - "integrity": "sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==", - "dependencies": { - "timsort": "^0.3.0" - }, - "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/cssnano-preset-default/node_modules/electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-duplicates": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-empty": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-discard-overridden": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", - "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-merge-longhand": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", - "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", - "dependencies": { - "css-color-names": "^1.0.1", - "postcss-value-parser": "^4.1.0", - "stylehacks": "^5.0.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-merge-rules": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", - "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^2.0.1", - "postcss-selector-parser": "^6.0.5", - "vendors": "^1.0.3" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-minify-params": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", - "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", - "dependencies": { - "alphanum-sort": "^1.0.2", - "browserslist": "^4.16.0", - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0", - "uniqs": "^2.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-normalize-charset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-normalize-display-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", - "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", - "dependencies": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-ordered-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", - "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", - "dependencies": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default/node_modules/postcss-reduce-transforms": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", - "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", - "dependencies": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", - "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dependencies": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "node_modules/detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "dependencies": { - "repeat-string": "^1.5.4" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" - }, - "node_modules/dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dependencies": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dependencies": { - "buffer-indexof": "^1.0.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/domutils/node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "node_modules/electron-to-chromium": { - "version": "1.3.582", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz", - "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==" - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", - "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-mdx": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.13.0.tgz", - "integrity": "sha512-Yqc5mnh2JMEm9yTp6NUnfOg1wXGLibCqQTjvb5+EQH4LtQEmWG0DtqWUXWHRy0gmy/3lBdN9Zkc5KGwAizaTrQ==", - "dev": true, - "dependencies": { - "remark-mdx": "^1.6.22", - "remark-parse": "^8.0.3", - "tslib": "^2.2.0", - "unified": "^9.2.1" - }, - "engines": { - "node": ">=10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-mdx/node_modules/unified": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", - "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", - "dev": true, - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-markdown": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.0.tgz", - "integrity": "sha512-Ctuc7aP1tU92qnFwVO1wDLEzf1jqMxwRkcSTw7gjbvnEqfh5CKUcTXM0sxg8CB2KDXrqpTuMZPgJ1XE9Olr7KA==", - "dev": true, - "dependencies": { - "mdast-util-from-markdown": "^0.8.5" - }, - "engines": { - "node": "^8.10.0 || ^10.12.0 || >= 12.0.0" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-plugin-mdx": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.13.0.tgz", - "integrity": "sha512-oZ/R9OmSx1gZs52CO58HTHlJXRKoZtF6ZMaWP+sOcSGMFxoddoPr9PDgpP52ab5TWu5yVl5guR9D+GMfzkR2Uw==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "eslint-mdx": "^1.13.0", - "eslint-plugin-markdown": "^2.1.0", - "remark-mdx": "^1.6.22", - "remark-parse": "^8.0.3", - "remark-stringify": "^8.1.1", - "synckit": "^0.1.5", - "tslib": "^2.2.0", - "unified": "^9.2.1", - "vfile": "^4.2.1" - }, - "engines": { - "node": ">=10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-mdx/node_modules/unified": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", - "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", - "dev": true, - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz", - "integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flatmap": "^1.2.5", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.0", - "object.values": "^1.1.5", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eval": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", - "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", - "dependencies": { - "require-like": ">= 0.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dependencies": { - "original": "^1.0.0" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", - "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "dependencies": { - "fbjs": "^3.0.0" - } - }, - "node_modules/fbjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", - "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", - "dependencies": { - "cross-fetch": "^3.0.4", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - } - }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "node_modules/filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "node_modules/flux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.1.tgz", - "integrity": "sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ==", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.0" - }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", - "dependencies": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", - "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" - }, - "engines": { - "node": ">=6.11.5", - "yarn": ">=1.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", - "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", - "dependencies": { - "emoji-regex": ">=6.0.0 <=6.1.1" - } - }, - "node_modules/github-slugger/node_modules/emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", - "dev": true, - "dependencies": { - "@types/glob": "*" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "glob": "*" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dependencies": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", - "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "node_modules/hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" - }, - "node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-minifier-terser/node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-minifier-terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/html-minifier-terser/node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/html-tags": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", - "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/htmlparser2/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "node_modules/http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dependencies": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/http-proxy-middleware/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infima": { - "version": "0.2.0-alpha.26", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.26.tgz", - "integrity": "sha512-0/Dt+89mf8xW+9/hKGmynK+WOAsiy0QydVJL0qie6WK57yGIQv+SjJrhMybKndnmkZBQ+Vlt0tWPnTakx8X2Qw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dependencies": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "engines": { - "node": ">=4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dependencies": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "node_modules/is-color-stop/node_modules/css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "engines": { - "node": "*" - } - }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd/node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", - "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.0", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", - "dev": true, - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/json-schema-to-typescript": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", - "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.6", - "@types/lodash": "^4.14.168", - "@types/prettier": "^2.1.5", - "cli-color": "^2.0.0", - "get-stdin": "^8.0.0", - "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "mz": "^2.7.0", - "prettier": "^2.2.0" - }, - "bin": { - "json2ts": "dist/src/cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/json-schema-to-typescript/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", - "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.2", - "object.assign": "^4.1.2" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" - }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, - "node_modules/lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "dependencies": { - "es5-ext": "~0.10.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", - "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dev": true, - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", - "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^2.0.0", - "micromark": "~2.11.0", - "parse-entities": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "node_modules/memoizee/node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, - "node_modules/micromark": { - "version": "2.11.4", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", - "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "debug": "^4.0.0", - "parse-entities": "^2.0.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "dependencies": { - "mime-db": "1.48.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", - "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dependencies": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true, - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", - "dependencies": { - "lodash.toarray": "^4.4.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "engines": { - "node": ">=4" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" - }, - "node_modules/nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", - "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opn/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dependencies": { - "url-parse": "^1.4.3" - } - }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dependencies": { - "retry": "^0.12.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", - "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz", - "integrity": "sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg==" - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "dependencies": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - } - }, - "node_modules/pify/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pify/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pify/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pify/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/pify/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/pify/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/pify/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/pify/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/pify/node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/pify/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pify/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", - "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", - "dependencies": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-calc": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", - "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", - "dependencies": { - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", - "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-colormin/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/postcss-colormin/node_modules/electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - }, - "node_modules/postcss-convert-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", - "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", - "dependencies": { - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-unused": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.0.1.tgz", - "integrity": "sha512-tD6xR/xyZTwfhKYRw0ylfCY8wbfhrjpKAMnDKRTLMy2fNW5hl0hoV6ap5vo2JdCkuHkP3CHw72beO4Y8pzFdww==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-idents": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.0.1.tgz", - "integrity": "sha512-xu8ueVU0RszbI2gKkxR6mluupsOSSLvt8q4gA2fcKFkA+x6SlH3cb4cFHpDvcRCNFbUmCR/VUub+Y6zPOjPx+Q==", - "dependencies": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", - "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", - "dependencies": { - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz", - "integrity": "sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==", - "dependencies": { - "cssnano-utils": "^2.0.1", - "is-color-stop": "^1.1.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", - "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", - "dependencies": { - "alphanum-sort": "^1.0.2", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values/node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", - "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", - "dependencies": { - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", - "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", - "dependencies": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", - "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", - "dependencies": { - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", - "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", - "dependencies": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", - "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", - "dependencies": { - "browserslist": "^4.16.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/postcss-normalize-unicode/node_modules/electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" - }, - "node_modules/postcss-normalize-url": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", - "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", - "dependencies": { - "is-absolute-url": "^3.0.3", - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", - "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", - "dependencies": { - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-idents": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.0.1.tgz", - "integrity": "sha512-6Rw8iIVFbqtaZExgWK1rpVgP7DPFRPh0DDFZxJ/ADNqPiH10sPCoq5tgo6kLiTyfh9sxjKYjXdc8udLEcPOezg==", - "dependencies": { - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", - "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", - "dependencies": { - "browserslist": "^4.16.0", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/postcss-reduce-initial/node_modules/electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-sort-media-queries": { - "version": "3.11.12", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-3.11.12.tgz", - "integrity": "sha512-PNhEOWR/btZ0bNNRqqdW4TWxBPQ1mu2I6/Zpco80vBUDSyEjtduUAorY0Vm68rvDlGea3+sgEnQ36iQ1A/gG8Q==", - "dependencies": { - "sort-css-media-queries": "1.5.4" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.3.1" - } - }, - "node_modules/postcss-svgo": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", - "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", - "dependencies": { - "postcss-value-parser": "^4.1.0", - "svgo": "^2.3.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", - "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", - "dependencies": { - "alphanum-sort": "^1.0.2", - "postcss-selector-parser": "^6.0.5", - "uniqs": "^2.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" - }, - "node_modules/postcss-zindex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.0.1.tgz", - "integrity": "sha512-nwgtJJys+XmmSGoYCcgkf/VczP8Mp/0OfSv3v0+fw0uABY4yxw+eFs0Xp9nAZHIKnS5j+e9ywQ+RD+ONyvl5pA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/prebuild-webpack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prebuild-webpack-plugin/-/prebuild-webpack-plugin-1.1.1.tgz", - "integrity": "sha512-H5/VnSl7KZm3NCGj1+8BrBHu0Bn9xzLREdpeE4TRYyp4t4qFnYPExzozk2sfD/CLJRGIuyOFrXbXgJJ4ETdz/g==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "glob": "^7.1.5", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/pretty-error": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", - "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^2.0.6" - } - }, - "node_modules/pretty-error/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-error/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/pretty-error/node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/pretty-error/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/prism-react-renderer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz", - "integrity": "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==", - "peerDependencies": { - "react": ">=0.14.9" - } - }, - "node_modules/prismjs": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz", - "integrity": "sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow==" - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-async": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/react-async/-/react-async-10.0.1.tgz", - "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==", - "peerDependencies": { - "react": ">=16.3.1" - } - }, - "node_modules/react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "node_modules/react-copy-to-clipboard": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz", - "integrity": "sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw==", - "dependencies": { - "copy-to-clipboard": "^3", - "prop-types": "^15.5.8" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/react-dev-utils": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", - "dependencies": { - "@babel/code-frame": "7.10.4", - "address": "1.1.2", - "browserslist": "4.14.2", - "chalk": "2.4.2", - "cross-spawn": "7.0.3", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.1.0", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "4.1.6", - "global-modules": "2.0.0", - "globby": "11.0.1", - "gzip-size": "5.1.1", - "immer": "8.0.1", - "is-root": "2.1.0", - "loader-utils": "2.0.0", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "prompts": "2.4.0", - "react-error-overlay": "^6.0.9", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/react-dev-utils/node_modules/browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", - "dependencies": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/react-dev-utils/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/react-dev-utils/node_modules/immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/react-dev-utils/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/react-dev-utils/node_modules/prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" - }, - "node_modules/react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - }, - "node_modules/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "dependencies": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" - }, - "peerDependencies": { - "react": "^17.0.0 || ^16.3.0 || ^15.5.4", - "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-loadable": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", - "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", - "dependencies": { - "prop-types": "^15.5.0" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-loadable-ssr-addon-v5-slorber": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", - "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", - "dependencies": { - "@babel/runtime": "^7.10.3" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "react-loadable": "*", - "webpack": ">=4.41.1 || 5.x" - } - }, - "node_modules/react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-config": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", - "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", - "dependencies": { - "@babel/runtime": "^7.1.2" - }, - "peerDependencies": { - "react": ">=15", - "react-router": ">=5" - } - }, - "node_modules/react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.2.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/react-side-effect": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", - "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0" - } - }, - "node_modules/react-textarea-autosize": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", - "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", - "dependencies": { - "@babel/runtime": "^7.10.2", - "use-composed-ref": "^1.0.0", - "use-latest": "^1.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/react-toastify": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-7.0.4.tgz", - "integrity": "sha512-Rol7+Cn39hZp5hQ/k6CbMNE2CKYV9E5OQdC/hBLtIQU2xz7DdAm7xil4NITQTHR6zEbE5RVFbpgSwTD7xRGLeQ==", - "dependencies": { - "clsx": "^1.1.1" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.3.0.tgz", - "integrity": "sha512-RJ8J5O6UvrclfZpcPSPuKusrdRfoY7uXXoYOOdeswZNtSkQaewT3919yz6RyloDBR+iwcUyz5zGOUjhgvfuv3g==" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dependencies": { - "minimatch": "3.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dependencies": { - "regenerate": "^1.4.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "node_modules/regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dependencies": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" - }, - "node_modules/regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", - "dependencies": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", - "dependencies": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", - "dependencies": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-admonitions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", - "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", - "dependencies": { - "rehype-parse": "^6.0.2", - "unified": "^8.4.2", - "unist-util-visit": "^2.0.1" - } - }, - "node_modules/remark-admonitions/node_modules/unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "dependencies": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/remark-mdx/node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "dependencies": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/generator/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-function-name/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-function-name/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-get-function-arity/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "dependencies": { - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helpers/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "dependencies": { - "@babel/highlight": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helpers/node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/remark-mdx/node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/remark-mdx/node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-mdx/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/remark-mdx/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/remark-mdx/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/remark-mdx/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/remark-mdx/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", - "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", - "dev": true, - "dependencies": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-like": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", - "engines": { - "node": "*" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "node_modules/rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" - }, - "node_modules/rtlcss": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.3.0.tgz", - "integrity": "sha512-XZ2KEatH2nU5yPlts1Wu8SGIuZ3ndN025HQX5MqtUCUiOn5WkCDbcpJ2VJWjpuFmM2cUTQ1xtH21fhMCSseI5A==", - "dependencies": { - "chalk": "^4.1.0", - "find-up": "^5.0.0", - "mkdirp": "^1.0.4", - "postcss": "^8.2.4", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "rtlcss": "bin/rtlcss.js" - }, - "peerDependencies": { - "postcss": "^8.2.4" - } - }, - "node_modules/rtlcss/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/rtlcss/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" - }, - "node_modules/selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", - "dependencies": { - "node-forge": "^0.10.0" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.0.4", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-handler/node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/serve-handler/node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/sirv": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz", - "integrity": "sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==", - "dependencies": { - "@polka/url": "^1.0.0-next.15", - "mime": "^2.3.1", - "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sirv/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/sitemap": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.0.0.tgz", - "integrity": "sha512-Ud0jrRQO2k7fEtPAM+cQkBKoMvxQyPKNXKDLn8tRVHxRCsdDQ2JZvw+aZ5IRYYQVAV9iGxEar6boTwZzev+x3g==", - "dependencies": { - "@types/node": "^15.0.1", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" - } - }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "15.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.2.tgz", - "integrity": "sha512-dvMUE/m2LbXPwlvVuzCyslTEtQ2ZwuuFClDrOQ6mp2CenCg971719PTILZ4I6bTP27xfFFc+o7x2TkLuun/MPw==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-css-media-queries": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.4.tgz", - "integrity": "sha512-YP5W/h4Sid/YP7Lp87ejJ5jP13/Mtqt2vx33XyhO+IAugKlufRPbOrPlIiEUuxmpNBSBd3EeeQpFhdu3RfI2Ag==", - "engines": { - "node": ">= 6.3.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/std-env": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", - "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", - "dependencies": { - "ci-info": "^1.6.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-replace-loader": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.0.3.tgz", - "integrity": "sha512-8c26Dl6H9XmKNj3mFBvaUYR7ImOxQ4YRBFuUju78wXpa1cDpyDYvKmqGg8mfkxdYexQ/BBogB7PELlLnmR08nw==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "peerDependencies": { - "webpack": "^5" - } - }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz", - "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.3.1", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", - "dev": true, - "dependencies": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/stylehacks": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", - "dependencies": { - "browserslist": "^4.16.0", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/stylehacks/node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/stylehacks/node_modules/electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svgo": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", - "integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==", - "dependencies": { - "@trysound/sax": "0.1.1", - "chalk": "^4.1.0", - "commander": "^7.1.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.2", - "csso": "^4.2.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/synckit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.1.5.tgz", - "integrity": "sha512-s9rDbMJAF5SDEwBGH/DvbN/fb5N1Xu1boL4Uv66idbCbtosNX3ikUsFvGhROmPXsvlMYMcT5ksmkU5RSnkFi9Q==", - "dev": true, - "dependencies": { - "tslib": "^2.2.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/synckit/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", - "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", - "dependencies": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, - "node_modules/tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" - }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-essentials": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", - "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" - }, - "node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", - "dependencies": { - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", - "dependencies": { - "@types/unist": "^2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url-parse-lax/node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "engines": { - "node": ">=4" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/use-composed-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", - "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", - "dependencies": { - "ts-essentials": "^2.0.3" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", - "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", - "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", - "dependencies": { - "use-isomorphic-layout-effect": "^1.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", - "dependencies": { - "axios": "^0.21.1", - "joi": "^17.3.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^6.6.3" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" - }, - "node_modules/webpack": { - "version": "5.58.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.58.2.tgz", - "integrity": "sha512-3S6e9Vo1W2ijk4F4PPWRIu6D/uGgqaPmqw+av3W3jLDujuNkdxX5h5c+RQ6GkjVR+WwIPOfgY8av+j5j4tMqJw==", - "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", - "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", - "dependencies": { - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^6.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", - "dependencies": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", - "dependencies": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 6.11.5" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/webpack-dev-server/node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-dev-server/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/webpack-dev-server/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/webpack-dev-server/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/webpack-dev-server/node_modules/sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", - "dependencies": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" - } - }, - "node_modules/webpack-dev-server/node_modules/sockjs-client/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/webpack-dev-server/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/webpack-dev-server/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-dev-server/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-dev-server/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-log/node_modules/ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-merge/node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "dependencies": { - "microevent.ts": "~0.1.1" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.1.tgz", - "integrity": "sha512-/SLS6636Wpl7eFiX7eEy0E3wBo60sUm1qRYybJBDt1fs8reiJ1+OSy+dZgrLBfLL4mSFqRIIUHXbVp25QdZ+iw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz", + "integrity": "sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A==", "requires": { - "@algolia/autocomplete-shared": "1.2.1" + "@algolia/autocomplete-shared": "1.5.2" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.1.tgz", - "integrity": "sha512-Lf4PpPVgHNXm1ytrnVdrZYV7hAYSCpAI/TrebF8UC6xflPY6sKb1RL/2OfrO9On7SDjPBtNd+6MArSar5JmK0g==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz", + "integrity": "sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw==", "requires": { - "@algolia/autocomplete-shared": "1.2.1" + "@algolia/autocomplete-shared": "1.5.2" } }, "@algolia/autocomplete-shared": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.1.tgz", - "integrity": "sha512-RHCwcXAYFwDXTlomstjWRFIzOfyxtQ9KmViacPE5P5hxUSSjkmG3dAb77xdydift1PaZNbho5TNTCi5UZe0RpA==" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz", + "integrity": "sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.0.tgz", + "integrity": "sha512-nj1vHRZauTqP/bluwkRIgEADEimqojJgoTRCel5f6q8WCa9Y8QeI4bpDQP28FoeKnDRYa3J5CauDlN466jqRhg==", + "requires": { + "@algolia/cache-common": "4.13.0" + } + }, + "@algolia/cache-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.0.tgz", + "integrity": "sha512-f9mdZjskCui/dA/fA/5a+6hZ7xnHaaZI5tM/Rw9X8rRB39SUlF/+o3P47onZ33n/AwkpSbi5QOyhs16wHd55kA==" + }, + "@algolia/cache-in-memory": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.0.tgz", + "integrity": "sha512-hHdc+ahPiMM92CQMljmObE75laYzNFYLrNOu0Q3/eyvubZZRtY2SUsEEgyUEyzXruNdzrkcDxFYa7YpWBJYHAg==", + "requires": { + "@algolia/cache-common": "4.13.0" + } + }, + "@algolia/client-account": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.0.tgz", + "integrity": "sha512-FzFqFt9b0g/LKszBDoEsW+dVBuUe1K3scp2Yf7q6pgHWM1WqyqUlARwVpLxqyc+LoyJkTxQftOKjyFUqddnPKA==", + "requires": { + "@algolia/client-common": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/client-analytics": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.0.tgz", + "integrity": "sha512-klmnoq2FIiiMHImkzOm+cGxqRLLu9CMHqFhbgSy9wtXZrqb8BBUIUE2VyBe7azzv1wKcxZV2RUyNOMpFqmnRZA==", + "requires": { + "@algolia/client-common": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/client-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.0.tgz", + "integrity": "sha512-GoXfTp0kVcbgfSXOjfrxx+slSipMqGO9WnNWgeMmru5Ra09MDjrcdunsiiuzF0wua6INbIpBQFTC2Mi5lUNqGA==", + "requires": { + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } }, "@algolia/client-personalization": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.3.tgz", - "integrity": "sha512-NS7Nx8EJ/nduGXT8CFo5z7kLF0jnFehTP3eC+z+GOEESH3rrs7uR12IZHxv5QhQswZa9vl925zCOZDcDVoENCg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.0.tgz", + "integrity": "sha512-KneLz2WaehJmNfdr5yt2HQETpLaCYagRdWwIwkTqRVFCv4DxRQ2ChPVW9jeTj4YfAAhfzE6F8hn7wkQ/Jfj6ZA==", "requires": { - "@algolia/client-common": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - }, - "dependencies": { - "@algolia/cache-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.3.tgz", - "integrity": "sha512-q13cPPUmtf8a2suBC4kySSr97EyulSXuxUkn7l1tZUCX/k1y5KNheMp8npBy8Kc8gPPmHpacxddRSfOncjiKFw==" - }, - "@algolia/client-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.3.tgz", - "integrity": "sha512-uFyP2Z14jG2hsFRbAoavna6oJf4NTXaSDAZgouZUZlHlBp5elM38sjNeA5HR9/D9J/GjwaB1SgB7iUiIWYBB4w==", - "requires": { - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "@algolia/logger-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.3.tgz", - "integrity": "sha512-M6xi+qov2bkgg1H9e1Qtvq/E/eKsGcgz8RBbXNzqPIYoDGZNkv+b3b8YMo3dxd4Wd6M24HU1iqF3kmr1LaXndg==" - }, - "@algolia/requester-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.3.tgz", - "integrity": "sha512-PNfLHmg0Hujugs3rx55uz/ifv7b9HVdSFQDb2hj0O5xZaBEuQCNOXC6COrXR8+9VEfqp2swpg7zwgtqFxh+BtQ==" - }, - "@algolia/transporter": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.3.tgz", - "integrity": "sha512-n1lRyKDbrckbMEgm7QXtj3nEWUuzA3aKLzVQ43/F/RCFib15j4IwtmYhXR6OIBRSc7+T0Hm48S0J6F+HeYCQkw==", - "requires": { - "@algolia/cache-common": "4.10.3", - "@algolia/logger-common": "4.10.3", - "@algolia/requester-common": "4.10.3" - } - } + "@algolia/client-common": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/client-search": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.0.tgz", + "integrity": "sha512-blgCKYbZh1NgJWzeGf+caKE32mo3j54NprOf0LZVCubQb3Kx37tk1Hc8SDs9bCAE8hUvf3cazMPIg7wscSxspA==", + "requires": { + "@algolia/client-common": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/transporter": "4.13.0" + } + }, + "@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "@algolia/logger-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.0.tgz", + "integrity": "sha512-8yqXk7rMtmQJ9wZiHOt/6d4/JDEg5VCk83gJ39I+X/pwUPzIsbKy9QiK4uJ3aJELKyoIiDT1hpYVt+5ia+94IA==" + }, + "@algolia/logger-console": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.0.tgz", + "integrity": "sha512-YepRg7w2/87L0vSXRfMND6VJ5d6699sFJBRWzZPOlek2p5fLxxK7O0VncYuc/IbVHEgeApvgXx0WgCEa38GVuQ==", + "requires": { + "@algolia/logger-common": "4.13.0" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.0.tgz", + "integrity": "sha512-Dj+bnoWR5MotrnjblzGKZ2kCdQi2cK/VzPURPnE616NU/il7Ypy6U6DLGZ/ZYz+tnwPa0yypNf21uqt84fOgrg==", + "requires": { + "@algolia/requester-common": "4.13.0" + } + }, + "@algolia/requester-common": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.0.tgz", + "integrity": "sha512-BRTDj53ecK+gn7ugukDWOOcBRul59C4NblCHqj4Zm5msd5UnHFjd/sGX+RLOEoFMhetILAnmg6wMrRrQVac9vw==" + }, + "@algolia/requester-node-http": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.0.tgz", + "integrity": "sha512-9b+3O4QFU4azLhGMrZAr/uZPydvzOR4aEZfSL8ZrpLZ7fbbqTO0S/5EVko+QIgglRAtVwxvf8UJ1wzTD2jvKxQ==", + "requires": { + "@algolia/requester-common": "4.13.0" + } + }, + "@algolia/transporter": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.0.tgz", + "integrity": "sha512-8tSQYE+ykQENAdeZdofvtkOr5uJ9VcQSWgRhQ9h01AehtBIPAczk/b2CLrMsw5yQZziLs5cZ3pJ3478yI+urhA==", + "requires": { + "@algolia/cache-common": "4.13.0", + "@algolia/logger-common": "4.13.0", + "@algolia/requester-common": "4.13.0" + } + }, + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" } }, "@apidevtools/json-schema-ref-parser": { @@ -21279,121 +194,443 @@ } }, "@babel/compat-data": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz", - "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==" + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "semver": "^6.3.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-compilation-targets": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz", - "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.12.0", - "semver": "^5.5.0" + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" }, "dependencies": { + "browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "requires": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, + "electron-to-chromium": { + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz", + "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz", - "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", - "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -21405,71 +642,33 @@ "semver": "^6.1.2" }, "dependencies": { - "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" - }, - "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "requires": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - } - }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -21477,30 +676,190 @@ } } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "requires": { + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } } }, "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "requires": { + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-member-expression-to-functions": { @@ -21548,22 +907,30 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "requires": { - "lodash": "^4.17.19" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-replace-supers": { @@ -21586,11 +953,27 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-split-export-declaration": { @@ -21607,29 +990,239 @@ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } } }, "@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } } }, "@babel/highlight": { @@ -21681,338 +1274,186 @@ } }, "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==" }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz", - "integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "requires": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz", - "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-object-rest-spread": { @@ -22026,249 +1467,86 @@ } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz", - "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "requires": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-syntax-async-generators": { @@ -22280,11 +1558,18 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-syntax-class-static-block": { @@ -22296,9 +1581,9 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, @@ -22391,364 +1676,839 @@ }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" }, "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", - "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz", - "integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==", - "requires": { - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "requires": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" } }, - "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, "@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.8", + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "requires": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + } + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + }, + "@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz", + "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==", + "requires": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + }, + "@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "requires": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + }, + "@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -22799,181 +2559,114 @@ } }, "@babel/plugin-transform-modules-umd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", - "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "requires": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "requires": { - "@babel/types": "^7.14.5" + "@babel/highlight": "^7.16.7" } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "requires": { - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.17.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" - }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.8", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -23016,206 +2709,124 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz", - "integrity": "sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", - "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-object-super": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", - "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "requires": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" + "@babel/highlight": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.17.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, - "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, "@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.8", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -23273,213 +2884,183 @@ } }, "@babel/plugin-transform-property-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", - "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", - "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", + "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-react-display-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", - "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-react-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", - "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz", + "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.17.0" }, "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } } } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.14.5" + "@babel/plugin-transform-react-jsx": "^7.16.7" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-regenerator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", - "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", - "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-runtime": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz", - "integrity": "sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz", + "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==", "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" }, "dependencies": { "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -23491,465 +3072,260 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", - "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-spread": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz", - "integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", - "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-template-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", - "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", - "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" }, "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", - "requires": { - "@babel/types": "^7.14.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", - "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.7", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" - }, - "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", - "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", - "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - } - }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" - }, - "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.8", - "to-fast-properties": "^2.0.0" - } + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" }, "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "requires": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -23959,66 +3335,56 @@ } }, "@babel/preset-react": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", + "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" }, "dependencies": { "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" } } }, "@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz", + "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.7.tgz", - "integrity": "sha512-Wvzcw4mBYbTagyBVZpAJWI06auSIj033T/yNE0Zn1xcup83MieCddZA7ls3kme17L4NOGBrQ09Q+nKB41RLWBA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz", + "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==", "requires": { - "core-js-pure": "^3.15.0", + "core-js-pure": "^3.20.2", "regenerator-runtime": "^0.13.4" } }, @@ -24297,900 +3663,168 @@ } }, "@docsearch/css": { - "version": "3.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.37.tgz", - "integrity": "sha512-EUr2AhvFw+TYPrkfePjDWh3NqpJgpwM8v6n8Mf0rUnL/ThxXKsdamzfBqWCWAh+N1o+eeGqypvy+p8Fp8dZXhQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0.tgz", + "integrity": "sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA==" }, "@docsearch/react": { - "version": "3.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.37.tgz", - "integrity": "sha512-W/O3OfL+LLQTlGXrT8/d7ztBYKgZmDWweu9f0O/41zV6Hirzo/qZEWzr25ky8utFUcMwj1pfTHLOp1F9UCtLAQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0.tgz", + "integrity": "sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg==", "requires": { - "@algolia/autocomplete-core": "1.2.1", - "@algolia/autocomplete-preset-algolia": "1.2.1", - "@docsearch/css": "3.0.0-alpha.37", + "@algolia/autocomplete-core": "1.5.2", + "@algolia/autocomplete-preset-algolia": "1.5.2", + "@docsearch/css": "3.0.0", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.3.tgz", - "integrity": "sha512-vzKmQsvOCte9odf0ZRU2h5UzdI1km5D0NU3Ee6xn06VydYZ169B1IF5KV1LWHSYklnsEmzizJ/jeopFCry0cGg==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.18.tgz", + "integrity": "sha512-puV7l+0/BPSi07Xmr8tVktfs1BzhC8P5pm6Bs2CfvysCJ4nefNCD1CosPc1PGBWy901KqeeEJ1aoGwj9tU3AUA==", "requires": { - "@babel/core": "^7.12.16", - "@babel/generator": "^7.12.15", + "@babel/core": "^7.17.8", + "@babel/generator": "^7.17.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.12.15", - "@babel/preset-env": "^7.12.16", - "@babel/preset-react": "^7.12.13", - "@babel/preset-typescript": "^7.12.16", - "@babel/runtime": "^7.12.5", - "@babel/runtime-corejs3": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@docusaurus/cssnano-preset": "2.0.0-beta.3", - "@docusaurus/react-loadable": "5.5.0", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-common": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "@slorber/static-site-generator-webpack-plugin": "^4.0.0", - "@svgr/webpack": "^5.5.0", - "autoprefixer": "^10.2.5", - "babel-loader": "^8.2.2", + "@babel/plugin-transform-runtime": "^7.17.0", + "@babel/preset-env": "^7.16.11", + "@babel/preset-react": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", + "@babel/runtime": "^7.17.8", + "@babel/runtime-corejs3": "^7.17.8", + "@babel/traverse": "^7.17.3", + "@docusaurus/cssnano-preset": "2.0.0-beta.18", + "@docusaurus/logger": "2.0.0-beta.18", + "@docusaurus/mdx-loader": "2.0.0-beta.18", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/utils-common": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "@slorber/static-site-generator-webpack-plugin": "^4.0.4", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.4", + "babel-loader": "^8.2.4", "babel-plugin-dynamic-import-node": "2.3.0", - "boxen": "^5.0.1", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "clean-css": "^5.1.2", + "boxen": "^6.2.1", + "chokidar": "^3.5.3", + "clean-css": "^5.2.4", + "cli-table3": "^0.6.1", + "combine-promises": "^1.1.0", "commander": "^5.1.0", - "copy-webpack-plugin": "^9.0.0", - "core-js": "^3.9.1", - "css-loader": "^5.1.1", - "css-minimizer-webpack-plugin": "^3.0.1", - "cssnano": "^5.0.4", + "copy-webpack-plugin": "^10.2.4", + "core-js": "^3.21.1", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^3.4.1", + "cssnano": "^5.1.5", "del": "^6.0.0", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.1", - "express": "^4.17.1", + "eta": "^1.12.3", "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "github-slugger": "^1.3.0", - "globby": "^11.0.2", - "html-minifier-terser": "^5.1.1", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", "html-tags": "^3.1.0", - "html-webpack-plugin": "^5.3.2", + "html-webpack-plugin": "^5.5.0", "import-fresh": "^3.3.0", "is-root": "^2.1.0", "leven": "^3.1.0", - "lodash": "^4.17.20", - "mini-css-extract-plugin": "^1.6.0", - "module-alias": "^2.2.2", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.0", "nprogress": "^0.2.0", - "postcss": "^8.2.15", - "postcss-loader": "^5.3.0", - "prompts": "^2.4.1", - "react-dev-utils": "^11.0.1", - "react-error-overlay": "^6.0.9", - "react-helmet": "^6.1.0", - "react-loadable": "^5.5.0", + "postcss": "^8.4.12", + "postcss-loader": "^6.2.1", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.0", + "react-helmet-async": "^1.2.3", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", "react-loadable-ssr-addon-v5-slorber": "^1.0.1", "react-router": "^5.2.0", "react-router-config": "^5.1.1", "react-router-dom": "^5.2.0", - "resolve-pathname": "^3.0.0", - "rtl-detect": "^1.0.3", - "semver": "^7.3.4", + "remark-admonitions": "^1.2.1", + "rtl-detect": "^1.0.4", + "semver": "^7.3.5", "serve-handler": "^6.1.3", - "shelljs": "^0.8.4", - "std-env": "^2.2.1", - "strip-ansi": "^6.0.0", - "terser-webpack-plugin": "^5.1.3", - "tslib": "^2.2.0", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.1", + "tslib": "^2.3.1", "update-notifier": "^5.1.0", "url-loader": "^4.1.1", - "wait-on": "^5.3.0", - "webpack": "^5.40.0", - "webpack-bundle-analyzer": "^4.4.2", - "webpack-dev-server": "^3.11.2", + "wait-on": "^6.0.1", + "webpack": "^5.70.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.7.4", "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.0-3" + "webpackbar": "^5.0.2" }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" - }, - "@babel/core": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.6.tgz", - "integrity": "sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helpers": "^7.14.6", - "@babel/parser": "^7.14.6", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "requires": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz", - "integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==", - "requires": { - "@babel/helper-explode-assignable-expression": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", - "requires": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", - "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", - "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz", - "integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-module-transforms": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", - "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz", - "integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-wrap-function": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - } - } - }, - "@babel/helper-simple-access": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", - "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", - "requires": { - "@babel/types": "^7.14.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", - "requires": { - "@babel/types": "^7.14.5" + "@babel/highlight": "^7.16.7" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" - }, - "@babel/helper-wrap-function": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz", - "integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==", - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - } - } - }, - "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - } - } + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } } }, - "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz", - "integrity": "sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==", + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", - "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", - "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", - "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.5" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", - "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", - "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", - "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", - "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", - "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz", - "integrity": "sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz", - "integrity": "sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", "globals": "^11.1.0" } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", - "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", - "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", - "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", - "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", - "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz", - "integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", - "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", - "requires": { - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", - "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", - "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", - "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", - "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "requires": { - "object.assign": "^4.1.0" - } - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", - "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/preset-env": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.7.tgz", - "integrity": "sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==", - "requires": { - "@babel/compat-data": "^7.14.7", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-async-generator-functions": "^7.14.7", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.14.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.14.5", - "@babel/plugin-transform-classes": "^7.14.5", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.14.5", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-modules-systemjs": "^7.14.5", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.7", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.14.5", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.14.6", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.2", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.15.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -25199,55 +3833,14 @@ "color-convert": "^1.9.0" } }, - "autoprefixer": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.1.tgz", - "integrity": "sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "browserslist": "^4.16.6", - "caniuse-lite": "^1.0.30001243", - "colorette": "^1.2.2", - "fraction.js": "^4.1.1", - "normalize-range": "^0.1.2", - "postcss-value-parser": "^4.1.0" - } - }, - "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } - }, - "boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "color-convert": { @@ -25263,404 +3856,440 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^6.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "dependencies": { - "schema-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", - "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { - "@types/json-schema": "^7.0.7", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "has-flag": "^4.0.0" } } } }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser-webpack-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" } }, - "css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "webpack": { + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "requires": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "schema-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", - "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", - "requires": { - "@types/json-schema": "^7.0.7", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + } + } + } + }, + "@docusaurus/cssnano-preset": { + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.18.tgz", + "integrity": "sha512-VxhYmpyx16Wv00W9TUfLVv0NgEK/BwP7pOdWoaiELEIAMV7SO1+6iB8gsFUhtfKZ31I4uPVLMKrCyWWakoFeFA==", + "requires": { + "cssnano-preset-advanced": "^5.3.1", + "postcss": "^8.4.12", + "postcss-sort-media-queries": "^4.2.1" + } + }, + "@docusaurus/logger": { + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.18.tgz", + "integrity": "sha512-frNe5vhH3mbPmH980Lvzaz45+n1PQl3TkslzWYXQeJOkFX17zUd3e3U7F9kR1+DocmAqHkgAoWuXVcvEoN29fg==", + "requires": { + "chalk": "^4.1.2", + "tslib": "^2.3.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "cssnano": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", - "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "cosmiconfig": "^7.0.0", - "cssnano-preset-default": "^5.1.3", - "is-resolvable": "^1.1.0" + "has-flag": "^4.0.0" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@docusaurus/mdx-loader": { + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.18.tgz", + "integrity": "sha512-pOmAQM4Y1jhuZTbEhjh4ilQa74Mh6Q0pMZn1xgIuyYDdqvIOrOlM/H0i34YBn3+WYuwsGim4/X0qynJMLDUA4A==", + "requires": { + "@babel/parser": "^7.17.8", + "@babel/traverse": "^7.17.3", + "@docusaurus/logger": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.1", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "tslib": "^2.3.1", + "unist-util-visit": "^2.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.70.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "@babel/highlight": "^7.16.7" } }, - "electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "webpack": { + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "glob-parent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.0.tgz", - "integrity": "sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "html-webpack-plugin": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz", - "integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==", - "requires": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", - "lodash": "^4.17.21", - "pretty-error": "^3.0.4", - "tapable": "^2.0.0" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "postcss-loader": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-5.3.0.tgz", - "integrity": "sha512-/+Z1RAmssdiSLgIZwnJHwBMnlABPgF7giYzTN2NOfr9D21IJZ4mQC1R2miwp80zno9M4zMD/umGI8cR+2EL5zw==", - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "semver": "^7.3.4" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "requires": {} - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - } - }, - "webpackbar": { - "version": "5.0.0-3", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", - "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", - "requires": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.1.0", - "consola": "^2.15.0", - "figures": "^3.2.0", - "pretty-time": "^1.1.0", - "std-env": "^2.2.1", - "text-table": "^0.2.0", - "wrap-ansi": "^7.0.0" - } - } - } - }, - "@docusaurus/cssnano-preset": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.3.tgz", - "integrity": "sha512-k7EkNPluB+TV++oZB8Je4EQ6Xs6cR0SvgIU9vdXm00qyPCu38MMfRwSY4HnsVUV797T/fQUD91zkuwhyXCUGLA==", - "requires": { - "cssnano-preset-advanced": "^5.1.1", - "postcss": "^8.2.15", - "postcss-sort-media-queries": "^3.10.11" - } - }, - "@docusaurus/mdx-loader": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.3.tgz", - "integrity": "sha512-xH6zjNokZD2D7Y+Af3gMO692lwfw5N3NzxuLqMF3D0HPHOLrokDeIeVPeY/EBJBxZiXgqWGZ/ESewNDU1ZUfRQ==", - "requires": { - "@babel/parser": "^7.12.16", - "@babel/traverse": "^7.12.13", - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@mdx-js/mdx": "^1.6.21", - "@mdx-js/react": "^1.6.21", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "github-slugger": "^1.3.0", - "gray-matter": "^4.0.3", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.1.0", - "stringify-object": "^3.3.0", - "unist-util-visit": "^2.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.40.0" - }, - "dependencies": { - "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" } } } }, "@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.6", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.6.tgz", - "integrity": "sha512-TrJ0u4F3mZ7uQNga22why3SsoNwlHp6vltDLlWI80jZmZpnk9BJglpcR8MPOTSEjyUgMxJ6B3q0PA/rWzupWZA==", - "dev": true + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.18.tgz", + "integrity": "sha512-e6mples8FZRyT7QyqidGS6BgkROjM+gljJsdOqoctbtBp+SZ5YDjwRHOmoY7eqEfsQNOaFZvT2hK38ui87hCRA==", + "dev": true, + "requires": { + "@docusaurus/types": "2.0.0-beta.18", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*" + } }, "@docusaurus/plugin-content-blog": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.3.tgz", - "integrity": "sha512-QynxHVzS3jItnDbmu9wkASyMxrduauqONVqYHrL4x2pC4kzSTIrcDnOK1JXUJAuDg9XY66ISWQ8dN7YZOpU+4Q==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.18.tgz", + "integrity": "sha512-qzK83DgB+mxklk3PQC2nuTGPQD/8ogw1nXSmaQpyXAyhzcz4CXAZ9Swl/Ee9A/bvPwQGnSHSP3xqIYl8OkFtfw==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/mdx-loader": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "chalk": "^4.1.1", - "escape-string-regexp": "^4.0.0", + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/logger": "2.0.0-beta.18", + "@docusaurus/mdx-loader": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/utils-common": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "cheerio": "^1.0.0-rc.10", "feed": "^4.2.2", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "loader-utils": "^2.0.0", - "lodash": "^4.17.20", - "reading-time": "^1.3.0", + "fs-extra": "^10.0.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", "remark-admonitions": "^1.2.1", - "tslib": "^2.2.0", - "webpack": "^5.40.0" + "tslib": "^2.3.1", + "utility-types": "^3.10.0", + "webpack": "^5.70.0" }, "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "webpack": { + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" } } } }, "@docusaurus/plugin-content-docs": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.3.tgz", - "integrity": "sha512-lB9UjDyFtq89tpyif+JDIJ/gtwtSTEwOBNTLAzOsg4ZIfNLfyifrWN4ci0TkZV0xShWUHqGp36/5XTpHRn1jJQ==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.18.tgz", + "integrity": "sha512-z4LFGBJuzn4XQiUA7OEA2SZTqlp+IYVjd3NrCk/ZUfNi1tsTJS36ATkk9Y6d0Nsp7K2kRXqaXPsz4adDgeIU+Q==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/mdx-loader": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "chalk": "^4.1.1", + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/logger": "2.0.0-beta.18", + "@docusaurus/mdx-loader": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", "combine-promises": "^1.1.0", - "escape-string-regexp": "^4.0.0", - "execa": "^5.0.0", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "import-fresh": "^3.2.2", - "js-yaml": "^4.0.0", - "loader-utils": "^1.2.3", - "lodash": "^4.17.20", + "fs-extra": "^10.0.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", "remark-admonitions": "^1.2.1", - "shelljs": "^0.8.4", - "tslib": "^2.2.0", + "tslib": "^2.3.1", "utility-types": "^3.10.0", - "webpack": "^5.40.0" + "webpack": "^5.70.0" }, "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" }, "import-fresh": { "version": "3.3.0", @@ -25671,226 +4300,324 @@ "resolve-from": "^4.0.0" } }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "webpack": { + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" } } } }, "@docusaurus/plugin-content-pages": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.3.tgz", - "integrity": "sha512-lV6ZoSkkVwN10kQLE4sEAubaEnzXjKBQBhMCx49wkrvRwKzjBoRnfWV8qAswN1KU2YZZL1ixFpcr8+oXvhxkuA==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.18.tgz", + "integrity": "sha512-CJ2Xeb9hQrMeF4DGywSDVX2TFKsQpc8ZA7czyeBAAbSFsoRyxXPYeSh8aWljqR4F1u/EKGSKy0Shk/D4wumaHw==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/mdx-loader": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "globby": "^11.0.2", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/mdx-loader": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "fs-extra": "^10.0.1", "remark-admonitions": "^1.2.1", - "slash": "^3.0.0", - "tslib": "^2.1.0", - "webpack": "^5.40.0" + "tslib": "^2.3.1", + "webpack": "^5.70.0" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "webpack": { + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + } + } } }, "@docusaurus/plugin-debug": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.3.tgz", - "integrity": "sha512-EeHUcCPsr9S1tsyRo42SnhrCCOlcvkcA8CR4pOofiJkG1gJ8IwhY9fNOLJM7dYs0bMtViiqXy5fD2jUib4G1jw==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.18.tgz", + "integrity": "sha512-inLnLERgG7q0WlVmK6nYGHwVqREz13ivkynmNygEibJZToFRdgnIPW+OwD8QzgC5MpQTJw7+uYjcitpBumy1Gw==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "fs-extra": "^10.0.1", "react-json-view": "^1.21.3", - "tslib": "^2.1.0" + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } } }, "@docusaurus/plugin-google-analytics": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.3.tgz", - "integrity": "sha512-e6tO1FCIdAqIjcLAUaHugz/dErAP/wx67WyN6bWSdAMJRobmav+TFesE2iVzzIMxuRB3pY0Y7TtLL5dF5xpIsg==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.18.tgz", + "integrity": "sha512-s9dRBWDrZ1uu3wFXPCF7yVLo/+5LUFAeoxpXxzory8gn9GYDt8ZDj80h5DUyCLxiy72OG6bXWNOYS/Vc6cOPXQ==", "requires": { - "@docusaurus/core": "2.0.0-beta.3" + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } } }, "@docusaurus/plugin-google-gtag": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.3.tgz", - "integrity": "sha512-p48CK7ZwThs9wc/UEv+zG3lZ/Eh4Rwg2c0MBBLYATGE+Wwh6HIyilhjQAj4dC6wf9iYvCZFXX2pNOr+cKKafIA==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.18.tgz", + "integrity": "sha512-h7vPuLVo/9pHmbFcvb4tCpjg4SxxX4k+nfVDyippR254FM++Z/nA5pRB0WvvIJ3ZTe0ioOb5Wlx2xdzJIBHUNg==", "requires": { - "@docusaurus/core": "2.0.0-beta.3" + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } } }, "@docusaurus/plugin-sitemap": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.3.tgz", - "integrity": "sha512-ilEJ3Xb8zbShjGhdRHGAm4OZ0bUwFxtMtcTyqLlGmk9r0U2h0CWcaS+geJfLwgUJkwgKZfGdDrmTpmf8oeGQvw==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.18.tgz", + "integrity": "sha512-Klonht0Ye3FivdBpS80hkVYNOH+8lL/1rbCPEV92rKhwYdwnIejqhdKct4tUTCl8TYwWiyeUFQqobC/5FNVZPQ==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-common": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "fs-extra": "^10.0.0", - "sitemap": "^7.0.0", - "tslib": "^2.2.0" + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/utils-common": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "fs-extra": "^10.0.1", + "sitemap": "^7.1.1", + "tslib": "^2.3.1" }, "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" } } }, "@docusaurus/preset-classic": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.3.tgz", - "integrity": "sha512-32B/7X3H8XX5jBqg23veEqNJ0JtKCG0Va+7wTX9+B36tMyPnsq3H3m0m5XICfX/NGfPICfjw/oCN2CEAYFd47Q==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.18.tgz", + "integrity": "sha512-TfDulvFt/vLWr/Yy7O0yXgwHtJhdkZ739bTlFNwEkRMAy8ggi650e52I1I0T79s67llecb4JihgHPW+mwiVkCQ==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/plugin-content-blog": "2.0.0-beta.3", - "@docusaurus/plugin-content-docs": "2.0.0-beta.3", - "@docusaurus/plugin-content-pages": "2.0.0-beta.3", - "@docusaurus/plugin-debug": "2.0.0-beta.3", - "@docusaurus/plugin-google-analytics": "2.0.0-beta.3", - "@docusaurus/plugin-google-gtag": "2.0.0-beta.3", - "@docusaurus/plugin-sitemap": "2.0.0-beta.3", - "@docusaurus/theme-classic": "2.0.0-beta.3", - "@docusaurus/theme-search-algolia": "2.0.0-beta.3" + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/plugin-content-blog": "2.0.0-beta.18", + "@docusaurus/plugin-content-docs": "2.0.0-beta.18", + "@docusaurus/plugin-content-pages": "2.0.0-beta.18", + "@docusaurus/plugin-debug": "2.0.0-beta.18", + "@docusaurus/plugin-google-analytics": "2.0.0-beta.18", + "@docusaurus/plugin-google-gtag": "2.0.0-beta.18", + "@docusaurus/plugin-sitemap": "2.0.0-beta.18", + "@docusaurus/theme-classic": "2.0.0-beta.18", + "@docusaurus/theme-common": "2.0.0-beta.18", + "@docusaurus/theme-search-algolia": "2.0.0-beta.18" } }, "@docusaurus/react-loadable": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", - "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", "requires": { + "@types/react": "*", "prop-types": "^15.6.2" } }, "@docusaurus/theme-classic": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.3.tgz", - "integrity": "sha512-d2I4r9FQ67hCTGq+fkz0tDNvpCLxm/HAtjuu+XsZkX6Snh50XpWYfwOD4w8oFbbup5Imli2q7Z8Q2+9izphizw==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.18.tgz", + "integrity": "sha512-WJWofvSGKC4Luidk0lyUwkLnO3DDynBBHwmt4QrV+aAVWWSOHUjA2mPOF6GLGuzkZd3KfL9EvAfsU0aGE1Hh5g==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/plugin-content-blog": "2.0.0-beta.3", - "@docusaurus/plugin-content-docs": "2.0.0-beta.3", - "@docusaurus/plugin-content-pages": "2.0.0-beta.3", - "@docusaurus/theme-common": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-common": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "@mdx-js/mdx": "^1.6.21", - "@mdx-js/react": "^1.6.21", - "chalk": "^4.1.1", + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/plugin-content-blog": "2.0.0-beta.18", + "@docusaurus/plugin-content-docs": "2.0.0-beta.18", + "@docusaurus/plugin-content-pages": "2.0.0-beta.18", + "@docusaurus/theme-common": "2.0.0-beta.18", + "@docusaurus/theme-translations": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/utils-common": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "@mdx-js/react": "^1.6.22", "clsx": "^1.1.1", "copy-text-to-clipboard": "^3.0.1", - "fs-extra": "^10.0.0", - "globby": "^11.0.2", - "infima": "0.2.0-alpha.26", - "lodash": "^4.17.20", - "parse-numeric-range": "^1.2.0", - "postcss": "^8.2.15", - "prism-react-renderer": "^1.2.1", - "prismjs": "^1.23.0", - "prop-types": "^15.7.2", + "infima": "0.2.0-alpha.38", + "lodash": "^4.17.21", + "postcss": "^8.4.12", + "prism-react-renderer": "^1.3.1", + "prismjs": "^1.27.0", "react-router-dom": "^5.2.0", - "rtlcss": "^3.1.2" - }, - "dependencies": { - "copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } + "rtlcss": "^3.5.0" } }, "@docusaurus/theme-common": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.3.tgz", - "integrity": "sha512-XuiqpfQyOWGniN7d8uMfUQ3OmCc70u+O0ObPUONj7gFglCzwu33Izx05gNrV9ekhnpQ1pkPcvGU7Soe9Hc5i6g==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.18.tgz", + "integrity": "sha512-3pI2Q6ttScDVTDbuUKAx+TdC8wmwZ2hfWk8cyXxksvC9bBHcyzXhSgcK8LTsszn2aANyZ3e3QY2eNSOikTFyng==", "requires": { - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/plugin-content-blog": "2.0.0-beta.3", - "@docusaurus/plugin-content-docs": "2.0.0-beta.3", - "@docusaurus/plugin-content-pages": "2.0.0-beta.3", - "@docusaurus/types": "2.0.0-beta.3", - "tslib": "^2.1.0" + "@docusaurus/module-type-aliases": "2.0.0-beta.18", + "@docusaurus/plugin-content-blog": "2.0.0-beta.18", + "@docusaurus/plugin-content-docs": "2.0.0-beta.18", + "@docusaurus/plugin-content-pages": "2.0.0-beta.18", + "clsx": "^1.1.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.1", + "tslib": "^2.3.1", + "utility-types": "^3.10.0" + }, + "dependencies": { + "@docusaurus/module-type-aliases": { + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.18.tgz", + "integrity": "sha512-e6mples8FZRyT7QyqidGS6BgkROjM+gljJsdOqoctbtBp+SZ5YDjwRHOmoY7eqEfsQNOaFZvT2hK38ui87hCRA==", + "requires": { + "@docusaurus/types": "2.0.0-beta.18", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } } }, "@docusaurus/theme-search-algolia": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.3.tgz", - "integrity": "sha512-fxWxcXGmqjwuA7zYRAbwqSANx3PVVjYUehV9SI28u5qq8U2tSYflhd1nGogM6guiV+Er6u8gwO91PL6wg3/vBA==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.18.tgz", + "integrity": "sha512-2w97KO/gnjI49WVtYQqENpQ8iO1Sem0yaTxw7/qv/ndlmIAQD0syU4yx6GsA7bTQCOGwKOWWzZSetCgUmTnWgA==", "requires": { - "@docsearch/react": "^3.0.0-alpha.36", - "@docusaurus/core": "2.0.0-beta.3", - "@docusaurus/theme-common": "2.0.0-beta.3", - "@docusaurus/utils": "2.0.0-beta.3", - "@docusaurus/utils-validation": "2.0.0-beta.3", - "algoliasearch": "^4.8.4", - "algoliasearch-helper": "^3.3.4", + "@docsearch/react": "^3.0.0", + "@docusaurus/core": "2.0.0-beta.18", + "@docusaurus/logger": "2.0.0-beta.18", + "@docusaurus/plugin-content-docs": "2.0.0-beta.18", + "@docusaurus/theme-common": "2.0.0-beta.18", + "@docusaurus/theme-translations": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "@docusaurus/utils-validation": "2.0.0-beta.18", + "algoliasearch": "^4.13.0", + "algoliasearch-helper": "^3.7.4", "clsx": "^1.1.1", - "eta": "^1.12.1", - "lodash": "^4.17.20" + "eta": "^1.12.3", + "fs-extra": "^10.0.1", + "lodash": "^4.17.21", + "tslib": "^2.3.1", + "utility-types": "^3.10.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@docusaurus/theme-translations": { + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.18.tgz", + "integrity": "sha512-1uTEUXlKC9nco1Lx9H5eOwzB+LP4yXJG5wfv1PMLE++kJEdZ40IVorlUi3nJnaa9/lJNq5vFvvUDrmeNWsxy/Q==", + "requires": { + "fs-extra": "^10.0.1", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } } }, "@docusaurus/types": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.3.tgz", - "integrity": "sha512-ivQ6L1ahju06ldTvFsZLQxcN6DP32iIB7DscxWVRqP0eyuyX2xAy+jrASqih3lB8lyw0JJaaDEeVE5fjroAQ/Q==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.18.tgz", + "integrity": "sha512-zkuSmPQYP3+z4IjGHlW0nGzSSpY7Sit0Nciu/66zSb5m07TK72t6T1MlpCAn/XijcB9Cq6nenC3kJh66nGsKYg==", "requires": { "commander": "^5.1.0", - "joi": "^17.4.0", - "querystring": "0.2.0", - "webpack": "^5.40.0", + "joi": "^17.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.70.0", "webpack-merge": "^5.8.0" }, "dependencies": { @@ -25904,16 +4631,10 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} - }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -25944,51 +4665,107 @@ } }, "@docusaurus/utils": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.3.tgz", - "integrity": "sha512-DApc6xcb3CvvsBCfRU6Zk3KoZa4mZfCJA4XRv5zhlhaSb0GFuAo7KQ353RUu6d0eYYylY3GGRABXkxRE1SEClA==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.18.tgz", + "integrity": "sha512-v2vBmH7xSbPwx3+GB90HgLSQdj+Rh5ELtZWy7M20w907k0ROzDmPQ/8Ke2DK3o5r4pZPGnCrsB3SaYI83AEmAA==", "requires": { - "@docusaurus/types": "2.0.0-beta.3", - "@types/github-slugger": "^1.3.0", - "chalk": "^4.1.1", - "escape-string-regexp": "^4.0.0", - "fs-extra": "^10.0.0", + "@docusaurus/logger": "2.0.0-beta.18", + "@svgr/webpack": "^6.2.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.1", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", "gray-matter": "^4.0.3", - "lodash": "^4.17.20", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", "resolve-pathname": "^3.0.0", - "tslib": "^2.2.0" + "shelljs": "^0.8.5", + "tslib": "^2.3.1", + "url-loader": "^4.1.1", + "webpack": "^5.70.0" }, "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "webpack": { + "version": "5.71.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.71.0.tgz", + "integrity": "sha512-g4dFT7CFG8LY0iU5G8nBL6VlkT21Z7dcYDpJAEJV5Q1WLb9UwnFbrem1k7K52ILqEmomN7pnzWFxxE6SlDY56A==", "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" } } } }, "@docusaurus/utils-common": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.3.tgz", - "integrity": "sha512-KJgDN4G2MzJcHy+OR2e/xgEwRy+vX26pzwtjPkRjNf24CPa0BwFbRmR5apbltCgTB10vT6xroStc8Quv/286Cg==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.18.tgz", + "integrity": "sha512-pK83EcOIiKCLGhrTwukZMo5jqd1sqqqhQwOVyxyvg+x9SY/lsnNzScA96OEfm+qQLBwK1OABA7Xc1wfkgkUxvw==", "requires": { - "@docusaurus/types": "2.0.0-beta.3", - "tslib": "^2.2.0" + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } } }, "@docusaurus/utils-validation": { - "version": "2.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.3.tgz", - "integrity": "sha512-jGX78NNrxDZFgDjLaa6wuJ/eKDoHdZFG2CVX3uCaIGe1x8eTMG2/e/39GzbZl+W7VHYpW0bzdf/5dFhaKLfQbQ==", + "version": "2.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.18.tgz", + "integrity": "sha512-3aDrXjJJ8Cw2MAYEk5JMNnr8UHPxmVNbPU/PIHFWmWK09nJvs3IQ8nc9+8I30aIjRdIyc/BIOCxgvAcJ4hsxTA==", "requires": { - "@docusaurus/utils": "2.0.0-beta.3", - "chalk": "^4.1.1", - "joi": "^17.4.0", - "tslib": "^2.1.0" + "@docusaurus/logger": "2.0.0-beta.18", + "@docusaurus/utils": "2.0.0-beta.18", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } } }, "@eslint/eslintrc": { @@ -26068,9 +4845,9 @@ } }, "@hapi/hoek": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.0.tgz", - "integrity": "sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw==" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" }, "@hapi/topo": { "version": "5.1.0", @@ -26097,12 +4874,36 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", + "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, + "@leichtgewicht/ip-codec": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz", + "integrity": "sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg==" + }, "@mdx-js/mdx": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", @@ -26152,239 +4953,6 @@ "source-map": "^0.5.0" } }, - "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", - "requires": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", - "requires": { - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" - }, - "@babel/helpers": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", - "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", - "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", - "requires": { - "@babel/highlight": "^7.14.5" - } - }, - "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" - } - }, - "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" - }, - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -26395,8 +4963,12 @@ "@mdx-js/react": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "requires": {} + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==" + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -26422,9 +4994,9 @@ } }, "@polka/url": { - "version": "1.0.0-next.15", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.15.tgz", - "integrity": "sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==" + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, "@sideway/address": { "version": "4.1.4", @@ -26450,14 +5022,13 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-PSv4RIVO1Y3kvHxjvqeVisk3E9XFoO04uwYBDWe217MFqKspplYswTuKLiJu0aLORQWzuQjfVsSlLPojwfYsLw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz", + "integrity": "sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g==", "requires": { "bluebird": "^3.7.1", "cheerio": "^0.22.0", - "eval": "^0.1.4", - "url": "^0.11.0", + "eval": "^0.1.8", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -26478,299 +5049,134 @@ } }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==" }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==" }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==" }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==" }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==" }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==" }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==" }, "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==" }, "@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", + "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", + "@svgr/babel-plugin-transform-svg-component": "^6.2.0" } }, "@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", + "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", "requires": { - "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-jsx": "^6.2.1", "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "dependencies": { - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - } + "cosmiconfig": "^7.0.1" } }, "@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", + "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", "requires": { - "@babel/types": "^7.12.6" + "@babel/types": "^7.15.6", + "entities": "^3.0.1" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" + } + } + }, + "@svgr/plugin-jsx": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", + "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "requires": { + "@babel/core": "^7.15.5", + "@svgr/babel-preset": "^6.2.0", + "@svgr/hast-util-to-babel-ast": "^6.2.1", + "svg-parser": "^2.0.2" } }, "@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", + "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", "requires": { - "cosmiconfig": "^7.0.0", + "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - } + "svgo": "^2.5.0" } }, "@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", + "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", "requires": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - } + "@babel/core": "^7.15.5", + "@babel/plugin-transform-react-constant-elements": "^7.14.5", + "@babel/preset-env": "^7.15.6", + "@babel/preset-react": "^7.14.5", + "@babel/preset-typescript": "^7.15.0", + "@svgr/core": "^6.2.1", + "@svgr/plugin-jsx": "^6.2.1", + "@svgr/plugin-svgo": "^6.2.0" } }, "@szmarczak/http-timer": { @@ -26782,9 +5188,9 @@ } }, "@trysound/sax": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz", - "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@tsconfig/docusaurus": { "version": "1.0.2", @@ -26792,6 +5198,40 @@ "integrity": "sha512-x4rRVb346vjyym6QbeB1Tv01XXwhbkujOmvDmtf0bT20oc2gbDhbmwpskKqZ5Of2Q/Vk4jNk1WMiLsZdJ9t7Dw==", "dev": true }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "@types/eslint": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", @@ -26815,24 +5255,41 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" }, - "@types/github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } }, "@types/glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dev": true, "requires": { "@types/minimatch": "*", "@types/node": "*" } }, "@types/hast": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.2.tgz", - "integrity": "sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", "requires": { "@types/unist": "*" } @@ -26840,13 +5297,20 @@ "@types/history": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==", - "dev": true + "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" }, "@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "requires": { + "@types/node": "*" + } }, "@types/js-yaml": { "version": "4.0.5", @@ -26873,10 +5337,16 @@ "@types/unist": "*" } }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true }, "@types/node": { "version": "16.3.3", @@ -26904,10 +5374,15 @@ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { "version": "17.0.3", @@ -26932,27 +5407,47 @@ "version": "5.1.13", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", - "dev": true, "requires": { "@types/history": "*", "@types/react": "*" } }, + "@types/react-router-config": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", + "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + }, + "dependencies": { + "@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + } + } + }, "@types/react-router-dom": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", - "dev": true, "requires": { "@types/history": "*", "@types/react": "*", "@types/react-router": "*" } }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==" + }, "@types/sax": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", - "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", "requires": { "@types/node": "*" } @@ -26962,11 +5457,44 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "requires": { + "@types/node": "*" + } + }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -27109,12 +5637,27 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } } }, "acorn": { @@ -27123,17 +5666,21 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==" + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", - "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, "address": { "version": "1.1.2", @@ -27160,202 +5707,72 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "requires": {} + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" }, "algoliasearch": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.3.tgz", - "integrity": "sha512-OLY0AWlPKGLbSaw14ivMB7BT5fPdp8VdzY4L8FtzZnqmLKsyes24cltGlf7/X96ACkYEcT390SReCDt/9SUIRg==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.0.tgz", + "integrity": "sha512-oHv4faI1Vl2s+YC0YquwkK/TsaJs79g2JFg5FDm2rKN12VItPTAeQ7hyJMHarOPPYuCnNC5kixbtcqvb21wchw==", "requires": { - "@algolia/cache-browser-local-storage": "4.10.3", - "@algolia/cache-common": "4.10.3", - "@algolia/cache-in-memory": "4.10.3", - "@algolia/client-account": "4.10.3", - "@algolia/client-analytics": "4.10.3", - "@algolia/client-common": "4.10.3", - "@algolia/client-personalization": "4.10.3", - "@algolia/client-search": "4.10.3", - "@algolia/logger-common": "4.10.3", - "@algolia/logger-console": "4.10.3", - "@algolia/requester-browser-xhr": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/requester-node-http": "4.10.3", - "@algolia/transporter": "4.10.3" - }, - "dependencies": { - "@algolia/cache-browser-local-storage": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.3.tgz", - "integrity": "sha512-TD1N7zg5lb56/PLjjD4bBl2eccEvVHhC7yfgFu2r9k5tf+gvbGxEZ3NhRZVKu2MObUIcEy2VR4LVLxOQu45Hlg==", - "requires": { - "@algolia/cache-common": "4.10.3" - } - }, - "@algolia/cache-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.3.tgz", - "integrity": "sha512-q13cPPUmtf8a2suBC4kySSr97EyulSXuxUkn7l1tZUCX/k1y5KNheMp8npBy8Kc8gPPmHpacxddRSfOncjiKFw==" - }, - "@algolia/cache-in-memory": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.3.tgz", - "integrity": "sha512-JhPajhOXAjUP+TZrZTh6KJpF5VKTKyWK2aR1cD8NtrcVHwfGS7fTyfXfVm5BqBqkD9U0gVvufUt/mVyI80aZww==", - "requires": { - "@algolia/cache-common": "4.10.3" - } - }, - "@algolia/client-account": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.3.tgz", - "integrity": "sha512-S/IsJB4s+e1xYctdpW3nAbwrR2y3pjSo9X21fJGoiGeIpTRdvQG7nydgsLkhnhcgAdLnmqBapYyAqMGmlcyOkg==", - "requires": { - "@algolia/client-common": "4.10.3", - "@algolia/client-search": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "@algolia/client-analytics": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.3.tgz", - "integrity": "sha512-vlHTbBqJktRgclh3v7bPQLfZvFIqY4erNFIZA5C7nisCj9oLeTgzefoUrr+R90+I+XjfoLxnmoeigS1Z1yg1vw==", - "requires": { - "@algolia/client-common": "4.10.3", - "@algolia/client-search": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "@algolia/client-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.3.tgz", - "integrity": "sha512-uFyP2Z14jG2hsFRbAoavna6oJf4NTXaSDAZgouZUZlHlBp5elM38sjNeA5HR9/D9J/GjwaB1SgB7iUiIWYBB4w==", - "requires": { - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "@algolia/client-search": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.3.tgz", - "integrity": "sha512-Zwnp2G94IrNFKWCG/k7epI5UswRkPvL9FCt7/slXe2bkjP2y/HA37gzRn+9tXoLVRwd7gBzrtOA4jFKIyjrtVw==", - "requires": { - "@algolia/client-common": "4.10.3", - "@algolia/requester-common": "4.10.3", - "@algolia/transporter": "4.10.3" - } - }, - "@algolia/logger-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.3.tgz", - "integrity": "sha512-M6xi+qov2bkgg1H9e1Qtvq/E/eKsGcgz8RBbXNzqPIYoDGZNkv+b3b8YMo3dxd4Wd6M24HU1iqF3kmr1LaXndg==" - }, - "@algolia/logger-console": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.3.tgz", - "integrity": "sha512-vVgRI7b4PHjgBdRkv/cRz490twvkLoGdpC4VYzIouSrKj8SIVLRhey3qgXk7oQXi3xoxVAv6NrklHfpO8Bpx0w==", - "requires": { - "@algolia/logger-common": "4.10.3" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.3.tgz", - "integrity": "sha512-4WIk1zreFbc1EF6+gsfBTQvwSNjWc20zJAAExRWql/Jq5yfVHmwOqi/CajA53/cXKFBqo80DAMRvOiwP+hOLYw==", - "requires": { - "@algolia/requester-common": "4.10.3" - } - }, - "@algolia/requester-common": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.3.tgz", - "integrity": "sha512-PNfLHmg0Hujugs3rx55uz/ifv7b9HVdSFQDb2hj0O5xZaBEuQCNOXC6COrXR8+9VEfqp2swpg7zwgtqFxh+BtQ==" - }, - "@algolia/requester-node-http": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.3.tgz", - "integrity": "sha512-A9ZcGfEvgqf0luJApdNcIhsRh6MShn2zn2tbjwjGG1joF81w+HUY+BWuLZn56vGwAA9ZB9n00IoJJpxibbfofg==", - "requires": { - "@algolia/requester-common": "4.10.3" - } - }, - "@algolia/transporter": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.3.tgz", - "integrity": "sha512-n1lRyKDbrckbMEgm7QXtj3nEWUuzA3aKLzVQ43/F/RCFib15j4IwtmYhXR6OIBRSc7+T0Hm48S0J6F+HeYCQkw==", - "requires": { - "@algolia/cache-common": "4.10.3", - "@algolia/logger-common": "4.10.3", - "@algolia/requester-common": "4.10.3" - } - } + "@algolia/cache-browser-local-storage": "4.13.0", + "@algolia/cache-common": "4.13.0", + "@algolia/cache-in-memory": "4.13.0", + "@algolia/client-account": "4.13.0", + "@algolia/client-analytics": "4.13.0", + "@algolia/client-common": "4.13.0", + "@algolia/client-personalization": "4.13.0", + "@algolia/client-search": "4.13.0", + "@algolia/logger-common": "4.13.0", + "@algolia/logger-console": "4.13.0", + "@algolia/requester-browser-xhr": "4.13.0", + "@algolia/requester-common": "4.13.0", + "@algolia/requester-node-http": "4.13.0", + "@algolia/transporter": "4.13.0" } }, "algoliasearch-helper": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.5.4.tgz", - "integrity": "sha512-t+FLhXYnPZiwjYe5ExyN962HQY8mi3KwRju3Lyf6OBgtRdx30d6mqvtClXf5NeBihH45Xzj6t4Y5YyvAI432XA==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.1.tgz", + "integrity": "sha512-IGK67xeut0wYRXQw+MlSDYmYK/6e+/a++HVf9MgSWYtPd6QIHWiOKpgMYRJMNF/zMjx0FPA16D/AypgWxSVBnQ==", "requires": { - "events": "^1.1.1" - }, - "dependencies": { - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - } + "@algolia/events": "^4.0.1" } }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-colors": { @@ -27364,25 +5781,10 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - } - } - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" }, "ansi-regex": { "version": "5.0.0", @@ -27413,34 +5815,19 @@ } }, "arg": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.0.tgz", - "integrity": "sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { "version": "3.1.4", @@ -27460,16 +5847,6 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, "array.prototype.flatmap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz", @@ -27486,11 +5863,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -27505,27 +5877,82 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "autoprefixer": { + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "requires": { + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "requires": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, + "electron-to-chromium": { + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + } + } }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.7" + } + }, + "babel-loader": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.4.tgz", + "integrity": "sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } } }, "babel-plugin-apply-mdx-type-prop": { @@ -27535,13 +5962,6 @@ "requires": { "@babel/helper-plugin-utils": "7.10.4", "@mdx-js/util": "1.6.22" - }, - "dependencies": { - "@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" - } } }, "babel-plugin-dynamic-import-node": { @@ -27561,20 +5981,15 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", - "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.2", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "dependencies": { - "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -27583,20 +5998,20 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz", - "integrity": "sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.14.0" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", - "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "bail": { @@ -27609,56 +6024,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base16": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", @@ -27679,37 +6044,33 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -27725,24 +6086,15 @@ } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "bonjour-service": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.11.tgz", + "integrity": "sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA==", "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", + "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - } + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.4" } }, "boolbase": { @@ -27750,6 +6102,68 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, + "boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "requires": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz", + "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -27783,31 +6197,10 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" - }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacheable-request": { "version": "6.1.0", @@ -27873,9 +6266,9 @@ } }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "camelcase-css": { "version": "2.0.1", @@ -28020,10 +6413,22 @@ } } }, + "cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "requires": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + } + }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -28051,30 +6456,9 @@ } }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "classnames": { "version": "2.3.1", @@ -28082,9 +6466,9 @@ "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" }, "clean-css": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.1.3.tgz", - "integrity": "sha512-qGXzUCDpLwAlPx0kYeU4QXjzQIcIYZbJjD4FNm7NnSjoP0hYMVZhHOpUYJ6AwfkMX2cceLRq54MeCgHy/va1cA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "requires": { "source-map": "~0.6.0" }, @@ -28102,9 +6486,9 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" }, "cli-color": { "version": "2.0.0", @@ -28128,75 +6512,23 @@ } } }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } + "colors": "1.4.0", + "string-width": "^4.2.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "clone-response": { @@ -28212,68 +6544,11 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } - } - }, "collapse-white-space": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -28288,14 +6563,20 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colord": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.1.0.tgz", - "integrity": "sha512-H5sDP9XDk2uP+x/xSGkgB9SEFc1bojdI5DMKU0jmSXQtml2GIe48dj1DcSS0e53QQAHn+JKqUXbGeGX24xWD7w==" + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" }, "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "optional": true }, "combine-promises": { "version": "1.1.0", @@ -28317,11 +6598,6 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -28344,11 +6620,6 @@ "vary": "~1.1.2" }, "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -28393,12 +6664,9 @@ "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { "version": "1.0.4", @@ -28414,19 +6682,19 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" }, "copy-to-clipboard": { "version": "3.3.1", @@ -28436,36 +6704,140 @@ "toggle-selection": "^1.0.6" } }, + "copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "requires": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==" + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + } + } + }, "core-js": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.15.2.tgz", - "integrity": "sha512-tKs41J7NJVuaya8DxIOCnl8QuPHx5/ZVbFo1oKgVl1qHFBBrDctzQGtuLjPpRdNTWmKPH6oEvgN/MUID+l485Q==" + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz", + "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==" }, "core-js-compat": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.15.2.tgz", - "integrity": "sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==", + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz", + "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "dependencies": { "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, "electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" }, "semver": { "version": "7.0.0", @@ -28475,21 +6847,33 @@ } }, "core-js-pure": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.15.2.tgz", - "integrity": "sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA==" + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz", + "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==" }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } }, "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "requires": { - "node-fetch": "2.6.1" + "node-fetch": "2.6.7" } }, "cross-spawn": { @@ -28507,45 +6891,72 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, - "css-color-names": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", - "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==" + "css-declaration-sorter": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==" + }, + "css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + } }, "css-minimizer-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", "requires": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", - "p-limit": "^3.0.2", "postcss": "^8.3.5", - "schema-utils": "^3.0.0", + "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" }, "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "cssnano": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.6.tgz", - "integrity": "sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "requires": { - "cosmiconfig": "^7.0.0", - "cssnano-preset-default": "^5.1.3", - "is-resolvable": "^1.1.0" + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "source-map": { @@ -28556,22 +6967,17 @@ } }, "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "requires": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, "css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -28589,219 +6995,78 @@ } }, "css-what": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", - "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, - "cssnano-preset-advanced": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.1.3.tgz", - "integrity": "sha512-pS4+Q2Hoo/FevZs2JqA2BG8Vn5o5VeXgj+z6kGndKTq3RFYvlKeJ1ZPnLXo9zyYKwmSqWW0rWqtGxxmigIte0Q==", + "cssnano": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", "requires": { - "autoprefixer": "^10.2.0", - "cssnano-preset-default": "^5.1.3", - "postcss-discard-unused": "^5.0.1", - "postcss-merge-idents": "^5.0.1", - "postcss-reduce-idents": "^5.0.1", - "postcss-zindex": "^5.0.1" - }, - "dependencies": { - "autoprefixer": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.1.tgz", - "integrity": "sha512-L8AmtKzdiRyYg7BUXJTzigmhbQRCXFKz6SA1Lqo0+AR2FBbQ4aTAPFSDlOutnFkjhiz8my4agGXog1xlMjPJ6A==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-lite": "^1.0.30001243", - "colorette": "^1.2.2", - "fraction.js": "^4.1.1", - "normalize-range": "^0.1.2", - "postcss-value-parser": "^4.1.0" - } - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - } + "cssnano-preset-default": "^5.2.7", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-advanced": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.3.tgz", + "integrity": "sha512-AB9SmTSC2Gd8T7PpKUsXFJ3eNsg7dc4CTZ0+XAJ29MNxyJsrCEk7N1lw31bpHrsQH2PVJr21bbWgGAfA9j0dIA==", + "requires": { + "autoprefixer": "^10.3.7", + "cssnano-preset-default": "^5.2.7", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" } }, "cssnano-preset-default": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.3.tgz", - "integrity": "sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", "requires": { - "css-declaration-sorter": "^6.0.3", - "cssnano-utils": "^2.0.1", - "postcss-calc": "^8.0.0", - "postcss-colormin": "^5.2.0", - "postcss-convert-values": "^5.0.1", - "postcss-discard-comments": "^5.0.1", - "postcss-discard-duplicates": "^5.0.1", - "postcss-discard-empty": "^5.0.1", - "postcss-discard-overridden": "^5.0.1", - "postcss-merge-longhand": "^5.0.2", - "postcss-merge-rules": "^5.0.2", - "postcss-minify-font-values": "^5.0.1", - "postcss-minify-gradients": "^5.0.1", - "postcss-minify-params": "^5.0.1", - "postcss-minify-selectors": "^5.1.0", - "postcss-normalize-charset": "^5.0.1", - "postcss-normalize-display-values": "^5.0.1", - "postcss-normalize-positions": "^5.0.1", - "postcss-normalize-repeat-style": "^5.0.1", - "postcss-normalize-string": "^5.0.1", - "postcss-normalize-timing-functions": "^5.0.1", - "postcss-normalize-unicode": "^5.0.1", - "postcss-normalize-url": "^5.0.2", - "postcss-normalize-whitespace": "^5.0.1", - "postcss-ordered-values": "^5.0.2", - "postcss-reduce-initial": "^5.0.1", - "postcss-reduce-transforms": "^5.0.1", - "postcss-svgo": "^5.0.2", - "postcss-unique-selectors": "^5.0.1" - }, - "dependencies": { - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "css-declaration-sorter": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz", - "integrity": "sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==", - "requires": { - "timsort": "^0.3.0" - } - }, - "electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" - }, - "postcss-discard-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", - "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", - "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", - "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", - "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", - "requires": {} - }, - "postcss-merge-longhand": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", - "integrity": "sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==", - "requires": { - "css-color-names": "^1.0.1", - "postcss-value-parser": "^4.1.0", - "stylehacks": "^5.0.1" - } - }, - "postcss-merge-rules": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", - "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^2.0.1", - "postcss-selector-parser": "^6.0.5", - "vendors": "^1.0.3" - } - }, - "postcss-minify-params": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", - "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", - "requires": { - "alphanum-sort": "^1.0.2", - "browserslist": "^4.16.0", - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0", - "uniqs": "^2.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", - "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", - "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-ordered-values": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", - "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", - "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - } + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.4", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.2", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" } }, "cssnano-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", - "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", - "requires": {} + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==" }, "csso": { "version": "4.2.0", @@ -28834,16 +7099,6 @@ "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -28852,19 +7107,6 @@ "mimic-response": "^1.0.0" } }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -28882,12 +7124,11 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, "defer-to-connect": { @@ -28895,6 +7136,11 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -28903,41 +7149,19 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" } }, "depd": { @@ -29001,20 +7225,11 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", + "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "requires": { - "buffer-indexof": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" } }, "doctrine": { @@ -29034,39 +7249,37 @@ "utila": "~0.4" } }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, "domelementtype": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "requires": { "domelementtype": "^2.2.0" } }, "domutils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", - "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" - }, - "dependencies": { - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - } } }, "dot-case": { @@ -29084,6 +7297,13 @@ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + } } }, "duplexer": { @@ -29096,6 +7316,11 @@ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -29107,9 +7332,9 @@ "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==" }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "emojis-list": { "version": "3.0.0", @@ -29157,14 +7382,6 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -29177,6 +7394,7 @@ "version": "1.19.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -29209,6 +7427,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -29370,8 +7589,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true, - "requires": {} + "dev": true }, "eslint-mdx": { "version": "1.13.0", @@ -29621,10 +7839,11 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eval": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", - "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", "requires": { + "@types/node": "*", "require-like": ">= 0.1.1" } }, @@ -29648,121 +7867,40 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "requires": { - "original": "^1.0.0" - } - }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" } } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -29776,19 +7914,32 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -29801,6 +7952,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -29834,66 +8000,15 @@ "is-extendable": "^0.1.0" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -29922,9 +8037,9 @@ } }, "fastq": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", - "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "requires": { "reusify": "^1.0.4" } @@ -29946,17 +8061,17 @@ } }, "fbjs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", - "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", "requires": { - "cross-fetch": "^3.0.4", + "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" + "ua-parser-js": "^0.7.30" } }, "fbjs-css-vars": { @@ -29972,21 +8087,6 @@ "xml-js": "^1.6.11" } }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - } - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -30005,16 +8105,10 @@ "schema-utils": "^3.0.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, "filesize": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", - "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" }, "fill-range": { "version": "7.0.1", @@ -30054,9 +8148,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -30089,202 +8183,76 @@ "dev": true }, "flux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.1.tgz", - "integrity": "sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", + "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", "requires": { "fbemitter": "^3.0.0", - "fbjs": "^3.0.0" + "fbjs": "^3.0.1" } }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "fork-ts-checker-webpack-plugin": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", - "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", + "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", "requires": { - "@babel/code-frame": "^7.5.5", - "chalk": "^2.4.1", - "micromatch": "^3.1.10", + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", "minimatch": "^3.0.4", - "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { - "color-convert": "^1.9.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } } } }, @@ -30294,23 +8262,30 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fraction.js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", - "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -30338,11 +8313,6 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, "get-intrinsic": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", @@ -30376,30 +8346,16 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, "github-slugger": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz", - "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==", - "requires": { - "emoji-regex": ">=6.0.0 <=6.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz", - "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=" - } - } + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" }, "glob": { "version": "7.1.7", @@ -30485,22 +8441,22 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "dependencies": { "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" } } }, @@ -30558,12 +8514,11 @@ } }, "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" + "duplexer": "^0.1.2" } }, "handle-thing": { @@ -30582,7 +8537,8 @@ "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -30598,62 +8554,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -30737,11 +8642,6 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, "history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -30774,6 +8674,11 @@ "wbuf": "^1.1.0" }, "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -30798,61 +8703,49 @@ } } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", "he": "^1.2.0", - "param-case": "^3.0.3", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^4.6.3" + "terser": "^5.10.0" }, "dependencies": { - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "requires": { - "source-map": "~0.6.0" - } + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" }, "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { "commander": { @@ -30874,6 +8767,18 @@ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -30948,28 +8853,21 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "toidentifier": "1.0.1" } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" }, "http-proxy": { "version": "1.18.1", @@ -30982,134 +8880,21 @@ } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", + "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { + "is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" } } }, @@ -31126,12 +8911,30 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, + "image-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz", + "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==", + "requires": { + "queue": "6.0.2" + } + }, + "immer": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", + "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==" + }, "import-fresh": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", @@ -31146,63 +8949,6 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "requires": { - "find-up": "^3.0.0" - } - } - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -31214,9 +8960,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.26", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.26.tgz", - "integrity": "sha512-0/Dt+89mf8xW+9/hKGmynK+WOAsiy0QydVJL0qie6WK57yGIQv+SjJrhMybKndnmkZBQ+Vlt0tWPnTakx8X2Qw==" + "version": "0.2.0-alpha.38", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.38.tgz", + "integrity": "sha512-1WsmqSMI5IqzrUx3goq+miJznHBonbE3aoqZ1AR/i/oHhroxNeSV6Awv5VoVfXBhfTzLSnxkHaRI2qpAMYcCzw==" }, "inflight": { "version": "1.0.6", @@ -31242,19 +8988,11 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, "requires": { "get-intrinsic": "^1.1.0", "has": "^1.0.3", @@ -31266,48 +9004,18 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, "is-alphabetical": { "version": "1.0.4", @@ -31329,14 +9037,6 @@ "is-decimal": "^1.0.0" } }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "requires": { - "call-bind": "^1.0.0" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -31345,7 +9045,8 @@ "is-bigint": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true }, "is-binary-path": { "version": "2.1.0", @@ -31359,6 +9060,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -31371,7 +9073,8 @@ "is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true }, "is-ci": { "version": "2.0.0", @@ -31379,33 +9082,6 @@ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - } - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - }, - "dependencies": { - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - } } }, "is-core-module": { @@ -31416,56 +9092,17 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true }, "is-decimal": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -31511,7 +9148,8 @@ "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true }, "is-npm": { "version": "5.0.0", @@ -31526,36 +9164,19 @@ "is-number-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true }, "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -31584,6 +9205,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -31594,11 +9216,6 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, "is-root": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", @@ -31607,17 +9224,19 @@ "is-shared-array-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -31626,6 +9245,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -31639,6 +9259,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -31648,11 +9269,6 @@ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, "is-word-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", @@ -31672,9 +9288,9 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isexe": { "version": "2.0.0", @@ -31808,11 +9424,6 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -31848,11 +9459,6 @@ "json-buffer": "3.0.0" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -31864,9 +9470,9 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" }, "latest-version": { "version": "5.1.0", @@ -31891,6 +9497,11 @@ "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==" + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -32010,11 +9621,6 @@ "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" }, - "lodash.toarray": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", - "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" - }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -32026,11 +9632,6 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, "longest-streak": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", @@ -32090,19 +9691,6 @@ } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, "markdown-escapes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", @@ -32190,6 +9778,14 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "requires": { + "fs-monkey": "1.0.3" + } + }, "memoizee": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", @@ -32214,39 +9810,6 @@ } } }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -32267,11 +9830,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" - }, "micromark": { "version": "2.11.4", "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", @@ -32283,19 +9841,12 @@ } }, "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "dependencies": { - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -32336,27 +9887,46 @@ } }, "mini-css-extract-plugin": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", - "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -32379,37 +9949,18 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } }, - "module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + "mrmime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", + "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==" }, "ms": { "version": "2.1.2", @@ -32417,19 +9968,14 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.4.tgz", + "integrity": "sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw==", "requires": { - "dns-packet": "^1.3.1", + "dns-packet": "^5.2.2", "thunky": "^1.0.2" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" - }, "mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", @@ -32447,53 +9993,10 @@ "thenify-all": "^1.0.0" } }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "optional": true - }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz", + "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==" }, "natural-compare": { "version": "1.4.0", @@ -32502,9 +10005,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", @@ -32517,11 +10020,6 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, "no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -32532,22 +10030,25 @@ } }, "node-emoji": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", - "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "requires": { - "lodash.toarray": "^4.4.0" + "lodash": "^4.17.21" } }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { "version": "1.1.73", @@ -32570,18 +10071,11 @@ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - } + "path-key": "^3.0.0" } }, "nprogress": { @@ -32590,9 +10084,9 @@ "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" }, "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "requires": { "boolbase": "^1.0.0" } @@ -32612,66 +10106,17 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -32705,16 +10150,6 @@ "es-abstract": "^1.19.1" } }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, "object.hasown": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz", @@ -32725,18 +10160,11 @@ "es-abstract": "^1.19.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, "object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -32778,12 +10206,13 @@ } }, "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, "opener": { @@ -32791,21 +10220,6 @@ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "requires": { - "is-wsl": "^1.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - } - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -32820,24 +10234,11 @@ "word-wrap": "^1.2.3" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "requires": { - "url-parse": "^1.4.3" - } - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -32873,11 +10274,12 @@ } }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "requires": { - "retry": "^0.12.0" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" } }, "p-try": { @@ -32945,15 +10347,23 @@ } }, "parse-numeric-range": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz", - "integrity": "sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -32968,16 +10378,6 @@ "tslib": "^2.0.3" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -33004,122 +10404,27 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pkg-dir": { "version": "4.2.0", @@ -33197,112 +10502,239 @@ } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, "postcss": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", - "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "requires": { - "colorette": "^1.2.2", - "nanoid": "^3.1.23", - "source-map-js": "^0.6.2" + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, "postcss-calc": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", - "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "requires": { - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" } }, "postcss-colormin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.0.tgz", - "integrity": "sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "requires": { "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "colord": "^2.0.1", - "postcss-value-parser": "^4.1.0" + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" }, "dependencies": { "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, "electron-to-chromium": { - "version": "1.3.779", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.779.tgz", - "integrity": "sha512-nreave0y/1Qhmo8XtO6C/LpawNyC6U26+q7d814/e+tIqUK073pM+4xW7WUXyqCRa5K4wdxHmNMBAi8ap9nEew==" + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" } } }, "postcss-convert-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz", - "integrity": "sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", + "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, + "postcss-discard-comments": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==" + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==" + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==" + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==" + }, "postcss-discard-unused": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.0.1.tgz", - "integrity": "sha512-tD6xR/xyZTwfhKYRw0ylfCY8wbfhrjpKAMnDKRTLMy2fNW5hl0hoV6ap5vo2JdCkuHkP3CHw72beO4Y8pzFdww==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", "requires": { "postcss-selector-parser": "^6.0.5" } }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, "postcss-merge-idents": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.0.1.tgz", - "integrity": "sha512-xu8ueVU0RszbI2gKkxR6mluupsOSSLvt8q4gA2fcKFkA+x6SlH3cb4cFHpDvcRCNFbUmCR/VUub+Y6zPOjPx+Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-merge-longhand": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + } + }, + "postcss-merge-rules": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "dependencies": { + "browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "requires": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, + "electron-to-chromium": { + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + } } }, "postcss-minify-font-values": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", - "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.1.tgz", - "integrity": "sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "requires": { - "cssnano-utils": "^2.0.1", - "is-color-stop": "^1.1.0", - "postcss-value-parser": "^4.1.0" + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", + "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", + "requires": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "browserslist": { + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", + "requires": { + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, + "electron-to-chromium": { + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + } } }, "postcss-minify-selectors": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", - "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", "requires": { - "alphanum-sort": "^1.0.2", "postcss-selector-parser": "^6.0.5" } }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==" + }, "postcss-modules-local-by-default": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", @@ -33311,14 +10743,14 @@ "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" - }, - "dependencies": { - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - } + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { @@ -33327,178 +10759,214 @@ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "requires": { "icss-utils": "^5.0.0" - }, - "dependencies": { - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "requires": {} - } + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==" + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "requires": { + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", - "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", - "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", - "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", - "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", - "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", "requires": { - "browserslist": "^4.16.0", - "postcss-value-parser": "^4.1.0" + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" }, "dependencies": { "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, "electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" } } }, "postcss-normalize-url": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", - "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "requires": { - "is-absolute-url": "^3.0.3", "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-whitespace": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", - "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-reduce-idents": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.0.1.tgz", - "integrity": "sha512-6Rw8iIVFbqtaZExgWK1rpVgP7DPFRPh0DDFZxJ/ADNqPiH10sPCoq5tgo6kLiTyfh9sxjKYjXdc8udLEcPOezg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", "requires": { - "postcss-value-parser": "^4.1.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-reduce-initial": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", - "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", "requires": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.6", "caniuse-api": "^3.0.0" }, "dependencies": { "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, "electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" } } }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "postcss-sort-media-queries": { - "version": "3.11.12", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-3.11.12.tgz", - "integrity": "sha512-PNhEOWR/btZ0bNNRqqdW4TWxBPQ1mu2I6/Zpco80vBUDSyEjtduUAorY0Vm68rvDlGea3+sgEnQ36iQ1A/gG8Q==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", + "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", "requires": { - "sort-css-media-queries": "1.5.4" + "sort-css-media-queries": "2.0.4" } }, "postcss-svgo": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", - "integrity": "sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "requires": { - "postcss-value-parser": "^4.1.0", - "svgo": "^2.3.0" + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" } }, "postcss-unique-selectors": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", - "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "requires": { - "alphanum-sort": "^1.0.2", - "postcss-selector-parser": "^6.0.5", - "uniqs": "^2.0.0" + "postcss-selector-parser": "^6.0.5" } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "postcss-zindex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.0.1.tgz", - "integrity": "sha512-nwgtJJys+XmmSGoYCcgkf/VczP8Mp/0OfSv3v0+fw0uABY4yxw+eFs0Xp9nAZHIKnS5j+e9ywQ+RD+ONyvl5pA==", - "requires": {} + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==" }, "prebuild-webpack-plugin": { "version": "1.1.1", @@ -33517,6 +10985,11 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, "prettier": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", @@ -33524,50 +10997,12 @@ "dev": true }, "pretty-error": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", - "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "requires": { "lodash": "^4.17.20", - "renderkid": "^2.0.6" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } + "renderkid": "^3.0.0" } }, "pretty-time": { @@ -33578,13 +11013,12 @@ "prism-react-renderer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz", - "integrity": "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==", - "requires": {} + "integrity": "sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ==" }, "prismjs": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz", - "integrity": "sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow==" + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==" }, "process-nextick-args": { "version": "2.0.1", @@ -33606,9 +11040,9 @@ } }, "prompts": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", - "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -33639,13 +11073,15 @@ "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -33656,9 +11092,9 @@ } }, "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "pupa": { "version": "2.1.1", @@ -33673,25 +11109,18 @@ "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "requires": { + "inherits": "~2.0.3" + } }, "queue-microtask": { "version": "1.2.3", @@ -33707,19 +11136,26 @@ } }, "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + } } }, "rc": { @@ -33752,8 +11188,7 @@ "react-async": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/react-async/-/react-async-10.0.1.tgz", - "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==", - "requires": {} + "integrity": "sha512-ORUz5ca0B57QgBIzEZM5SuhJ6xFjkvEEs0gylLNlWf06vuVcLZsjIw3wx58jJkZG38p+0nUAxRgFW2b7mnVZzA==" }, "react-base16-styling": { "version": "0.6.0", @@ -33776,36 +11211,81 @@ } }, "react-dev-utils": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", - "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz", + "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==", "requires": { - "@babel/code-frame": "7.10.4", - "address": "1.1.2", - "browserslist": "4.14.2", - "chalk": "2.4.2", - "cross-spawn": "7.0.3", - "detect-port-alt": "1.1.6", - "escape-string-regexp": "2.0.0", - "filesize": "6.1.0", - "find-up": "4.1.0", - "fork-ts-checker-webpack-plugin": "4.1.6", - "global-modules": "2.0.0", - "globby": "11.0.1", - "gzip-size": "5.1.1", - "immer": "8.0.1", - "is-root": "2.1.0", - "loader-utils": "2.0.0", - "open": "^7.0.2", - "pkg-up": "3.1.0", - "prompts": "2.4.0", - "react-error-overlay": "^6.0.9", - "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "6.0.0", - "text-table": "0.2.0" + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.10", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -33815,30 +11295,59 @@ } }, "browserslist": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", - "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001125", - "electron-to-chromium": "^1.3.564", - "escalade": "^3.0.2", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -33872,48 +11381,57 @@ "debug": "^2.6.0" } }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + "electron-to-chromium": { + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" }, - "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" - } + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, - "immer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", - "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + "loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "p-limit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" } } } @@ -33929,24 +11447,25 @@ } }, "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz", + "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==" }, "react-fast-compare": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" }, - "react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "react-helmet-async": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.2.3.tgz", + "integrity": "sha512-mCk2silF53Tq/YaYdkl2sB+/tDoPnaxN7dFS/6ZLJb/rhUY2EWGI5Xj2b4jHppScMqY45MbgPSwTxDchKpZ5Kw==", "requires": { - "object-assign": "^4.1.1", + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" } }, "react-is": { @@ -33971,11 +11490,12 @@ "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "react-loadable": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", - "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "version": "npm:@docusaurus/react-loadable@5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", "requires": { - "prop-types": "^15.5.0" + "@types/react": "*", + "prop-types": "^15.6.2" } }, "react-loadable-ssr-addon-v5-slorber": { @@ -33987,11 +11507,11 @@ } }, "react-router": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", - "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", "requires": { - "@babel/runtime": "^7.1.2", + "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", @@ -34001,21 +11521,6 @@ "react-is": "^16.6.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - } } }, "react-router-config": { @@ -34027,25 +11532,19 @@ } }, "react-router-dom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", - "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", "requires": { - "@babel/runtime": "^7.1.2", + "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.2.0", + "react-router": "5.2.1", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } }, - "react-side-effect": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", - "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", - "requires": {} - }, "react-textarea-autosize": { "version": "8.3.3", "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", @@ -34083,9 +11582,9 @@ } }, "reading-time": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.3.0.tgz", - "integrity": "sha512-RJ8J5O6UvrclfZpcPSPuKusrdRfoY7uXXoYOOdeswZNtSkQaewT3919yz6RyloDBR+iwcUyz5zGOUjhgvfuv3g==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" }, "rechoir": { "version": "0.6.2", @@ -34109,17 +11608,17 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.14.5", @@ -34129,38 +11628,11 @@ "@babel/runtime": "^7.8.4" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "regexp.prototype.flags": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -34173,16 +11645,16 @@ "dev": true }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "registry-auth-token": { @@ -34202,14 +11674,14 @@ } }, "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "requires": { "jsesc": "~0.5.0" }, @@ -34636,42 +12108,59 @@ "xtend": "^4.0.1" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -34686,21 +12175,6 @@ "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - } - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -34711,11 +12185,6 @@ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -34724,31 +12193,16 @@ "lowercase-keys": "^1.0.0" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -34763,14 +12217,13 @@ "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" }, "rtlcss": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.3.0.tgz", - "integrity": "sha512-XZ2KEatH2nU5yPlts1Wu8SGIuZ3ndN025HQX5MqtUCUiOn5WkCDbcpJ2VJWjpuFmM2cUTQ1xtH21fhMCSseI5A==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", "requires": { - "chalk": "^4.1.0", "find-up": "^5.0.0", - "mkdirp": "^1.0.4", - "postcss": "^8.2.4", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", "strip-json-comments": "^3.1.1" }, "dependencies": { @@ -34791,11 +12244,6 @@ "p-locate": "^5.0.0" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, "p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -34815,18 +12263,11 @@ } }, "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } + "tslib": "^2.1.0" } }, "safe-buffer": { @@ -34834,14 +12275,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -34886,11 +12319,11 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1" } }, "semver": { @@ -34917,9 +12350,9 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -34928,9 +12361,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -34952,9 +12385,14 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" } } }, @@ -34981,16 +12419,6 @@ "range-parser": "1.2.0" }, "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, "mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", @@ -35008,11 +12436,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" } } }, @@ -35067,30 +12490,14 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "send": "0.17.2" } }, "setimmediate": { @@ -35099,9 +12506,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shallow-clone": { "version": "3.0.1", @@ -35111,6 +12518,11 @@ "kind-of": "^6.0.2" } }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -35125,9 +12537,9 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" }, "shelljs": { "version": "0.8.5", @@ -35143,6 +12555,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -35150,25 +12563,18 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sirv": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.12.tgz", - "integrity": "sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", "requires": { - "@polka/url": "^1.0.0-next.15", - "mime": "^2.3.1", + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", "totalist": "^1.0.0" - }, - "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" - } } }, "sisteransi": { @@ -35177,20 +12583,20 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "sitemap": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.0.0.tgz", - "integrity": "sha512-Ud0jrRQO2k7fEtPAM+cQkBKoMvxQyPKNXKDLn8tRVHxRCsdDQ2JZvw+aZ5IRYYQVAV9iGxEar6boTwZzev+x3g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", "requires": { - "@types/node": "^15.0.1", + "@types/node": "^17.0.5", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" }, "dependencies": { "@types/node": { - "version": "15.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.2.tgz", - "integrity": "sha512-dvMUE/m2LbXPwlvVuzCyslTEtQ2ZwuuFClDrOQ6mp2CenCg971719PTILZ4I6bTP27xfFFc+o7x2TkLuun/MPw==" + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" } } }, @@ -35210,127 +12616,20 @@ "is-fullwidth-code-point": "^3.0.0" } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, "sort-css-media-queries": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.4.tgz", - "integrity": "sha512-YP5W/h4Sid/YP7Lp87ejJ5jP13/Mtqt2vx33XyhO+IAugKlufRPbOrPlIiEUuxmpNBSBd3EeeQpFhdu3RfI2Ag==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", + "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==" }, "source-list-map": { "version": "2.0.1", @@ -35343,21 +12642,9 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", - "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-support": { "version": "0.5.20", @@ -35375,11 +12662,6 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" - }, "space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", @@ -35410,33 +12692,6 @@ "wbuf": "^1.7.3" } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -35452,52 +12707,15 @@ "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "std-env": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", - "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", - "requires": { - "ci-info": "^1.6.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", + "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" }, "string-replace-loader": { "version": "3.0.3", @@ -35546,6 +12764,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -35555,11 +12774,27 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "stringify-entities": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", @@ -35579,13 +12814,6 @@ "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - } } }, "strip-ansi": { @@ -35601,11 +12829,6 @@ "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -35625,30 +12848,40 @@ } }, "stylehacks": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", - "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", "requires": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.6", "postcss-selector-parser": "^6.0.4" }, "dependencies": { "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, "electron-to-chromium": { - "version": "1.3.788", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.788.tgz", - "integrity": "sha512-dbMIpX4E4/Gk4gzOh1GYS7ls1vGsByWKpIqLviJi1mSmSt5BvrWLLtSqpFE5BaC7Ef4NnI0GMaiddNX2Brw6zA==" + "version": "1.4.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz", + "integrity": "sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" } } }, @@ -35673,16 +12906,16 @@ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", - "integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "requires": { - "@trysound/sax": "0.1.1", - "chalk": "^4.1.0", - "commander": "^7.1.0", + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", "css-select": "^4.1.3", - "css-tree": "^1.1.2", + "css-tree": "^1.1.3", "csso": "^4.2.0", + "picocolors": "^1.0.0", "stable": "^0.1.8" }, "dependencies": { @@ -35830,15 +13063,10 @@ "next-tick": "1" } }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, "tiny-invariant": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", - "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" }, "tiny-warning": { "version": "1.0.3", @@ -35850,64 +13078,11 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -35922,15 +13097,20 @@ "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "totalist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -35946,11 +13126,6 @@ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" }, - "ts-essentials": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", - "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" - }, "tslib": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", @@ -36000,14 +13175,15 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.1", @@ -36025,28 +13201,28 @@ } }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, "unified": { "version": "9.2.0", @@ -36061,22 +13237,6 @@ "vfile": "^4.0.0" } }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -36158,52 +13318,67 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" }, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" - }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -36219,20 +13394,6 @@ } } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -36243,48 +13404,23 @@ "schema-utils": "^3.0.0" } }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "requires": { "prepend-http": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - } } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, "use-composed-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", - "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", - "requires": { - "ts-essentials": "^2.0.3" - } + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.2.1.tgz", + "integrity": "sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==" }, "use-isomorphic-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", - "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", - "requires": {} + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==" }, "use-latest": { "version": "1.2.0", @@ -36299,17 +13435,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -36326,9 +13451,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", @@ -36346,11 +13471,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" - }, "vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -36377,15 +13497,15 @@ } }, "wait-on": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", - "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", "requires": { - "axios": "^0.21.1", - "joi": "^17.3.0", + "axios": "^0.25.0", + "joi": "^17.6.0", "lodash": "^4.17.21", "minimist": "^1.2.5", - "rxjs": "^6.6.3" + "rxjs": "^7.5.4" } }, "watchpack": { @@ -36415,10 +13535,16 @@ "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, "webpack": { "version": "5.58.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.58.2.tgz", "integrity": "sha512-3S6e9Vo1W2ijk4F4PPWRIu6D/uGgqaPmqw+av3W3jLDujuNkdxX5h5c+RQ6GkjVR+WwIPOfgY8av+j5j4tMqJw==", + "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", "@types/estree": "^0.0.50", @@ -36449,25 +13575,26 @@ "acorn": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} + "dev": true } } }, "webpack-bundle-analyzer": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz", - "integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", "requires": { "acorn": "^8.0.4", "acorn-walk": "^8.0.0", "chalk": "^4.1.0", - "commander": "^6.2.0", + "commander": "^7.2.0", "gzip-size": "^6.0.0", "lodash": "^4.17.20", "opener": "^1.5.2", @@ -36476,454 +13603,146 @@ }, "dependencies": { "acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==" + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" }, "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "requires": {} + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" } } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz", + "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==", "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.4.1", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } } } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.8.0.tgz", + "integrity": "sha512-yZ7OWVP1nOtv8s10R/ZCsH6zf6QKkNusMRBE9DsQbOknRzKaFYYrbwVPCXp8ynUOTt3RlD9szM8H0pUlrJ6wcw==", "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", "serve-index": "^1.9.1", "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "requires": { - "array-uniq": "^1.0.1" + "fast-deep-equal": "^3.1.3" } }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "sockjs-client": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", - "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + "ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" } } }, @@ -36934,18 +13753,6 @@ "requires": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" - }, - "dependencies": { - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - } } }, "webpack-sources": { @@ -36953,6 +13760,17 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" }, + "webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "requires": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + } + }, "websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -36968,6 +13786,15 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -36980,6 +13807,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -36988,17 +13816,37 @@ "is-symbol": "^1.0.3" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "requires": { - "string-width": "^4.0.0" + "string-width": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "wildcard": { @@ -37012,22 +13860,44 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "requires": { - "microevent.ts": "~0.1.1" - } - }, "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "wrappy": { @@ -37047,12 +13917,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" }, "xdg-basedir": { "version": "4.0.0", @@ -37072,11 +13939,6 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -37087,107 +13949,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - } - } - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/docs/package.json b/docs/package.json index 8941645e..53b69bbb 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.0.0-beta.3", - "@docusaurus/preset-classic": "^2.0.0-beta.3", + "@docusaurus/core": "^2.0.0-beta.18", + "@docusaurus/preset-classic": "^2.0.0-beta.18", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.16", @@ -43,8 +43,8 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.0.0-beta.3", - "@docusaurus/types": "^2.0.0-beta.3", + "@docusaurus/module-type-aliases": "^2.0.0-beta.18", + "@docusaurus/types": "^2.0.0-beta.18", "@tsconfig/docusaurus": "^1.0.2", "@types/js-yaml": "^4.0.5", "@types/react": "^17.0.3", From 17affd8081a03669720dc05766832dfa21d0c639 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 5 Apr 2022 19:28:46 +0000 Subject: [PATCH 035/494] refactor(docs): Bump typescript dependency. * Newer `tsc` needed for Docusaurus changes. --- docs/package-lock.json | 6 +++--- docs/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 24e40eaa..64573d4a 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -13169,9 +13169,9 @@ } }, "typescript": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", - "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "ua-parser-js": { diff --git a/docs/package.json b/docs/package.json index 53b69bbb..755482b6 100644 --- a/docs/package.json +++ b/docs/package.json @@ -60,7 +60,7 @@ "prebuild-webpack-plugin": "^1.1.1", "prettier": "2.3.1", "string-replace-loader": "^3.0.3", - "typescript": "^4.2.3", + "typescript": "^4.6.3", "webpack": "^5.46.0" } } From c259c7b27aa909917f5b7a2b6d9c11354f1550c4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 5 Apr 2022 21:02:14 +0000 Subject: [PATCH 036/494] fix(docs): Updated proper API key. --- docs/docusaurus.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 536fa922..ff1a1360 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -106,7 +106,7 @@ module.exports = { }, algolia: { appId: "USXLDJ14JE", - apiKey: "75325855fc90356828fe212d38e5ca34", + apiKey: "384a3bd2d50136c9dc8c8ddfe1b3a4b2", indexName: "zmkfirmware", }, }, From 6501e68c2d070fc5c85df2cbffe143e5f68ab9e8 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 6 Apr 2022 02:26:38 +0000 Subject: [PATCH 037/494] fix(docs): Remove breadcrumbs (for now) * Remove breadcrumbs until they're useful with content for each level in our docs. --- docs/docusaurus.config.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index ff1a1360..66fa811d 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -119,6 +119,8 @@ module.exports = { anonymizeIP: true, }, docs: { + // Removed (for now) until we have content for each level of the generated breadcrumbs + breadcrumbs: false, // It is recommended to set document id as docs home page (`docs/` path). sidebarPath: require.resolve("./sidebars.js"), // Please change this to your repo. From 5c83be0de13fdcb1d77285afe475f668a9dddd03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 10:02:30 +0000 Subject: [PATCH 038/494] chore(deps): bump path-parse from 1.0.6 to 1.0.7 in /docs Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/jbgutierrez/path-parse/releases) - [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7) --- updated-dependencies: - dependency-name: path-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 64573d4a..f0dc8fc7 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -10399,9 +10399,9 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "1.8.0", From 642fe0ce3d0cde8624ddaed295820f60fd00aff1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 10:02:38 +0000 Subject: [PATCH 039/494] chore(deps): bump browserslist from 4.14.5 to 4.20.2 in /docs Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.14.5 to 4.20.2. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.14.5...4.20.2) --- updated-dependencies: - dependency-name: browserslist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 162 +++++++---------------------------------- 1 file changed, 25 insertions(+), 137 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index f0dc8fc7..c72f901b 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -447,18 +447,6 @@ "semver": "^6.3.0" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -5895,18 +5883,6 @@ "postcss-value-parser": "^4.2.0" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -6182,14 +6158,32 @@ } }, "browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30001325", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", + "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==" + }, + "electron-to-chromium": { + "version": "1.4.104", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.104.tgz", + "integrity": "sha512-2kjoAyiG7uMyGRM9mx25s3HAzmQG2ayuYXxsFmYugHSDcwxREgLtscZvbL1JcW9S/OemeQ3f/SG6JhDwpnCclQ==" + }, + "node-releases": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", + "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" + } } }, "buffer-from": { @@ -6812,18 +6806,6 @@ "semver": "7.0.0" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -7326,11 +7308,6 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "electron-to-chromium": { - "version": "1.3.582", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.582.tgz", - "integrity": "sha512-0nCJ7cSqnkMC+kUuPs0YgklFHraWGl/xHqtZWWtOeVtyi+YqkoAOMGuZQad43DscXCQI/yizcTa3u6B5r+BLww==" - }, "emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -10050,11 +10027,6 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, - "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10532,18 +10504,6 @@ "postcss-value-parser": "^4.2.0" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -10636,18 +10596,6 @@ "postcss-selector-parser": "^6.0.5" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -10693,18 +10641,6 @@ "postcss-value-parser": "^4.2.0" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -10815,18 +10751,6 @@ "postcss-value-parser": "^4.2.0" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -10887,18 +10811,6 @@ "caniuse-api": "^3.0.0" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -11294,18 +11206,6 @@ "color-convert": "^1.9.0" } }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", @@ -12856,18 +12756,6 @@ "postcss-selector-parser": "^6.0.4" }, "dependencies": { - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001325", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", From 7e844bc269b814a3b7028db9700ac51739bea6e3 Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Tue, 5 Apr 2022 12:59:24 -0700 Subject: [PATCH 040/494] fix(behaviors): Remove `behavior_hold_tap_data` Related to discussion during development of tap-dance behavior: https://github.com/zmkfirmware/zmk/pull/1139#discussion_r810564682 This PR suggests to remove the `struct behavior_hold_tap_data` because is not used to store data for each hold tap. --- app/src/behaviors/behavior_hold_tap.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 485b9dc3..030cd3dd 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -674,9 +674,6 @@ static int behavior_hold_tap_init(const struct device *dev) { return 0; } -struct behavior_hold_tap_data {}; -static struct behavior_hold_tap_data behavior_hold_tap_data; - #define KP_INST(n) \ static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ @@ -688,9 +685,9 @@ static struct behavior_hold_tap_data behavior_hold_tap_data; .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ }; \ - DEVICE_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, &behavior_hold_tap_data, \ - &behavior_hold_tap_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_hold_tap_driver_api); + DEVICE_DT_INST_DEFINE(n, behavior_hold_tap_init, NULL, NULL, &behavior_hold_tap_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_hold_tap_driver_api); DT_INST_FOREACH_STATUS_OKAY(KP_INST) From 20a72263b2a10f0e75df18bc0cbda473e728826c Mon Sep 17 00:00:00 2001 From: DoctorNefario <5243039+DoctorNefario@users.noreply.github.com> Date: Thu, 7 Apr 2022 01:00:01 +1000 Subject: [PATCH 041/494] fix(behaviors): Prevent accidental transparent behavior return values. Needed because k_work_reschedule can return positive success codes. --- app/src/ext_power_generic.c | 3 ++- app/src/rgb_underglow.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 3f83bd95..0743d50d 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -50,7 +50,8 @@ static struct k_work_delayable ext_power_save_work; int ext_power_save_state() { #if IS_ENABLED(CONFIG_SETTINGS) - return k_work_reschedule(&ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + int ret = k_work_reschedule(&ext_power_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + return MIN(ret, 0); #else return 0; #endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index b1e2348e..517da1b8 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -272,7 +272,8 @@ static int zmk_rgb_underglow_init(const struct device *_arg) { int zmk_rgb_underglow_save_state() { #if IS_ENABLED(CONFIG_SETTINGS) - return k_work_reschedule(&underglow_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + int ret = k_work_reschedule(&underglow_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); + return MIN(ret, 0); #else return 0; #endif From 9c3d909b82efb537cba748e354f5e532826c9ab7 Mon Sep 17 00:00:00 2001 From: Caleb Goates Date: Tue, 5 Apr 2022 14:43:53 -0600 Subject: [PATCH 042/494] feat(docs): Reference conditional layers from the layers behavior page --- docs/docs/behaviors/layers.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md index 5aa98879..694b516a 100644 --- a/docs/docs/behaviors/layers.md +++ b/docs/docs/behaviors/layers.md @@ -123,3 +123,8 @@ Example: ``` It is possible to use "toggle layer" to have keys that raise and lower the layers as well. + +## Conditional Layers + +The "conditional layers" feature enables a particular layer when all layers in a specified set are active. +For more information, see [conditional layers](../features/conditional-layers.md). From b44410ac44990f6dc64926b7a27ab0304ff7596f Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 3 Apr 2022 01:57:05 -0400 Subject: [PATCH 043/494] feat(shields): Add Hummingbird shield * Reference shield for the Seeed(uino) XIAO interconnect. --- .../shields/hummingbird/Kconfig.defconfig | 9 ++ app/boards/shields/hummingbird/Kconfig.shield | 5 + .../shields/hummingbird/hummingbird.conf | 0 .../shields/hummingbird/hummingbird.keymap | 98 +++++++++++++++++++ .../shields/hummingbird/hummingbird.overlay | 57 +++++++++++ .../shields/hummingbird/hummingbird.zmk.yml | 8 ++ 6 files changed, 177 insertions(+) create mode 100644 app/boards/shields/hummingbird/Kconfig.defconfig create mode 100644 app/boards/shields/hummingbird/Kconfig.shield create mode 100644 app/boards/shields/hummingbird/hummingbird.conf create mode 100644 app/boards/shields/hummingbird/hummingbird.keymap create mode 100644 app/boards/shields/hummingbird/hummingbird.overlay create mode 100644 app/boards/shields/hummingbird/hummingbird.zmk.yml diff --git a/app/boards/shields/hummingbird/Kconfig.defconfig b/app/boards/shields/hummingbird/Kconfig.defconfig new file mode 100644 index 00000000..343eb6ad --- /dev/null +++ b/app/boards/shields/hummingbird/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_HUMMINGBIRD + +config ZMK_KEYBOARD_NAME + default "Hummingbird" + +endif diff --git a/app/boards/shields/hummingbird/Kconfig.shield b/app/boards/shields/hummingbird/Kconfig.shield new file mode 100644 index 00000000..b8115359 --- /dev/null +++ b/app/boards/shields/hummingbird/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_HUMMINGBIRD + def_bool $(shields_list_contains,hummingbird) diff --git a/app/boards/shields/hummingbird/hummingbird.conf b/app/boards/shields/hummingbird/hummingbird.conf new file mode 100644 index 00000000..e69de29b diff --git a/app/boards/shields/hummingbird/hummingbird.keymap b/app/boards/shields/hummingbird/hummingbird.keymap new file mode 100644 index 00000000..990d7909 --- /dev/null +++ b/app/boards/shields/hummingbird/hummingbird.keymap @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +#define DEF_L 0 +#define NAV_L 1 +#define NUM_L 2 +#define SYM_L 3 + +// Using layer taps on thumbs, having quick tap as well helps w/ repeating space/backspace +< { quick_tap_ms = <200>; }; + +/ { + behaviors { + hm: homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "homerow mods"; + #binding-cells = <2>; + tapping_term_ms = <225>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; + + combos { + compatible = "zmk,combos"; + combo_z { + timeout-ms = <50>; + key-positions = <20 21>; + bindings = <&kp Z>; + }; + combo_b { + timeout-ms = <50>; + key-positions = <21 22>; + bindings = <&kp B>; + }; + + combo_y { + timeout-ms = <50>; + key-positions = <23 24>; + bindings = <&kp Y>; + }; + + combo_slash { + timeout-ms = <50>; + key-positions = <24 25>; + bindings = <&kp SLASH>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp H &kp U &kp I &kp O &kp P + &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp N &hm RSHFT J &hm RCTRL K &hm LALT L &hm RGUI QUOT + &kp X &kp C &kp V &kp M &kp COMMA &kp DOT + < NAV_L TAB &kp RET < NUM_L SPACE < SYM_L BKSP + >; + }; + + nav_layer { + label = "Nav"; + bindings = < + &trans &trans &trans &trans &trans &trans &kp HOME &kp UARW &kp PG_UP &trans + &trans &trans &trans &trans &trans &trans &kp LARW &kp DARW &kp RARW &trans + &trans &trans &trans &kp END &trans &kp PG_DN + &trans &trans &kp ESC &kp DEL + >; + }; + + num_layer { + label = "Num"; + bindings = < + &kp LBKT &kp N7 &kp N8 &kp N9 &kp RBKT &trans &trans &trans &trans &trans + &kp SEMI &kp N4 &kp N5 &kp N6 &kp EQUAL &trans &trans &trans &trans &trans + &kp N1 &kp N2 &kp N3 &trans &trans &trans + &kp N0 &kp MINUS &trans &trans + >; + }; + + sym_layer { + label = "Sym"; + bindings = < + &kp LBRC &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp RBRC &trans &trans &trans &trans &trans + &kp COLON &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp PLUS &trans &trans &trans &trans &trans + &kp LS(N1) &kp LS(N2) &kp LS(N3) &trans &trans &trans + &kp LS(N0) &kp UNDER &trans &trans + >; + }; + }; +}; diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay new file mode 100644 index 00000000..327200a8 --- /dev/null +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + /delete-property/ zephyr,console; + /delete-property/ zephyr,shell-uart; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <7>; + rows = <6>; + map = < + RC(0,0) RC(1,0) RC(0,1) RC(1,1) RC(0,2) RC(1,2) RC(0,3) RC(1,3) RC(0,4) RC(1,4) + RC(2,0) RC(3,0) RC(2,1) RC(3,1) RC(2,2) RC(3,2) RC(2,3) RC(3,3) RC(2,4) RC(3,4) + RC(4,0) RC(5,0) RC(4,1) RC(5,2) RC(4,3) RC(5,3) + RC(5,1) RC(4,2) RC(5,4) RC(4,4) + >; + }; + + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "row2col"; + + col-gpios + = <&xiao_d 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&xiao_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&xiao_d 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&xiao_d 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&xiao_d 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + row-gpios + = <&xiao_d 0 GPIO_ACTIVE_HIGH> + , <&xiao_d 1 GPIO_ACTIVE_HIGH> + , <&xiao_d 2 GPIO_ACTIVE_HIGH> + , <&xiao_d 3 GPIO_ACTIVE_HIGH> + , <&xiao_d 4 GPIO_ACTIVE_HIGH> + , <&xiao_d 5 GPIO_ACTIVE_HIGH> + ; + }; + +}; + +&xiao_spi { status = "disabled"; }; +&xiao_i2c { status = "disabled"; }; +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/shields/hummingbird/hummingbird.zmk.yml b/app/boards/shields/hummingbird/hummingbird.zmk.yml new file mode 100644 index 00000000..ee3a8bc8 --- /dev/null +++ b/app/boards/shields/hummingbird/hummingbird.zmk.yml @@ -0,0 +1,8 @@ +file_format: "1" +id: hummingbird +name: Hummingbird +type: shield +url: https://github.com/PJE66/hummingbird +requires: [seeed_xiao] +features: + - keys From 6753d31ee9104ff49f6d21e8a0b8acb0b06df049 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Thu, 7 Apr 2022 16:26:22 +0800 Subject: [PATCH 044/494] docs: Revise "Troubleshooting" for Zephyr 3.0 (#1214) Co-authored-by: Cem Aksoylar Co-authored-by: Dom H --- .../troubleshooting/keymaps/errorscreen.png | Bin 186351 -> 0 bytes .../troubleshooting/keymaps/healthyEDIT.png | Bin 188078 -> 0 bytes .../troubleshooting/keymaps/unhealthyEDIT.png | Bin 187729 -> 0 bytes docs/docs/behaviors/key-press.md | 5 --- docs/docs/troubleshooting.md | 39 +++++++++++------- 5 files changed, 23 insertions(+), 21 deletions(-) delete mode 100644 docs/docs/assets/troubleshooting/keymaps/errorscreen.png delete mode 100644 docs/docs/assets/troubleshooting/keymaps/healthyEDIT.png delete mode 100644 docs/docs/assets/troubleshooting/keymaps/unhealthyEDIT.png diff --git a/docs/docs/assets/troubleshooting/keymaps/errorscreen.png b/docs/docs/assets/troubleshooting/keymaps/errorscreen.png deleted file mode 100644 index 73b5b58487eb96ac22651edbf0fb9f90ca198eb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186351 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�oN3TeHS02;_erTgMa_v{ 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 z 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�Ji0$nC~tz*fHIHQloRKRkvR*xT068 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

$U= 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 diff --git a/docs/docs/assets/troubleshooting/keymaps/unhealthyEDIT.png b/docs/docs/assets/troubleshooting/keymaps/unhealthyEDIT.png deleted file mode 100644 index 3fd8dc70fb1f79085f8ce70ac6627f151aa6b92c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187729 zcmeFZ2UJs8+cwNRJTuIQ6h%O(gAJ9YB0U5LR8&L|gwRo{bRj}02^n<&r7O~#34^Syt4*O#?0=j?NG&ffRA@9VyHJ01-^c{ebE~DRz9@-_d{@jUJwt@ zuRNE|{dPS#YjND{t9Ucb`YGkD(aN4|Z( z{INKF@S{`K`NJ_T;=2y+k!kNx9KV`*Zm$&mtbu6zhkdbu656j1^qKkjRi4QNb;;(8 z5wv6y^tjxR<{&CVhrCH<=;lBlLPbp5Z|cz8m*P5x(CLJ?L%LD7QI~u`M%iyy!qDo z{@$Mv4p2pGpV$1$ z=LxYIrw!xP2cqoQ0rRaqH&WB<#qeY5{WA2oE4W0-GL@Z|Ui`&1WzWtg9-e>FtHLvS zU;%&6t(dOkl`?+6uFE~1|Hh2f9 zZt(-0Q}LT)xY0y~+Psv+u7pU5J2fk=o&lA|Wx`IrlL)ZbxcAUYZZKQg;e2+c{(@|y z3_X3}Pw+J1P@lM}?wNf8d02I#M029YpYmD<0*w92CgPsy)`qA$5K}5F3~Pf_CssS- zILNYM&NXs(aiWS^1)QT_BBpyOi^&>Ex@0r<4j=#30B^`2ua@|Fd}n38H~vl#8w;#= z&yS60=!1hl`Oig<3FYp4$qKqi%`Oo@J6W_wv%}RheN_iKwmc<_!(`~aNL;QLQCY&H zDV+13oUYnCu!%EkI$Er0I+}P>Y0j|qyuA`aZfHEKjn?F>2MJ`sQ{*$ngzCK zbV`bWI?Ex~J`(jgA3kQv$zIHHA5BBj56_H}l;j}KdI+^IXr~z&arRr&dg00QjQb^e z5pbl(@j(1trTto)J&^pHczgFv{R*^}D7^sR%m4Bdl8Wa|b(VE6fxN#+^3z}R(>_3# z7ZEq`y;UZJW(1hOmB&vvJw|qwg98ueFxpMM^O1@O&WSsBBA~s{mSoR7hMm`2i}qV) z4Vpbh6GznF1)qRES3R(sMT2iO=iM^ai8PS%E>{eZqR6xg(pDFP_g{n>69r|Ib{gl! zwT|oGVA1y@!Qb03x3@{UH!SMJW#7E%ZpX;27#deFWd7E|J(iy9Xz&WdSuR%@v7fTG zK4q2FhTJ+4Ki_}%jj|XS^Uz0Xi)gF2XDwT@8Bu(^F6s`(pDoG?4Fb)C8OR${Q0$Si z*(WWH_j zh^R_sT_0Hv(fG-D?MVyXxz62a=@5b~nXbAG)bLN_Vv+E0MeN1`?~e#DLCSigGR+au z{9M4Qr6nzeEY4?Pd2Iu%Vf>yxlWjYjCc9?R&tr|E?R3Lrt5g_6}wnI ze5Apm_a!#QNHNyoXI>vkPoWSO?VeIO)$-!5M+$~N!CuXfG6tK_KD^e~EGVm=7*`fd zZqYrrGASFLk{s~PA^)xfDV*8a#KZH?5U2R(`PB?Rea_;%(_Hj|foQt3Ud=Wdb1k8Y zGaEB!rCz^J@s>4=G31yN$VK{?mKEQ(Mf~_Jp~@C%Mk~P}D@-?DwQpuR=}J-pM`8?K zi4A#u;nqitq|Lk@?DUKXM94ifeZImGMUG5aOQdEm@v{auhYY~x%?FIE4{T}<tDcmiFFso9`hyZVje0a6Bd2i& z4}vmmnlJ_6nH-Dcmrn_Qc1oJK3I@ivsk^H%BkXEQ{Fgu$<@WwL&Hg#^@hjz;b90>| zM4hBYN~ZflPO+p7PR-a~3h*g|$#Tk9;JIkxIw<}1P`@7xRGNcn(-HJnoV5w2(M?We zbHMGERF|mqj@{&rN3RpT@D)+;!cf^{_xnnKqYC7tE$s>^Yz!aj@oDb=%IIqaoByS* z%wFbwQElwtLx`nbXuJJZbwKP3KHL(jSe^g&xiH{l&fu5K#iYrJ}>ud9dyakA9CdTqS!_Knpwq}DU$wehp zZ0-(ayge~&p_gf`_&WK}k{rPSlUe-!hF5`(yOzk%X+BC19&{RUY9>-iW_r$=h1pyg zqJaa1P<1%J^gqc9A2w-{d8Gv^=Ghqn>)JyAMaFI*%bG^hPSx9IN{nN2pbSK0M* zzHjfBCr6`yE3v7JigdH7UQ!0oh=pD3$raz(t1^r9j;|5npY)UXWUj49?rI$Jk=E=0 zKooN;hF7i~xm2~kcf3_rzoIbU>2Sb7L8pO5pIyhxz9HDQ((Z-d@F>bUf{>&{RcugH*onWT;={eH&lM3WUUm9vc5 zMmeEcOECwA`TS^EA>pvcu43e3=v(&^jXx9W!GX;`78Nbz7PIxr;8a&?WA7Y#&(TV} zf1QA+#%PFY55N9LAzIsY~8A_ zDm}7!T7Lipf=9d$0aZoPHmb7G|^TvXOQrE?*Au#hw3>%3$+7(D~Xf5)D-TfZNFI-@t)s*yd};@UFc<`-GD^f z84)BWs=X9tDLaH+-QP7X;d(Fk`#0-ZK(p*4%IS)-#bOl!G^4~f%@lwkTfi}8$LFZ5BJ2B*vc8rinE zPlr$wX_p);78@d(F%6QrBi`TAa2)!v^}1xWN#D>jXjWUn;4>EsYVPjTGtBS<^r7OP zN-tBLxF7cmnoE1zaGM>lJK zW`~`BvA;-;$B`IPL%`vRp}4q@2ib}TF6vcUmA02IjVSox)qIZCEZt+8R9R4;K55Gr ze{;8X(m*cZN>PrIB>3La-dqz%{E9376yVrzOG7QW*B1_?g>#N%e%fuf%o@6_zBXp} ziT%WZ)Q(#3@w__ViuO8fMkwv+*IA&foAf?o(fv~9Nh)$kvwruDjpdk9O$DXFx%~Kb zMw_E<44(wVKcS4F^Wu}_N$WYC+wzwYnSxgR#B4{BSR zC)XFzsb^d-yyu2**xUTsuX>WbWmLOxz)G6DcGG;3k@WDhq9G5+8x%9yE83JQdov_C z(7l>+tz@oqOs~94<3`mu?AI^NmRNMf^~?S3?eC}Q7MOn|((Rg;Ltb;P0m5M^m$IHJ z7v9`;+~T|sD9&fxhz$?-IW#8XIazGyFOdW>i5yQ_iP*Z)pawN|)15OkSoCC_M*Nhy zppr)$p%o^2h1VIC5T7(Kf0}NFtV<266}~xJDdi!=!e6-JOzaO(eKtt;UUYJ42saNS zI?x=X(!rv1`Qose($9oNp~WvKX0FrUfnCg;CT8D4iv=ugS9ULFdzsfJl(QP+yau-@ z>zt1VVvs_qk9FjTA2pLV5UCfDby?DaXvW-iHj6|QB1l*iI9a$JiC9oPeq?&3lv=`Nxc65HngomNGZv% zOmuT|cd;F`q5lo%f zWCy?HFE20MPv*Qhsl9(LB!AxJtxyT<#sM?JU6;}vJso|-er&<~`V!P5p(}uSQJ2tz z+dPRrFeJ|gkBpfy7p&leuo|p;cQVY389=g$PI5>XHY5bYl~)q%2`_KE-OmlNC?5e| zaC7z$0eqJ!9^~(bN7)*xI~x zC}Xx;<-&%}?Fr)VI=HP{`!7O_*20($hFfd7^OFk9gI_)molEHhU+#b2rVsy3_4{w7 zC@cK9F)q(B0>1KI_B44MWB%@9H%iz#|lD@Dqx3(>edmcW$)gx z#Y-8d<(UcgLaZx+zhxQ}4C#49*93pAyU*Qomz&TQ_Zm~hM1zxp&D^pgRtXhtco33f z2vpL&W#bBJUQgDYl;DP+W^#j@Abw>f2NhcQh@<5eYq{~pSO zdQzx{-*4p_=NBBn#69GJ!N<)eVZD52)JYBi`$b*{m_SxHV*fObDiMl$G@z*36J|iu zQ$1=NQ0dD3PRQn8bZ0#a^=UbJN*5S`?u~0R7QAs7XNL2b2lXZWfc67 z$1e0=EM93kGNWG1#!E7qa_Y1_+DIM`#CoV)?D9Eku#`{RZMPLbtPXyeNPjnm6k@-$ z@AmdTC|Cl@m;J{;!`m2g)_S3#jW!j8Xs+ zF~jHsriF$JRsp#zOn*2@yQeU!YItGoqLR8zLv6d~!q_RP=_@d{V9r#J~xy>Z+=ley%pUzz4Y3u>Aoxh1+)>-cG zbwIl-(QGVg90+z=eG-f}A0rY?_UU#G9juwNS8|Mmhi^E&70A36>yuc4Y*=fz9FPrq z8u1=;@_EiP71g(VeYAwa4*f5~lIK+g#O;^=b;Pp3_+4g@`h<({EpM~v3xFmvfp~8` ze|*?_x5x67klfH<(;hlWEpSiehN6}jecpWjAy~+R10+`C$=pqAZ_>Mzef+~$OoICsQUhKm+f;0bonfo4;`mb-PM>D{+SATy!^SycAK2LIKspT)PGzy4yQgA*$csL z5}Sp1cs_B5(Yf!mD?ry?4ZL|q>$+2#ezEVMNbl0ydw9^HXNj-U#P(E8v|I9f9oahj z=4bt&!8gM(K`P!&FJN-N{vqJgR3$z-m!KpC3VtNa|0qfubSbFqie&d&kI}x$w!@No zk8>`OVGAh>4ijMoVFlDN_JU$`8%E>HRb2-wPxJR36$-Yz5Q^L8+jTvL^A%%J)bj@=bg-#OkbG{M5 zK`#~BRgG0T@fA;!SFSz~l-6vVnrtQe&ej&pzOAxq5uZ!=BRFJ!27kT*cD%0G59Awm z=#ujd(mvRWEj7KGeH8BXOSa)g_UZ#~aG7!}jb2JpCkTxcluDqzbxP4z+duYNQp7(B z^^9P|B%oocb@KsYo&Jd1q{AH>ui)I&feAiK5I<0SNs%fB}iCt5u9Jj1F zrw5ZQ0U+#9>PB^dJu1umR9v4bOuq@NEirv}-YU{h(WEUHvAiTK8%n+XfZBsS(^z^e z&;c}L-Zvnv-_c8o7nURL$Zn!FU8ef++by*5u zzp2(JF^%GdP%0bps(q~4{NkGipdeS(;@uG+;fVA1%Ar)VwRyq6WOF>gR7sp$>$ z$&i2C5t#i&2JEj>0nhori@>V0->iN!y+w#G&yeLHenw`MN3G98SO(fiE5Aa=sE-L0 z$2k~_S-;deV8ghWfCSgIz0TtZGiQ1zmmbKBZ=Jy^G*|wyev1ID5!?H`lXm;lYC#ej z`%}=ZA1evX($gpf$)WQY88N7>vQ(On73-6!66&|5B#p+f&y=zAW~Cm zjCa`JDf>>n+m04s=j@(;0!@Xg=eWb0t`GFWR}RC@5imXDwbU^BM}{!hkg6cJOvs5j zqN(|qK)Mmq-a@6+;DnJYD`YvajoDmFGCSJX8&zC|Y_tr~a-a)QQb>qcu&oz)oX%?=J;7Egh_#m=wPpji8$S+*X0j zjUo($k51&v>w`jWsAJ_*NE|Y<`XQzm557ILf>g>^*yn*IWAXAvJ;;@x-ZxQq^nlPE7r%TwPCXJLwZ;BN+3%HvifRytw>K#fXq#jU7A?3 z_}AGV0kmnw!@~TwbD&Yp(rs6tU;6}ibmxZr#`9L!ozMZC@cjTOW5LUF_B>NLqTCr0 zAGN+=mKr+d>aZxiOCBD!DkOU1?9S=^-?Ix_MgNPp^G=P3Vat(G3bxl0NpcOCJAm(x zT^Aplo-9c8BCZcS+h-uBt;fCk0A^uND_?$Jop-RuM7qb~3i0lKq1;B%>5=!!$vZL6 zr?B!_quFTLXsDCw4Mm;EZEVf0K6-fBbe)tp0z+NB;JLVb=v- zWU}W8Caojf8N;xeFPPrvuCM0^CV!Jd_M!eJU%dUVP{6-SK>v*{xb|G)_oX$>8Km>V z?FWz|G3cz0TD`z|hfMydhmWe|FuML~*v>w-tyx*h9je(e3u0HN97ab~VtToxN3Qlh zKOYcQbkio8%+9Yo^w&y*?5|vm=bxnbT4#yH;CG zWbni=$6u!2d!A-5T>Dv^3YVGY9@F6zwY>ESWq;t83$JMUvKaNb8!z(&#dqe9f8^d_ zLB<0B5B(zs1|}@gNdP&8zpS1w=%`u*hy|RUDomv!z*vRM_UR~2t~Thp}S!GcMr9GYbLU#hk>E;sV@$>bvU5T9mr@+VcqpTfj&HHWw-5Z~n!ulNSOD&@KbaAsj)a zlBgzi&u70xLFM99zOMoChXX=vpzJJQDq{t}qH#YNECFN#EJV{qGL}_iJLTiUz-t}nP>F#I& zcAh@?UT|6(L0d2mpF`RK&n=8uF%!T3DJklR2WH=&L-C73{_YmIXjXVrMq&E1Dof)( zRA4Kc>_?QOyV>Dk6jpHM-xWb!8lC%xSZsI zOg9+?k|3?3>zuV9UY+?T0tb;c%#ouDNX6r=s|73TZD^416=^}*JjQBy(1m)6Sci88KA?0?+*O>YHcc=H4?roOc5acgYNH@pG z;MsWsG)hXh3fX!%7nCMMYs+QZKXBAr*ME@PiRmdot$n)rfVmyEJuY1ME`d)jN1kn~ zXN{|j&vB}&bnM-kq@l_7BZxA0()dpo;@bpB8V2I_;!BEH1KZ? zV;a=w;20l!3KHuBRO^a;mh&W(>|)7kK?Qq?@f81X@S2A!dnD*0MQ*cJ*{LNIG4BE- zW#SHt@hoafEAMnW;Q03k-`ZkMNeECaSfZ3^Mf8Y=@0mt6FdXH=Lr-emSc0L?fH$Kc z0FtaZ^;bfXimi{>lJYE-zmfIef*LgZX*F*||u0Y+GpUyvzOI$)Xhc5IkU8{c8)820=Sty7?Xd(KKPF zA^x8eVHegzmze15mf@q)(?iJN6(=6aP^s{yQ&2T*tKZ}FLUD zPMP0lvo?Sl)6_$n6?f#_$b>_?8b zoT@v|{HP;0Hk)g|%b$30QPOg(aB1g*enK(*W?9zLNVf>S#Th+_mff`11dduA zAxgt&?>yqjABN08^=ID3OqU}$WO*U4PTChKd$mU*D7KTtMw_GU0s?>v*tRYxoq2#8 zPXSoQ&=dC*X~Ap6^tjIJ_UPKlS1SXFWEV3b1muM1@ntB2)NZ?Kbb_5 zQpt{jw1uPsGPO;4J1ZRa@G_{4K=QlSN zf`b@n1FvAI%l`kNUDHjRfF zBNpeNQU4*6>jMo&S|L8Cuth)Fhwi-5^Vf#bp8Px8{)ryZ3tn3sQ61oI9Lwcwoyp>w zgujFh^|$$gcTD>N*MI&7xY16*1+@OZD181-NwGhS0KRh_D7NqXm~LC?8^!wnvCe;Q zso-yA;NMx}zjQ%BS0>h_jRpLN%AVTyCxb!#W8KO`Z9s})%;>7X5lsXd?!4$zvRf2# z*9w-W+ucVwtM{{-vZwt)s-NHJZ5I}LV$s`dB)2F@pqfE5&Pt93U&Vuj zUx<3jM7d@ji17gdC#3P87W#MN*=}c4T-!}+QPNSy*|YO$&ks1GTx5=wo)mYH`8g=p zrlq}zNUA;xPtp*)pRFP-;)-eKwJqogd0O@haYjS6?%yvZxtRdzd)3oB6}l7n0blwD z8UA||S)@zGzNy#n2YL?O)V?RsB3DH_P>w>!0zgC@WR`Z(01+Suz5@h&Tj8ethgy-! zsR&+_y`8dF_SCcPuA@GMfx3c68czjkVvDHPuYG!0DrZ-LW~fdn+zBWO zmem&Lx?;F=vZv%i zFEcf+^|UieS_Oe|5!fG7)2XS5sFZCq3pm>=y1DyoW&{TM{km;wH3ZAk{_HTS z#F?=~KRP#m5;g2L=iQ5NC{dk|E5??wg60mZ6Yk-Awhz?l z5ocP=sT!=3Nv#YT^Fgut$Am4vpOCoUq?6cWS)*R+H-!diqO&*?i=cG@3wR-=* z3am>bY8H%vd|~BD7O1W>0Vv7R-uD!yp6INSmka&W?x^3?!o>W!EBt?~1z-tRo+MZbeL!0(eByF!PD_@;9gasA zafJUI(4jSjAmb}jZ;t`84DoW?H4@E!Z3`YQm0ZgmN9gR`tY#a@8)U6Hj>(5G zS%Gl(O^bl#>Ul)&${2#==UzP7i*Y8QtXP_5YpB~^u{b)EXWq^!Y}n;x$;rfRdI-b#Q! zBkYM>z7t8gQH_Zp*`xB)I<2!d)wlMnB9oAbW7C=Nuwt0ZF|Q%i*$B+DNt9JN>BZ$p z0uYrYSC25xru)%#93#SByeH1|0ch(w`A|b9CONLPDl!(=K~4!E+_%deu7D>IR~NGQ zI!4zr;SnwTexEd0ccfA*N?Kl9X>?w)PcB_yF0~Ua);Q2O58ofTnRmI}>pg`VcjJim zSGxxE;z!k-fi)tx9t(Sm2oh+5lno!UGT20TV?^itmtN^bdW)l`ELN z(?d)Sn8SG~hmQRCT3*PYi8}!3dur?YriO&sZkvmcV;z8^M*o?elg>|@>1P8<3M$VD zU&TrEiiTLdkG0cBM2j z$L!*Zs8T|-)%3>!Ol$+(>)_z(@RrkZA|P($9P0OzPzsk0q+E>*{?+)T2d{NOkZFK! zgQ4?S9Hi-@A`_U(u0svz9d0`knBEVRMXc3UbD!L#+chN!9a+sCM3jEyq_*ZAZgrm) ztv?lh5L=qO%m9)|&eBM9Qp{@D)Y+!U)at6*tQI|Gsrm!c8gl^KZ)`^suZkR-r&g6O zWOg2AE;T}&#&q=@jct`YxKtb_6!G#IRW`xra6Lk;%nVK_VcfV3c*QxKQK*HMzj z?->IG!k+)|6=xK(6bPSEC-4hV^4$~NKXhSFaVH8~y3#=Mu-KO>DhHxml~lz_{XUbK z{*S;P&#!0AH0`z)h*q$(#0fSSySjg|wMB7MU| zaS_(jAGT%X>b&Vr*$cG&19kb2mdtoDW?mQFLOhZm=u8+G&QYU?VfF*snF7#b=6Xee;I5EPBgi5 zu=akHR|A+C^q{Tcu+HuYf^5=i8>rAPVttD~l{SYvB%+*UbzqzXsm_2va7?%Sa@IG@CTZmt%$?#FX&?2}@oKTVcO7A+IK29SH=;M_AJ48A!!AL&uS5OBF&( zL8w?SPATz;ecz0AViRMc;`TXezDw(kCUEtTQ|_>a16_u7Y|VJ2j(TIBac~WShBeHL z=;+wzeeh1dJCh+KPv9CD#MKihshCY!ZIRrXp(OuaH+)nb0UNG?sC0C=y!?I!@zf85 zL_Q->l@8R+VPUn&v+J8P*VPa%8bb=^0BCH>E&zuBp5e_Ghw~Jt z(AUD+>;5d>Mf4gw3lMCtM<^>DfG`8Uv~iX>b|N$CZN?{KOs~dNBr?gQ0y3yfoJk6L z(o^nEtffBV%mp;QECT4aUmJ713{Y{qhMHFV?sf4Zinb|)ztv!wAKg1Y4j8jK`)DpO z$dXY91TaWZq)5LY@GXLACj&#m0~oZ`^DdN{Qyjq>UXBc7Aam2eUVZ+)CH8GkS3mP~ zWRbU2?MT2tCF-x=6*10^2y%`(Rz`TuBE=`8*}ffIH+TX70P)=J;fvm0RL4u0<2`k+ z$3=i8;J2lfzgdO)Pio%(>ubG4FroY6S?mQPx$vcn<^cueiji*|G;f0->jMw#ebzhf z3s;um*nCxJ;oSXb+3C8Jt8?`I$4aYI9-nCgYT!&8P=fh=*Iz7e9-H%rHMDG{<>U!- zPF!+cz1D!_?Ldnz+wV$WiF1rgFAP*e0wOa>{Zky$XnMI!0o&&0BvZ=gW&qEJId&b2 zab2&K%C|@R2&DFR4<`@*)I&&pnfdyVTvk(33!e&6QotXBkZ1b0uXhdU7JVBw~eK)Y`r?y_(!pqTLzHau--5CrRrhu&$@PK*fM6=y6gxC zLcCwIuT|Epggo}^tg9ZrTA_jqqKEgwW^$}A>5c1dTvbk>l%jkvI?R9vVFWCjKxhlA z)k$^AtQVndzPoF@azum{st92yPB;O%pL`m0=P20usJxToZ7rAyZu9sOVRETCxxjNt z!B^fR$Kh&DvueI|$z-iYh|;7`TS>6rf&G_qfXI}-p&LVf-@r74Ut4<8XD*Dr{X|E*j^*t`(iW~68r%WRw7 z<($*Fnv(A=l{Eks>q)p@*XpE9xTF01J>c>Y=%*J5ysmNEC6pD7BZTLGWVRfzD#HMQ z{l?DJwu_gReMiw!{j=`K>~0aW6lVCe0SBk;OeKMcW}z{mZB77p08+e?me7-x&LYAL zHQ~-~;*)^IC*T)7C@UcTOPv%g3%zBYn`Qim|BPxe&R$!#J>L#s!z-(@zi>z~{m^D0 z-61WWsKLP4b`MiFdzouW`|qpc@qdLqkhurCMqZNs;w=E?VFo_<(dShawkbpT{wRQB zY!8Tz`E{P~m~oY;P`zs@tXVNe{Tfq)wJUJqBXBZsL%da4FWhOwE-~aO^~^>lTwAbn z)J1Xdf&cK5DvdL*V_r{jG@cS&2!ym+J0jBIcRyv z4*%|DN3|-G{#-t|BJKHKC?A9cnG7@mleuewgIW4y{+6F z$64WA;<+E~!BF*)0MI!<0pEk~eO_$fNNMvoAYNiCm&=HlSt~9qRm@;KTLuX%cI#75 zv=|U{YSanzaa8PEzn?a_)o!;79WdbKqn!HcAuX72#UUmTT2?g30OgG3`+=6BT6Kn? zxzNY>S(X)7pfa`l@&aSx*@V4g^w6CfN;z#@cQQwx(y)wuU-?U(>oWE9T}P76QS+lo z$L=}(eBp%jgZe-9FC{fCybj%ae0aY>yY1GEnW#b`_3+!1`e%QZlvp{e_fgH*EAP+O zdbbWp_Qfp!UN%$s63WJ7&ccsTeF%|stVw7o#q!kJvzN)!>Xn$&h3s`oklt~JQNrk?)ytTrV2t}5 zL)~9*){-Gk4@#aMrd{yKRW!DbWy7bhmkmuOkLAIO6A-ZlBi@US)<4gp4j6@sjlGZS zoMke?I?|IWaY8OWA4cKcydsS>k_ZD4D`JhbnvC}&*gtfBKkSgOq{-P*4hw@XNSl13 zZ0(Mz&*>Q5sZVm(s0D z-)z_SR`qjXE~_XxB#`>DA8Hz2O`@?kz>wO~S$Gyml5A^UGX~l{h66KY+*D$3>NGs+ z-ehRuQ-ffFGDgex32k7FYd!8>*|E&6Qb?85t69w!8{+XXx4tzECuy;m;hTBG&ID$f z4CzA$q96N)J!6oOLcVKuUitYv$aH};JbU*-S({avvY-(H=hQrV*9_N$I0o%p9R7*G zEA7q)h!TG*&x2x}8!izb@%|2w=?Um>&gpz54_nQ6QC51i_28Mi)BcW~jHjXutdTKM zGU_qEtk8X+%;IlVl7L%d05|6=8J)AbWh`^7BnG!I{i6SzqNPYwfk8BG*`7eZc049Y zS=}^hUXyQl;`q?!J;mh=(5eINkrTq>lZ{}RuQ52GwfF7djI-`&I^Shn)1Lw%PeDSD zB3~RO+Dq>DHV)tK9A+%V>tvtz&b$fuBVR$7I_oY~EP1LvBRn1qZ4RLhZ;OjLCO?k@db~-}NLKlBT{jEdI7WSq z8V=q@pp)7rT0=W0TmUH~FZ1o20(WM9IP%Sjh9;&5iHL@fyeK2AGM&`TT!e&U8oYem&mJe^^T#x+%)Y!5 zr>)%60`Z5s$r?RyCq*B@iNm}}}JdPy_SQX2K ztX~>l9`s&pgD{$NVwY|QE+uV=cm#0D*WY+Ixxuck1s!9puaZM?K0PizejkD~b|3*V6Aq8dt57*NM;a{RR$aAI3C;khdF+NWE)S;PoYg(zip&Ox#1w zt!HSBu;vyn_{mzWdyL7It!KgWXPFgkUR$(G|3&o1dt2NP!4Df+sT@ljX9ULpfzn8G zxzZ&IZ!T1}>@rfu2AzhgVvxQ{c;D5Ipc;$_nXacJss{~sk{Yu=FAJ}r-#;Wq=r&3k znUr_dqb}PC4py9)h+~YUCphWY66W5zhlg`RZSy|bFRTlE=51h7sMxSRgqK+TY+^>JP!S)2F~tEh>a zU1*_0;^4im6@KqNpU1{J>CWBlt)Kg~4Y&djSpt(4yVU%xB(5n2QA5?KnDhx-82(0& zt~99(>QS@)_P!wsG(Z}CcQTfm0S}KGOXIr?bR0xKd(B?v;C7^zs-OIj0SC)oMRYv` zMiN+;plRuccrt5H>l{)w9qyn)yx<)L(QuXpL#>>zwR+KUp>WUeZFDg+azZ&L@m=n& zY!~;p(!Kx`UF!*Gjn37Ceukf^;Zrim)N?jtYZ!}D>f$YsD{E&q$mDJSxH3dC=Y>u; zXet8#?Txe)A9Bn3z)<0QK7H(-+t3UHWGe9{11=L)kW$f}U?MemPmR?$>zAFdkO41O zJj#ChptPgrPxVj4*!Of|>~h^HF>d$A)`yVk{aP?ByktwK`pA{WvWGbQDM4PI-}i)e zw14w1j5h7}Z{N^3B=qgdX>I!7oS0vfuv{E+^a*DZE340f2fM`J0R|f!vmleCk zBIp7V|}lo91M_w@yBZL1At+(w54Hf6VkhUCSM)G0_hRm|t?z5XnSQbG5W$ z&85jaLn&3@;DS1^ro=45f4Mt&PpV2=kUu5)K4F%F_dG^Si(^i!Ocd*IVWeSHuxh5^ zG8W~&kX*GC4kFq%AE+5#bI6EobaZ&gY=+{b{=_U5F5TRH7PVwQ8oRUzU>9{LCxN7Y zDoXNR*pM?4eadz%VH6l+v{mTwl*(?R$_a}sLgT4Os_sup%tr~cr{BK5G_S)(T)wX5i?nl;VX)CntI>CI9q&BydMuTEqVK6JFoN&K#BmQ!XD>z zA0QO~-JpR?&+Fplg!*mNP*y%tDT4B1UO@dK&PVx}Lmv=AYQiyrs(gxgdL(eA)8bEX zy+u{5#SzU4!P%U_Ub|pwhqjPJOx$6?(stg0XuCv^DKj+gGo3iAXel05Acu8gRzS*1 zMOn{jojw|mqjdfq_&M1NDv5bHe&z>wltBNioS6|2o7zRnbISScytvR@>xbm!E3&qV z3(YX_6T?SQAB_NPV1>f}6TGJ$;%4q*dRIP2a$Z?GWaf>~Au)=DEtCfUu+JCMR1`QQ z);W6Cv)k{Ur_($D5HK}9soUH1gIYL=28or%d}d2BM&3%R9LcHILx&9uM$}j(wPSGQ z=S{?y{>I^oq!&l&XNy^CEI`)8(=*_4VO}U{A6EuyAcfP@j#SN!2wQOCaj7Og)@tp={(>#UR_p6Vbl%a{*BMGQnZm|&~(?zkNp^r!aQ9@hv_ zEhYEpl(rEMk1oouOINlQTy0dbw@>zQ)pQS><8Oh54j_2w? z=^q%M3TBrw?6bP#y$XO@>AcJ0dZ}0LAM_bBP`sqQR4ckBSh+_Dr+yMD7tZOq+yrL- zAMCwpSW{`bHEcE2rn(g<3k78?%Mwr!L}U($N-0hZPRxS_0VNCuBupXEq7(rEEfAC` zC?X<53Z`ILvplN@O}?*gzQ}J&X@=_1DB%vaq}c@4_d1=`5<8U9EcJ7}0ZOCH z%#SK<8$s!8i(i=u2rkp(E1#C_$70O~;&|s*qp@Mjy?qQ3SjD9aW4Y5$$cv*!D-Fs4 z0o6oI@uXMUPf*uv^G=pET!(Op;RcV|?L#OV!h9d5Q2Im*L!#T^)0pH4_WbxR)1g5g z>H}P9jFJj#`|Kn6^!gpAHR`Ond0%RaS%~e08c_}wFB(E<$5f3{(|g)t4SNFTpS*@p z;=MX2F$^yOM(Ww6B8cgrWObc8R)|&lKzW^8(+W|(=IJpC(f2Aj?V3q zPL(OAB?KEXy;CAPX#OwevYXlpAtK57$nIn-JM%=+w{^tP3re3vD15fEQfzF#GW?8< za{J`h3TIm=YPk`^4(H2iIfP(862h9C;_x06MFfP1{?`m0$kzh~wK!8_Y)0W02e) zxnjY6$gvW=0aw4AgYlmm{gQ)e*2dr70)!4eki{SG##BZe#GacV@9^a@?-DfWvVct9 z#gK2$&xm34H#pNE1d(^QWy6Mx*9*cc{}k7Dg#NknYU-WBpIdU$q%$eT&C9<{f3@rs z#oQE#2xn8Ao2#q7?a<4!DBL1SN%gX+QSVU6( zzTTV){r1{2-_kINa^nn-2?plfD4NQ4sxSX%X#8&ossFO#`X78FPDoMn#e81;=l|x0 zZCG(;^`C-Q*T?^rV*DSx{{KDoAHTVOt>ypAx5vrG?9eop*HLpW>=r+DTm|gMk%Bd6 zSVUFsM@>;K*R+BnGIk(czt+bfVXZYkk9V&q6p+GgGF{aQD#UFp=Z477{m#hL?P*1+*N$^IOhtA@ zhe8_ac_ReNxNC#M@#^| z%+b*wmA~$5`>Ev)rRopv_?Gu^_ILDpscWp1P-L8*^s8CS#q%5g5MLRde;IDWnSwiK z=}{1F`)`2Nze2UCX;xei%-Bb~s3z0wP!6j7(kq&@6W=EK6IX?069G z`GeX>0@ZywjI83b_7AT_*N-(OtV@0|=UuPWLD~dtNHI6#H%})f>gh$X@R77C|%r#lW73N1JJH6s-pN}D= ziZ~Tp?vj985n?oUmzy52S@U+V*BT01r!s`9aM5(dhQbDyFReNvCqF~)cPHv)!{){t zUws+#y!s~Q(-7ZF2-WuY^D!BVtWF&=yzSnOcsLex@IZ{waqTHf^#qvZvkoxrmKDm4 zpe3*)iVju^ih@TgQd)pb_pVcNB3U3TlqSa^CS}G_FamW0()(BxxAedgw4Ij_B^X%m7T*gipLeGVP z-MYNJj!E>%pb1q|gldA#)*`5SjHRsm6K&OESL)u4^T=}e;D`2>uQnVqEeO~CH@=Mp zF!Pd0xc2SwwRzkg7~g`KtIXDcnl5@2XTp?=op5X1$E&@qbw|X9cS%+y&MQ>9&)?bi zHO>7dQO|o47*%K$0d2{J&2Tz`g6Au-RdU`ujPW|p8Mswy%HZn(85)fozx z1?l_7NwLKAQy*DTx?r&@veTJeX>r9bj9dLk=)DCbfePTh;`-U&>T6!7^GCJ35|M&P zrjD}QyPGu;d+4Jr(5)fR=&j6rYpVik51v8NrlzsmmF;4p*w-nK)Ui66sg|nDhHq&U zYFHa@+G|)lMp0lA9>cE~H|5mA_xWhVDZ}>!y*85|^nELAZ%5lMX$OR9#I-R2pWYT| zME!s40ZowGV%a(Tv z6yikJNlgXXVs-nRx+CbC_f;Q(4F(&!v|T!3Xuc48cU{l+x|Q=StGwP{1EiYvHZ*TO z!21)jia6D7&TZp@pw{49B;S^LsXYfHnGneiNUy{?V7=(S%uasmN@$IXSb3h5zmx?z z`JlegeDdbW1VVc@^5($Ah(93OK>%3IZ$H~Oc{4KN&3O}L!&;P8v#)Dn2QwO!5^8a% z&3>PApw3mgxWx-yBe~#P55#!!I`ajjdl^dxB51ogg%#DfZ#sf z-qE#7HoKxkB^2%KI_BTm!Us9A_`4jweITpeXSC55!|q+2c5aTc%~A^sh#ZX3%Piq5 z284Wnp(Y_`7KPYZ%ZR4fBnh#s;MKwLF>W7US6c&IKe* z!kda>KzUvJX*BHijxs%s3Iv20?+cy+v5AwOctv+@9LUdLv#b^r_zK(xgFZsP~-^ zFo)4M{nZwDb=1yV0Nd&K_e2Za|lKV5Vh+Gn}-yK5f-Cmu&wDS`C}eQ@o;=ge}7!i zo&r+6c!UyIt4(Rf>GpT|N*>xTLGc|Du}|Y9$-tk~5Y^NuGhYa8R2~Dq*4v1W?lF6? z(lLq~mv<%V0^iE3F>qf%JUaA=rk|RmA<7&n*9J{c#~EGSj=K9y8{8{3ZiRR`tCLDP zA0vZdL<3b;-Z~LODw~K*a8D&`w1t4R=Is(zy@Pj`cXG_-Zp;gQEYxD^_f;OCy{tcJ zzSO(v@#-;G;!nXeV~4gV_(FinF4v{EKu*f-tk>D*`H+*|6F+-^qK-o=B0=<)shA`G zi2|~c+BC~kcRD{oNVf94U_0fcy6%hzBZzN-nFIVVxgL!Gw`Bc5* zCPJ?mW>GK2tpD5X`;cMgo%k28@xF6JCx>j&@Ts*6A@7vHqGi22_>AaA04Fd}4g&(c zp#hhEGx$HsVRSIkY+#}cn|-DYfofVEKAFcI8*1mAB&Hr5ACyBzWjjaIEtj?c3uagr zhpA@3qLZ~ z`kFcI;p|ofly42x`0qhZ%1d#ALs!2+^83l1SJ0qxhjNR=uAM-`*M{{oRs-|(yEI-Ettw*=~;6wP^Xy1yxNky&XbdBBzx+t87x?6 z05yK8#d(YoL*~RXVs~RXUG3Vl2fqf}t4HW!a4;m2ejR+%oqZY~#a~>?;M+`JAEnAY z^GH$u>+V^?E&c+9yooJ0!B>(DP`PEBXf79I-`tsB3$zH7m$kAqMeVnoS3e9zJE(E$ z?8IJ2;mr9OylD4=Xt>nUWzK&-w2pvQqvle?2~M{4JI+gOUHuCI`?F8%Uf&X zpA6cayt;Et$LKrh@;*|>&^ za<$qsmeAch#czD#Y&VpDNi(-M!^#ayzQej;QqsB5RHkOI7yHdZNSox-XfBb)4v9gS zW2J#n)hzAy)r;584VmFP7i6Z@4vT`f>Qu*@mfnV9WTUr2+umX1Im6Vsj}dqZtz`BGqfFyJze^Jvor!Mn<+2-OttkQ0VkoS%n5 zNo!ku;WMxp_Nw*$27Rvr%IJ!VZx4eXq&zG(TF7r0q}ZNH!`>N>Cjf6fQ8lH;7`Sg- zChMA0a>Si6Ag3baT!Q=5t6)R$@iovsXo4>?k56q@KWognC9KU zq5~`jSn19--~>0_=02^P@Sw6+df#nsKmSmAifb(_IV5bMdoauXLrL3Vz`omlR7KjY z!%y2T<*nP0{J>78|G_3*Jb_wrsk}XqZg8Q;)=%8q@s_n9y~$lF1@QL5gK6_aOyObr zgtDJ43|QqPcaw#IHC-SDjC0n}s_$J6CNDAAKjKZ_8|X{4(sHYD75B18lvRF7ap4o7 zEz|4nd*x)cyqKUy{#y{Z26@fzokH>C?>^kPnV1y>7*3V0ObuuOvQXWtI;Qa8FYA8# z?J8YgZO&uBQ-)E}{ZJ7|1( z^DUJ9^iLj2e)ONGy}Z8<`SWl;E!+6ZPTjcGIDIK$G0_?Og^JT}<|oj7tgmI@aSb~< z$Sa^s-@(L*>z$>?R?ZPq?a6B)`sBqXu`^azf~miy+iJZ!qeiY6nygE9^(nB`>d+%w zWhNguAZkgg%#SS_`*@@p4EsINmKgi+0|HjstZ#*~W_hR81ytB4`F;w5F zoWgp2(7W!fQCD01Xnk~p)J8ARjwcKT6kI^FaHgFB5_7P9qBjv$BCa3Cm}O>Hn|~>0 z`m$t6fjzPn8f^roq+(cs+J!)ohPrRkZNYwm8 zt2Gb(f>UJ_`*2vBL)3@CYTQs-jl z&9|h}7tQ$k#jQ9P0Z?uEY%zdm(Ya zgswznp@$nZIRzQnNTppmiKMF}zwgukD6Z9d+;-SDj+GbO<&t7C{Q%wKilK`}A^?yy z2kqy|fOCnR2XuzFBq(Xi=}&2jTe+jR_Vb`zd1gSZzOX0*lAK(VobwNSxq6-l^3~Y&IM99saVS}Q z!5g|yc~MR7xr4I(Q@3(@%*8d${l$wIg>5!}nc=TfjkUWfO_l8;`oc!}e-x|ImnDg) zM)Hqp>zk2v@${WFdvtoswyf%g|ELbo5L^y8mK<-eGAEGW0pr@`d<8Hrt%01?$Cj4x zvr_X0FWD99GK;)J%RNH|SjctrG{L;W+2UMZvs;cWdb5 z<7j@ao$dGPwPd2Yc{FP-k)nh)ZbLT0d1!swYV@v5juGa&4$o?^eEMNZpWE0`)vjZI zFV=Ao5kJ_y6b-Rnf1D1aRzI;|iStKOIkFx{O^D+JlPvMkpA7jvQXVTLy;8L=Z!dOY zEtxa-)H?Seozu;e74v+P<0nTwpca9SO3fpf-0b8f?UDY9O@!P037>Mmu@YqmGz|W3 zn6cv6`0N~rsaXFx)MqnTftWjS)qoP>6Yqao!lTb)&o;io3yE!#Q}9}rxZn|Oq;(BZ zR3_dOL+S{y30wT2S7Ou#JBZplfRq~@&3%W+I;qhxLjT<|zYoXMx1>wj*x|WiBHl{u zv3h7=V`Vqhd_PeG4l`j=E$<5x+4IXwqYo@qQ|E<4X)GGIs*YMR#{1eBq@J&0jmNy( z$#_OeiYP7&qNj?`c%8#wX6qSD&hLAq0*S(%X}s=du05NdgA%qHfJ9U_%ba_mEB@I^ zSxC`Bg}>nLDz@s|kuHr=Xc}b}g=sL|LggRa!6a}a{7D`?)b?srvzZd7>Xmn6m1uw5 zrOjNrMb@}k4`;jYFvBX^us+IG8-Rxuz9KSwCuV%+fg$9YRS#hxO8t&;EZ`O0U!8Lm zyh&g^$K){pogAb}kD)^yDG_IMI#YcL{)17ZgNph4J6b1ox`exB1|4 z+WOlB$>tL``NC!S7QFz1-bns@Qj5GI1^`M!aLDOk<2tGMV?mxUL##qB0Wf*FIsk(&_4*Y8^97{5IgKK6aS!eYThdYeiu~t`g2y@ z-XY!xFT|8SM~LG-Al(ho6@NwYrMV_v(p=s)5Y~HQPgGv;kIS+AW$#xT-du|982aaV za2x*Z1kPNkcoMgXLOvmRyh@enllfg15XLnA$TV|F=8T>2Wg+3r*+?C+h9C|Y#yP)9T-?>{Y~_r0q3Bn;|MVoyEO7DiG$Zl@c2ou0QY#je|b0-4V&#@O9Sz3YP!A#B2QPMy~g8c z7}9kXNlZ%-aJS_~%Pq2k7bAh*T9XDV_5;nv4x)w(-Bxtub}jN&5h6N^clJE8O7_UD0eEZQMN-Nru&_nmoSZiT0O7d-y)H}!Pnm( z&-=ccN<`G-<0nQeHE4_lN;p)#!Je2pSImbkA2V@jjrAG6%X%Xg4{i*7Iv6nEx?=ep zv$}Eu6Bi@>gwAd&p7)RcGLq zFxTwPdy#%d=>STUKh7uxz|GSZT(oGmF~NNi<}|pO7}tM0(%#h#luyleQoq4S|B7Q? zr)=*0YL_?(6&$rK{!6`G>2ckH+-%+IIz2z!)c-Ze_dw9|jB``DbFdJt9W5$({JJrp zNuK5GiNQ`d#@b{Cx{TLb(fxvLH-r5u^8P0EgUWq0;u7#G7`07XG^jvPu--!=ZqRMG)p+zM8D_yVhDrAkhkvj=Pd+%F&})}w&*396nF@@>v4gJ0KU=bi!ouET9U zwVJs4HqgB?bmfaAQ5JAF3vBviMUdBHN@aH8Stz4_AISXbYYy z@%@GqKOH{5?nV690V8&0svsxu$TZn$b!R3HJgj$ILl01b==oU~ZrS+pDqOEwqod@b z1wzrMz*xi!kMAZgIHiLauCZ)c`SEH(jyG4-8d&!gM z^3dpi&gJ=5m8Jl%U`Aewnp{btM4^ofv}2pr>jUih=+FVz+dj9(9LO#hwpX&yr%@Yz zuAtM>hw-{mtFCSdtJWW@d9n_xN%L>`jv($^tbW{xt!-=;3VWc#->?M&2>tUZU{t6Q zQhm@1E(o2xIMV@1>-N6oBn|?eKa$3gv@vcuHy_N8Cs)n4`H@Yo?LGze+c+O)%6t&- z2(;41fMZiQ~F+>BtnT;qn z9uCFC8KB<=Ci+j+?FlWc?ijWcTWWceWB~Cpixo*BiEvnH`BZL#V_G( za2&87l?@54lCgROm^+33xU_#`VRWTYNE;fBh1H6XG-dSK3W^&$XKWGBDLpd+Q9iuo zlre>01F~efP1h{izBEw_w}}M7hBV1U-}T@qS9o&B#h6{qzB^16EtSi26`nPZ7dqKZ z1HHI#-d`hGIJlxen~=eYD{uM227clFO+kL^@_yo`(tg$WYcJPpvcfz_P}#ub2BkDg z5bNc2OQIXtp|1vy9BzCDAVY3V1}M4RWdp0P*OL9S(yujT%Ar{ix65)vG+jH1m*2Yu z|A=w}`G24oCT=#+k?Y)GBSMZEX4_IyZWN!I^4%r`FV%fVc9Fti2iq;m3x z0&qlUd5pd|!@f1$0}ljmP^o)n%}Bbw{peiUUmplK<{;whuQ~A3@2UdahnE8r=|3k+ zE*6lm@e!+Oj6VW=ljI${vbr?_gL-fV1AhTEk;6__kN(-D{BML*eh+}4ppG;^89szb zOP5>2q%{F5DojO+PUDx;yUc9f;k6mcTq(%xzK_#_;l53V%YHNvNtg&A4s7%A=_7;I z8ieTu%HWt_$(OlAGSPrV{3EGQJ5rRx()0w5R|Ik>Dyyp2CbzCEI=;3Fz0AwK!0N9a zGB68?A=R1RTbYWeUs(BM`NAe!c%g@D!WJgW6ASD|o$SC4WESp8*MKr(sXy;k%rE5dbL7`s*!-7PS`w|Dq$ouGF4Ot5{V=xyUZ_)r^r@M?#2 z3!LeM?-UM0s28lv`||FNORJnQPal%{7A4q~V5{sM!P>n7&8H_}#_lUWX3}W5vzTf7 zgr3JK5uVt~(8=iprifo#SJ3UPT3ze;s;uu#{R>iJq>06RJ&nCG4ahn{e28FjMU7`q z;Qi##R2H$Jsi#!A@<^1#a`4Uk{u&F_SzFbGeZbt~eA7L7^F=Ml&8D1Ld@Ik!=5>m4 zAVE)=YBQ6*=_z50Fv#-}du|PEYb2eJVl7lpso;XBvCd@<><@=;XIG2B$|vZ8(UbwB zwdPh%%*7~TgrS9;7?U7c<*;YvR%z{3juq{ubTAO540QIW5eMsOa=mP{;Kx5?J5}$5 z{ybtwP*7_Y7B2*LcMK}ELnkKa{;^*plO~Q(2h9+pl5sLAuo?Q|0R)OCAlb?qy z^BPih+Il|CCNzz4<<`CcmJ0%OWSiGYslOl+x;LetTQAEaY+*o)``VUlzvdu)41Mp~ z7Us}wjqdT?5$w>+U)gM_9Q;Ia5vKQWpU>5!q0e(A_T9R%G=&GCh!E@0JR|)u3vI+( zMT1hpR#7CI00@FRXC^kJy~}}a*sz&uj1Ncr8|wal z^Ko*t`#0lG|K(iNzk1`Mt1pH}QFHwBT)WTNPF4p01{nXVv;E5+t^a-FA9wkG^n38? zoI>V;8o|p(=%UZmhndJz={k7B`sTw#>(NJ>J32f zB=Yl6P8byQps4xCgENi!;lh!xheJWZ?%LO;*>%dWC)GN)#}_Ccwcx`iz|$+oqpzhYp3DK6uy7aNRJu2mMwP4qQ&aQRHsr_a3qw{dz`XPuMeIFvFmT~N|Cwt2S7F|ND<7vgxA=z~A;9}^@|0Zi z@3oG$H#Ot?86>F-QPd>Aol&2MoX42aK)((kNY)X&SIA*&p1KbRK2TC~S{`){cLfau zv<-k*P`7S2OtbM>HTU*-{)1c2urru-hd}Nw^3mNeT3al)wpclUgF{)^MA;10$Gtie zJifXL>LX*nfox*`A+sIN2BmSKl2Xb%oGyr7ZzNzE!%&kGg%7NkSDxz8r#{7Q_DS6N zeEX>^B(F4$-*?vi%aTn^3Q0CJpGWH*)Iryn*_ zdJ}BZ5pVo*5<4ezeh;_BB+?<&H}Zh`JLs1?lks~M*V6_k3 zGR`kvtaz={_kTihOQX1rosbgjN<0dVt6P5Oq9##{l{!pZy81^p&cr7}=el;U@8*M3 zqk=0FpI0ps-~#5|K5kgVu`LM$UD>rBrlPMl-1rdP5%X_!u*I$n=HWpm80+Brf-iQHT&uAmB&x_ z4h3DR`04M4cfY@^W_-8tc+jQKx2iXNwe#}x!Us+7%^&RDWTx)r>@e~$Xc6h0c|N%{ z+M`taz-qve{%6?Mel1R1&w~X?1pYc+D4y$y6EWfz>N#9dqiE?|xob&ZQkJ;!T~8{- z)h?FH@4h#d-#yd1mU<5g7a)%N#;k;*Qd3myoDYIv??lCeq49gqW(E0W#;SyUsZDCV zB!j@JT?ny{l@^{U{;<62BH+-!li)F$rU#bJ9!I+j@HBPC(z$8rulNIEi6 zRCW|@tuxE#2Q<>E-Mzumvwf-;IA&zT8|~59X*=exDzZS}UmsiwLUsMNM5Q1rqPRsr zBzm5s-Chizw+&A08*7>iiFcAP(n13Gy{0?k<2m{FdPZpZWkg(#C&rx3kNHW1(|XjG zkF_#(hpBz^RCs59rhqh*XBem5LTX+%e7aOyawK+9kAX)axz%$IveM#KPh_)jGnbU! zbC+@F8}JZq802(*mx3N*XfD9N|IzD$X5w}(E8znf+JTsJ-l6c$@2~^)=C5wfvs$M# zf)jud6m(JBt>-I^J1yJT@TaKP!TSc*tPR~$6iI$p6ZU<$rm1gcqTHx6@)0s!F@A5> zUADMj?1x9!R-o#RR3nMuT3O|k;mXvIFUKclv%{6>i`a|y5%+SMUN>@$2Hu8+J{`So zAd$6*CP+SsyW{vRCB-3Mwl9)4IylThmiV?ef~D5xcy>g*Wd~ViD-Jh)U$A=Z>QN1- zlBm0K;XJ%b?-ED~u7v#hrX4+`^X=)rcSH?wk0%w5GF3W1w@upYan14#)(Ld2;#YQFr!1S8 z|AMk4cUvZ{nzN9$@fMsf-0?i-6@=CUZ&vqq19e+9Jl*A}&BhHkGUiO2{`3qZ%RBHt zw~Z=IDF3;|L%|k%HhD57PNvz5TS|B|{xGn>^0&=vxyCRl^`7+FqGab<6jSVgk#%Yt z@g;FP#kn$W*tl5%Ztqiaf6MOeXs6q&PUHg@Mrpkr$Br8tVz>5YWY@AJv)o@6ON;a$ zOH9%^fn$4>hH{b#439^O)931#O4G#d>~UUE+0J}s)Pw0xiRF2L_EQz(6*{fZZJS&S8V z3~kJ|plu}_<*nW7OhSH_S|9g!)^tYl(Mw6tHO>qyv+JEJnu$0=2|5Zn7g{xD%?vinttn+!*D&5EojIUmciR4 zj4GdsZG`JqSe+DFO3Ij9Qiu@<;<4i}uq?)6SNHhC3JGx@?_egNYftX;rj_u~&1!h@ z!bx|+g4aGOv-y12=P^dbqdJS+1i!7FB6b9-E2ndKZt=F>px0;2TGG%<-Q>96xqZ;LpoG!r9OIGs#v7(Wc z@9#@^>N=Mr?$BojdZ|yk&S`H_Z?klMvHetTnnJM>;;`KokhCkOtb`@tmoy+JwOSQY zI9r&NxeD6RjId^3Q)R=+8zS{PE&UYQ zWveXn?GkC<+tFesIDWJ?K#a5Yf;TO+dRb@rTw4dSy!l?!m&q+%bsL|MYuq#jE|nhG z_$`xbp_I87akym%WUr8$I(lm5x#i@?Rnt_? z6SYJxU|%o$dTZS3P=)7-MnTp}nbzuL&rfKZ;frAPUto6X4X59bM5rjn`f1of3q${6&}1{EABz8taX?0Bi+>B6kz0- zIMaAX`69@5=V^LsvJ%f$|Fh%&g+tbeUGpm$D=`AI$Gnk{)P?EBie%ff6~JV%L#vKO#gI9 z`sXGx%lEAG&<~g`XJri{#yx3I6wDCD6X2FZx~*h;pGudCIY(BK(yF!*BxOyjc|-0C zQQ^HUYoBooi6R*rj{o~Kd07~6T(*Mi!wYD#S=^>+(_PFNc+so2(jmc77geJs_1=sT z6R<;t9#7YybdNH>X&0D=-CCSlVPtydPx001RT7xU=Qwwv@nd9jXydo=2=voVsNx%` zo=&zNm=kfBVaky2keo_?$m#g=Sl#?2`s-_^PqU+Z?{XSf&K~FbEO*{(<^>qeLX4;p zl|3-`2WzZICw}T zgj>nz=8+H^?uo{Q2Oo)q!Oj^*sFToW$s)ouQA8@67Tg1y-|UCpw)3c4F0T@ER(w50 z=VU@zU#rH>_}TCwJ;xp@vawMGE@(=1bIm?`n(2`gDLKE?*j!bk@o`g1V6xwn)kjq8 zDi>bTv{Tir<3!~5Hi2V=fJn*QyFiLrW#2?Yen*whYt50a2~2tJ$JAE>>1e&Wz_!ja zEujw0Z*bMC#TP${UgifJCFj{)ZY9tk6V?ooi?CQ)1! zKfw~+FZbMpDqnj!%Y#SSLY`~LXqBxo9M`2PaR@BiD?fE@>VY^q4O4(62Bl$1w3v(Y zn)~}{3P__5Nj9^IwCuE!f=J`^zbg7^>R)L6IR`+{3%B>*w%yd8irP1DNMjCwfwfz8 zX2cCQ`v$y17Uy{`L^a~gUO}N&C`7!iRB+9Ley)Q)|*w({)(1fVg=>4F~ATi z*SsrXSj56a%PC4QLik4}^D#ym|I z`lrzQ(3-O^p<}-S7?Ok5QNt^i;G;Kd+yo)}eN(_W&MF{@YpI4y@s*=0p|SA&_=JNy z(|3nl7^Mb9WNSQZh;$2T_Xq}{AU|K4rSti@cAaw?!5AlL_zvd2$pS@iRAtFcMrF12 znQ}@kD_-db)&4s$(L}l*9Hxlahpu?StdKa~vwTm_83StJk{mb0)`oI$d8qL0Ma|%e z$Y_8y(*>AjrBhl$(HiCESqSrQ>bC*V0I2deto>{&#=v2bFZFyal;?&U zr@#%JYsXcDY7HQpSLng(fCWoeC_X&jE}C639*++cyz{i*&#YK=JTs841b#2#kTyEt zHTNR&rkDY(4NKL?p@Q*%Y1eV|@TG-QEyCdluO}JvGVNX+oL&Lz(dw})^`xC~u8w4n%TZh} zOvuVGb?4gWwdmF8;cun|raHG4kv3sl>DvhgPo1hFddS;)i)MK+Bgek{mkQ^2>UBnW zrLwMf=Z{PEZKytDPmig;a z_feeID5A9@pFT{4h#$sRMOPS%@bWTBI+1) zwDeb`ng1g=A<91NnO9vr#Rc6{%$O6GcRlkWM}}Rptxc@fy1R{KI^-3;yXUK=bB*b` z!_BB-0;+LwUrB|J*fe+FDsB*U8RB;$w|#>e)E$I^W{qe zPCfqd6TY=q-{g%4b z?=MJkPD#>IKSx~-4|C>DzA++?E-KQ-Za>x0AODcLj!u6NoS&FRN{jFBzj`YLYrM$p zR9%Oq9a-=Op=7B+Er)Oh)7bTBn>4yVqi4L{4AoHEK}SRahVsTExW>!;!X3JnoO0d$ zt76Oc$gcsWBm(TaZK9MJ`v@|YeoK6KK&`3v?1SougzRec3Q$Th_>iaZn-AfUL;x)_ z7x%f87%82P?2!Xng4_Ed6-aX0Q^f%Pb9G9m>}yn!(eV9Y#=c@7=@EJyO6>J2F}}_Z zwY-iM3WFKk9|KJ90-m%*PW;|0*uUSHJC?!4X$`Caa`aNiZPC^tdT*NOW9i+*S7(@U z{B0};xq<@dgV^UnL|3N%HAx}9VjAF!R@QAmWbzcA4GWhCiU+Z6Mq1HRH~BRvgQYhI zB7dh)J}XI~qKUY&C^V`l0${(3j<9Y_my6S1-|i z2aFzH|DY!1B)D8T`W+WdjI8AMSx2&Pa(L4QA*xzErZ+jaQ}Sl4?QIKd7m~tbOR3?M zsH$OVn5oibC+TCAm65yQAUvlT)ocD#N8jtggUu z@Ta)Jc=MGd4&W4jE7>kackdvto#*xXrb{D^%O*SFtqKLp10R^%ZAX}HiaOplA|KQX z#-_j{vA9Lyy#h?cuBRnx@V`%2lm^T9N@J!Ar&dq9yIA;G>h#8q zoZD%;lCi)iU0Af;6H*-A!&dVcP9t9x6^$3Km8Y8dWXIj_mo+rt)1FI#wDx07O+O?w zbz0c1AQVD^LtrrcsyfLgkxsI4txKUlvlpyrb_z~9kcX44d+$Uuk=Y#)lOim7qB#1H z3#78Em1EkVp{$cX{TTmlxaI89@e*Td^Ya>7pv@8-9}rfj$0Xj!4)EDLeM{&ThIZxC zz>vVy@wJ87x1~dFkSsO7f~>Z^lk;{5^eRo`t;Qrn4Pa<~&j%kHHMlGk2638yn8=qy3 z!kxdGX+cifw*K6DGtJFl_+k`LRPS=wU;g2;bXs3S*`~Dkv)+2}lIFyh@xCL5BNuHZ z8Hof+5dBhVQjHs>aeoH&=i3LAGJ%{hU>&0NZk&~KEP!mIGXKUl7jqi-vX5y&s+y;P ziL#^`5*bKZ9>ojw>=kAHchs!BdwvP_pSbLK; z@ReB{Dw3{gJ0?m&kRL&>AYhbWyLh-8^eT*bWvua`+-Xj&CcRU#mQP z?$lBX*FR)`oTO&gyCe4MfZK>zA2%#b2!O=;wPr9W382ErMZjt78uXZ_pjd0tKrvn+|+gOUd%-+wSALc*KoEg0m9Y`4wwQC*kdb3 z0Emikl3I=*ntr}CQEmI8+JH#5^3=o&Nhv1E9N#@;nln7ReW1`CA4Rlmo>L*@rEy;W znyRDb`7(X3Zijtmn5nkjh#7tT$ask^^>wYjjNq7Wh1A*+!0?7vl)HAIOSPm5goLYf3LY& zZI&^Cfnrzq-OFO_oe1Vdwo&~ z-n5SDN<$G`Y}vej>1+(6;Vwfi-Q1fRnzaR%76LRXnS&ntW}4T4)J`lxF!CMG9o5CY z8e+$fO7wrMdp2&CH4@HcOh)`T(9$nV=kMwr>?-5kDjh6gs81WE#K?pt7)pd=KqTRT zFm!Hcyx4p(DN;zDZNTR|m*Le2qi$U@{VQ=ht*m8oAJ#g}T}_W~n&tO4!f$AkA5Xok zI+A7IB}yc*w-lKUS%u0D{zyNYr}FfX<$zKDMB!O%S_H2dZJbwX^>)K(dL)=3$okZI z)OU*@24%XWzzIZXxt${Rc==9$Hs?!c^?38ek6LEEUzEpDzegr8k%zO+u5^w+_z=9D zkKMf_6Z(tYkI#o>v&2(Q$=OPgoFGh_PUCkYG`@tOsskr)5qLABG|61{E!hQTlgNGP zq=Z`pv}6BKc>WHuvx%|$UEyWE2L^Y^wvsXPKnRwf=Q#qvpoHuQDYzxv~Q@`e^;(#1I zHVz=z*o#)=pji0J8G&RQA<}=G`gw|7T2;QZ;BTyXN~Tf+e3)FgBKXiYKWCfqLuWjP zFFvLLq5;c$G1*!%syxTc@3zEFuwsyHZ*PkxQr4FHR@Z5bU6rbh34lrPil}s|o7=7i zC;$z7g#_e90F1*`LXQjfw=2G_HZFzq^S>btjjBxB>3wSsWM6g$FXZ9&hyJal|{ zB#{}QxsTjEwW`?y$j3S3R#^DTS+6imj+X4IcJ&^zZicQCy{@xm0#6$`7xXa}csCnA zncVvOf362^*r3^}^XHx>2p{sNk)v;JYU8e_OeWo1F)ku+n)YQ#o-DV%Gj-ZZi2tZ2 zl3G2L`2$ZlUN_!g@{{-xU!6whtmaCu$wH6I*0OP0z3}pOfr3m_dT&*LTX8tf#Lb-U zV%1gCWKthg2Xijo;;9TV<4G~uoX$;kyww=$y>j)w$fi2%m&NEM>9TxLBe{yJQmXOj z=4m!X%`TQdQ%wm3OK*=4a#-5t`T6dt5n^y9VKa0SBR9Hq`Q4FZaREs^eNX3sC08VH zp2Y*q>F+)9iG8USe(ujYd5_YapgVf$v-J)4 z~sauRQhzVTW~Nq}Fx9Q*o55sd^-ia`B_ zgqUV1?Aw@r*kO%OCb_yn2ya(bbefM`ZnV+Kf`nke>S(DC%pwuUI+R-M}X+wtI{qEgHxH+0qVscRtX z;kg0E@{&vN&)wUTgt*AHqI=r8xTe=#A2M;}5ZB3S^XU3izxNpwgO7yP#MjsN45Vln zYx-nKG>8iX2TJ|4YiR!i+5BKsmv<+KFcP^taF5GLI$hVZx#pI_BknFAvk@_44+-_@ z!I~J6$G|a*&Oj^_0V~i*dF1AiBqBO@?VOnn9oGH{vUPTh((OhA3MUXey*I}MxnaR8 zb>6=M;pjaA?nE66=N~iB_0er@+X!69u2W}RpE`uo!&!imrw1U1j z)>A#PT^|SP`RZl+%3ULWrzwB9Hmx_6J|vqD`mS3zGps{A&GnB!uYJp+Nsr}8oC4Oq zR6MBdia%hsPB5$sY6kZMkU{z#o)1nq>N^HZ)W`!_OFMwuoO&34t8WZ#UNXDq_B|nc zXnFOmF-sCyHY|MefIbIo;2&pS=B#t1B!$R@=;4bCU#hx(=RCC~zjFWjY}bhL+&L%W z7nW2t7A z56`8R0FaPd%D>h;w0v*pu29Woc<7U>Vom37bqQ_LGie*N7Zfmeqh?Y^aoS4~7p_4Rp(& zUvjtIaW>Eup)GPG=Y;#wt1t_VTY6byNG1K*!Jgv6bEleVm<r0z_@|z4!%-<^!-Tz9Zi0TzXw%3l-ltY%*opTGja4eV|NW%G;54p)VyYr&&`{ zz@Cc%_U{E~5jWEFJNNwhNU?DIUVAxrx$ufkqA#K%5gUD_t?)EVulYe$^W#dL${pNu z7nmr?{5{QFTHDKVW8>j3$753IJrqn=_hsRe?Fr*%mB9IREQlGCZ56aemmx>LVvUAE2 zH^Nupjf|2Pfi7LUtF1;6Q0iHGlN$k?o8skjk*OZ;WN6eruBY{LlHK<@0$__ip9U-O zIplYb^tk5Ke(HyfxvA@v0~BIFN2I(eoCXJsZmU1hTk|{i+G5AcMJFIr8oU#WwFeMj z7Sc+S+8V$D_UbE8BngT%oO;ZvAWwA-M3~&sk0mLT8*z`|3W;@p_)Mp{6o0n1*BL6@3-UF`5tlRhZ zeVvhcEr1QA58{YQ6X`8DGKva5F$0wLMIYR zq$P#`A%rA%2c4##|8>rL{^#EN`J8+{&OAJXC(pC9_u6ay)_3h)E93^ekOJ&9uoTqt zzG-)LA#zB>mD8*UwVKQ*DWE4PWJLAOHT4$Pp9P9XzG=Y2e%Q1MaHej3zsNI7ZS{li zGzTv7%_IPk77Tfy!T5`_A|exatak}Cg%A@=>q}%22(McBy?qvWGiIu<@ExP@!kv&SnYZw)SlYzOwn93<1%qN8($A@geV zmx|Swx=H;G z2)72nhP*w&_Bd88Ia@+MApz$Kf+ESQ3Hz^pZZ_Wi__Ykt*M$u!&N5D)bB4BVHEj?U zb#Iq-kor?tA())^Pi#;nd3xWI%K=1%FFoT9MCZvk*l|m;-5W~7-WjpJ&F;efE0TY6 zBN$Ahb%`NlgJ8yMk)OaagDsk;xAB%4?6o2te%bL}k^g?fuh;&umG7VNM?nb6G!Z;_ z5d4DH(tD}NYP05nFy0QQANH-VaJpvy#-n^S$Ntsm?3-KXzw46hD18nsA^bc5WB>X( z9Ek}x&i(5-@Dm^HYwqLf&tL3>?Db>#m+Re&zxig5^nWh-N8A6mwdH&7qX4KBDz?#L zyB;szX=ohT&C_K<{huZ}#P_xprx3Q@-cp6 zY_tC7%{Zddy193iA}_sZgPX4z;-Q)Q|7iG+M_z*8+?9h@$A#L2v2s#el9a(peX5G? zT3TuH)?SbRU*ToN;o%^ZV%GC3u3&L#((HUx*dYs#A01yIt9=%GNS$jr7|Lv-Gzw%% zj++({w@j4^w+B8lkcHF(W(8%DU!5^k&|cu=_pIC#BXLz-oomO{$_SR*vt~MT<4w-e zbw#U>ZMr<6Uzs-CYvOOu(1_7RAedK<6H`J#!$xJxn-t*dV96uFb^B_2?x2;W67+RC4@0!h z`gs)X7{o7TXvE0eyt+A0+zqNjoGvA{wP^dDAF0m0V>cq6r2a521lCw0(YCVG6N6^A z_gIYZVw^B1i^;^hbIEjw{W9U1eo)VBuu0Kp-lZiKJ_cmX$^BnXSTUU`ApGo0s6Md#Xmv=6F!S91uw zWXWX(b$EOhaKQYDsG$%TW7yZGW@u3IChd_Yj}|kzR*O~0ykCB}x_z1>j+%=N?HUa| zqy01S)_V}cg9&+QJnD`f^ZI5dQ?yAqk?&;vdUiZch zvnf#mk1{G{)Wg18RlmMbmRu>aWuaDWniaue{J1IMWP0i`y=R*L7M&sc%q1*bX%E$t z>*M_f!M?cnY4~!(OCJDT?tTgZyE#g9;^V?Jp6btzZZy?R9PU-I&HPcWcHz+~&<}OE z<^m#FMHKg2jq7v8BWKV&W585oLY`_nr6;KoY!nK4RrMBlyfIDlz5YjFO; zI&L<)l5QMO)QE;&nMK_hvDG?vMiCiaeN}tOo@@x^mZvi83%9aJVzEehNZ?OPhMTU0 zyc4mvNN}`X8oa<0^~N3G`cy+}W!Wmm8CoZyyHpxw6LN1^cWHiq89IkuLJOEbYoiG) zjqFogsaTB<5aNAe@y~4JX2P8SAobz(I7>+gCy$7oD*XBKQz!nUWZSz`jjg0Ows@+5b(Wn-J z!*Fpu5Vl|Nyi=fn71~DmX|0t4?wyRlZQZ1=-d2Qd_OmDva;sIZcqMbUO?tA$&5n2r zH_nu76;-WxHPP0`AW!Jm@e>oN!4gTcO#%qG)N`9~Rg^4|z+R?pQbyDYyF%^^2LyXj zk@_`f1_Q+HI6?h6hE=O9Vj{OH5DQqyDUkNR>2Hb-gRzbSaa_|E&N{<}oVNW4LSBGN z6@h%-rCW~Ob3Ch?drOa*C>~WRYx;?QWYn(dgC-i{o(&5&H88MYcEzd3$)%g$c%K zNJ6@iC6g-7Ve-W=&lzKe8mpfZo$i2({>X%tb>3|ob+8W$Jx)ND4MH=&s22HKcKzv& zwvSTSET0Ni8L#VoLu5t69=@6Y694ZR1}juFJ#CqjY}s*6Dqcee8!gfHdulaz6!>B%TYL3q0b5 zzDXn6a!1ddc4}?&!bI9=Pfx$Bo4(JuC%3GM)VY)osNL+nL>Z(!ppaUEJ?WmbyRqBB zxNPrvm|2@NafuvvM-p%PuqWdD1pzCjF4*JEGN?k6L@<#jmeE!osrbp8pguTM%`Rm3 zO?tK>1g21V{$XI6wv*6`(P_#Yow5k%J!@;LIEZ`Dh52DBSp$j+)Tm_?u70P+w$;u< zSDO$#i6|l5qlq>ZiS#{^rCwT@(0O*BITcS>VAGNOdYa^5_%Wcm%RmHj!C+NX%3dMg zRVOKj#L`mpw_EDfp3fw`e-Qe<|A9qVNKi)jSPrwi6>jVroLC3{eI zQRJiyyRIWupS9Ga_YN1>vrmjr8(Ag-D^)hhV+`bSUDf-z0?MRMRSi4=k1I*bthN*{ z_0uPCOLLt#1NC*;GtBb@0i`*tGrIOHAz#P5g~q6Q;1gYC$1K|&Ubu^|RC)F{RMNLX zGRVu=6zW{MR9bxnZ8ClN)P01El#cyiEMAjJyc!gqJaB08GNr)Tr$%zJ1c-#SwpBX@ z*?3RqIrMuLwEr28nq=jEPEFFahMIAfk`C@;vv&&=;*a!ipj*7h7T;;9d@C$KX1MxZZFBpZ{{68$*b^AA$A(jjzA6L z;R7F$B)>y|8->s6fuy>qMeNR*7a>ThsYI*o3NM}})2<-sFX8+TwNv>d!`c(G|M$FP z5}r?y;%greyUREROjV3A+E_xXcHY1K%1ZKhJ$QV9C(-9Q9_-w9C@C0N3R03FexG;ZaIGy4mT;yoCPZ zACMA=x0LC1Fg=bPXRQUe-VX!g$&IAPQmS5&!AN*G;U4O-Cy0GD@S~L?Q#aV^Swu1o z)#1K6GQ$x^P#oza_((uje_R(}sY8+wVv4QN&VXotcuV*&c)OSvHp@;{ij+IwFvLMK zztG(OmhtIONL4yAZO=f9brPBFQCQh9jsT`mi)+sm0Kzat{gmviez6_df1$MCww79E-jaWLA?Z$EaS z@PS38=}zPumF&;yaDu0YRlth;0K`?iM?&7D=isL8<)@G^wl2cIucm^1b|0q!j9q6#g#0OUbOQ1I7Rj zL&o}ND?#tr%P9gCV>JC0$ATH?gWfmBAf4|Xp(~{N5$EAy&v^jg-o+REh*)m1-s1%i zypH+aPlQht^Y+z4za7de01}xGu?<`O9h>xDFjO`L?zXSH8*&t=*v+)sEi+WjsP|zK zNi}w{4`yCyoK;L%BN7A#Y~W7Tw)ph|i1p7TCnI#b=d5Od5EWGS(4^yOEBBQktZ2VQ>&3&RQMCSTizy^nO(QNn-nPY23Mm8Yt10 z2@fFtEBG=-;QV$_U0uV|-_9DcL&HH@@KwOCH>LUSZvZqT5Y6box`e@9=Q81&NM0Ty zd@4YIyr;)324H7!n>jZXSX`d`|520=b96&`_FfX`OALPrQ$fE1|A1|Xy5%?L+*?xJ zI{A)V%MzoBMY;9UTNp-GfEVDsr}G5M<5+Kr9-C3RgtSmT*0T#g-EStus+#wOly|5ixvSty`9{R>g3M(o9Sz^~g%S61Qgg zjevbHhuoyBu?XKbK#lnwe#?OI&3 z;|WDLR+Z+NfYM#>6~T8@;JTZ zQAtHONFHEOSWi~W9O;3arCwhxPxD|E1_(5uF9)eCr8y!148cCRy4pG7ytCJ3H)6fN zzLaURdes95y=wIKnI?P*I%`*HN!ap#2u{+@2+j2PKxt@FmLow)-;`#eL1~)n#dMD7n)8y|7_xi-fsRcRqR&EyZ22dK-BiYyXI0 z$e^J(be?v3znG*@N%i~1wySmF8d8;eOSBJeWvy5zLxY9(+pC7#Z-p;S#<>xnhG(e53alG<-kS36`M6Mo6ijiwr+To=c5h~Dv5?) zB{MWn`>J{zw95jjLA|_Tj?Rn#I%)}Cm;r9QKc=mfv6$BZ(04^wF_ z|Cul1QJsMJ8&lR`7 zlScSEeB_3Av0lx1&Qt);GPRdUCvJWVHssS}4pcK@V(09l7cYL5h8(o4T`*f}&X-;s z_(ecgZ$k(IE~%tVyR4%UtdKjW6AoaZn>*ml{D@2uhCkA<8GM6oTevvB zl6lPg=5G7p)MiSEV+GSK{W1eeqM9G+8|AyMOO*J-06%HZjV|RSvr3_f%CL> ze&oPP=KYGZy5#vy3LZFO84Cy*VT4AjGs%_EAk+47Kayv2;iS^|;sGprY~n7ZR4q(8 zJ}xT0a)sE=z5F7waT-7R&lJ-%*-z?wJDZ|q0iaS+&8UE>&*1)%1D_yK{JB19?a0IL1}4? znkf0r6?wEhak4qM{5~U*OoF@BEv4fw)mBY{lGI3{_+B?UO@!=oyLgr&K9US7Sg4`F zW$Ac==q(RV=2fBfRXfP$y_cky15N&lOZ=H@ zMHjs6;#e`F*Ur zqUzl!_kuQ(rbqOs>SIsf&O~L)3??QpceQJtJ}|knUXZW(BjTu&zn%?hEC`j(wEGVN z5zet=EkUbs;GyZo4d{?^#iDcc&}iSw6XD-|9gAEuO(nA2A9%U3*(Qeb4*)>mS)}d= z09Z!_=%X{dtFqpLc$8;nc&yVd+U!COp0bD$a8IcX5a3E`}T+CWy97x|b6bW)F9G=9IW?ZV~N+v1LNTmmZrRQ zhD$N&$9<1w+yfYV?yvwJe`cYyU)%jDT+-YG$8niuD`MRtFf4Wfs&FZ zgSv;@A;W|GTA7le`AhsJZRqWty$lCbT6zM`)E+IOPc#rwC;*~wyNR`Pvyw22lOFOp5@o)XS+P(d;_AsN=r`VJ}jP6 z-Px%>F#A}(w$MBhA8YO@@3iR3M%@w52v>eutSf;lh~1uXd3CF|e!Cnbx=FRB?^o{+ zVFfZFx#E2GiYqai)T$~GRs>xI$zPCd;apU_a0g$<<*m~4krfkUFS2hr8!!^W$c>3%^6 zl7>f6F|qzyvM$HOp^%|CS&0m-)u1^0=MR(R8$&Ycgor@?b*l_^1a#@zCd(2DTKWTx z!R8$s5ZXz%FFW+>Y9yibga(709sBK3dA>UBFj>Hx&jza-W?J8NtAy*>X;IySB?F6X z#Jbzp({hX3Qoj!Zm&RWQl;g2AmLP)xOo_I26qeb2k#rbv znJvo~WI%>KBUm~K>w5rqeXKX!@}n~|?WjQDA&_bt`kO&z7T~CXAv#rvbsefsZL2MI zgwB|-CWq>upg=^TA_;0jK*iZy^!lR{neghyD`1djX}=|d%2O$m^(otv7u{DLEVm{D z)jB>Jkt@foo9#ODfO`f22Q-d`= z!PA}qdldLR2C^RWGJM<*e2=yGh=)wwp)^%GOQ?SrGGEz3)fTvHiiXk9Jaoba1Ip$> z6tn?EIokTT7aaAhzJ!|YU+lNda0jycJn6Jhmlau12d@pHnsURXN|EhIgzfQstTb2% zVTyKFezJTURj!!pti#M~HPJO}CTw)8gz7+&EFwRGlYxO-Fm1ci`Bx4H&Nd`}?pv(; z8`;$0RiM1c9+}46<|sZ5_oK#=w#(pk&(tlQvL9lR?{Jbks8I_k3x!}8Zm?>Zu04Vd zTd8N)O0yaE9KYk-7klwNBvkm4DbhWY^(qCFn=PIQya9*#9vEsRWFv$$0-Tq48tsS_ zB1jGGHHV52e!Co*CXK3Fb~tWo7h190N{Lj#x}6#%2Fj&-U(rcwTYM1V{5WL0(oQMM z4Jc%7@zsLRX}4rSO?~w|lR!>`E}nPK=^CV^ z6c1-^nTp+R=_EJfIU7#c;1&K?%2AF6G1>B?=@jSKaYY{K`0BX$^)S^3i;rQAtkm}A zLwfu01yqY$eiv6Br1jIHT39qbCfGRHdOIxzVU-X%*|$0<&7N-`9ee+w#(I3U*;qcm z(1#XOFgdrZdAmVfJGI%FLupKaqW@#W@x7Bf%h_gTgx%OO}4a0zmQB2 zK}0WlGTET&L!HFJYNoCr))sLF5lyOYcRQb?i@##Lyg$Z7vr!4eJ+ghndy!&Qt zu$~3!@bx!GdYjQtL8|d?LA~pm1iXj8yV}3(Rej4L;6MP)gy=Nwx(x6ekYa>g>kMauQpt-t>$y+MVm z@D#ya3|ES0f<2Z^4y~~7td6Rfs@|*2TEgPEyNZ@a?N?77=MH;~2!(2@u}qdf@Q}u) zHKZ}(D@dbc=H}c|Ipu_q9Q#w%NHML zwEX8jz?BM!apbh;+S6d5gNpK|voRB)Zt4*F&@!9}f96~Q&k3}z6>bg@2+mudk~<4A zb8ytZaE{;Ja-gX8xbCAj&Zi_f_Yl9_So7}iea$84EhhHy zWQ)Qnoh1#sgx;$2lBIPim4mGf31hT#z)0ncjWYW_JfN-RwBW;iX;Y6-zSc^FV1Vc` zsf7DnS~SDYyR^WZ>`YP-&wnmVLyys|+9%fsNgUs~_%38P3H!_HYGF&UaFnrAD30$a zOLKMGsqTmx^*$kH`m$N`%FUXvs$^uvvthDF#Y4mR`@Mm4Hm$fJV>6`~<$ZQzC)LR_ z<0)i1(IGRisD)`h?Z_{Lqr(e4$l`U0TEFo5;0q|W7;$1|%Yb(??$`DbQ9qrinQVTW z8Bcb{0N6vgK#2%8S0g*792j)0bbDJr7@8OCgiV)Dt5<0Bk@o}mp1R?3-P)Y7Nc6cKAh5EX4eFr9QMd6Lw z+=XMyKE>w`C_kma$*2dikO;qQ*8> zt!smu!@+WZDl@Fy7bE-HiG?<9ICyvQmP4q9btcg@U=fSv8jK#ZCnsdz3g*-K_dQF5g9W+Msr!zUOlk zO_{5`H?#Q{K;=msKp~4V018DT@I10SFXPCU0OWseK94Iuv+#R^XNW zEx6ag?v;fSz0)9?S^rU3)$R5Zf1X2q>aUSRXn)1MfA`LG0a{88)3zMILnE628tEPL zD4FUw?uvW5*J0Fv#r`F}6M9nYbDQ%w%Gm!P^SF~sgOB$#nt_QML<`cPC#(MvS7n_( z-aOTFM{*c0`xGC)FX+*~5K%ruJf?>s1m*gAA9=j~IubBMn$+#s5X4kbD!v zUC*lzZV1EeT2}CQL<%!&M@A~1-A6L-u+n4J`Tcvk?=Z;ar$j4M`3H<)h z*AyH--S@TfhbedWUSthR#fB}){rMd|dxrmfQQq-kk^eV)$bWes_CK-aCNUIDQK=J; z-7fnt4vE+9cpaHIr$#=6g7v0F8NmGtlp5O9i2ryVVs!5D4P1z6RN!7YZcD#XB3<^# z&}eQcv^DbAOub!$jK~7fVQJ9}h!iPH!7Z0D&5++qBAWWSp8D{jHcYX7jHP5|UPW%L zm6oIqntM0S3EE0(r%TWXM&)+f`=&}@|Fr%f@z3caCH#s6q>x>&_VU1tw7Xbzctyo0 zq35F7sgf^-$9?2Cj^bR~xU^KAekBbe6B-RWZ!`L`6eT@^36P1|NnKfDAsR82knOL9 z3Eo}B$&*Lm6ZJ~2=tfh{VzRU+tlyTd20G3)j|$bD6#W;1dn$fo0d!0BL1 zwA$DG*Tc;VL_!m9$GD@?nPzE(m6k8QXs$e8+tIo^y zMYu#{PM`7^etPDegM{0qnRii#56QZTy%`KBW70nK&YPAb*_nnv4^nsm#k71h zOfOf|nj}6Srl%W!8~=a&=Ih4YU(MJRU9#Mfn;cfMuXDq@WR=hN4;f#(I9d| zq6Nwzk|eR2nxnci%~yS*5&E5yq~R&%2}%rXo{=M{#6DMdtVL#KKUg1Y-HU9`P;rWS z7u(mL(a}8LdecRjefurxE}`75*g1Pfv|ozU#H348j>lud6vKq4rDEpZPg~ggCrr*J zuc&A$3pe}b`D~Br+vcMJL6GxKrgDpXl)0N^2YbVi3X4Hi{UrB*Xlwg?l)OqTLKZWd z-&I2|9F!JFj^dA6E=)Fw3OpD@oVBSey+^c&_I88Cc?3wK@yW4uMCuLiN@PPoYyU{! zh;?GX+hwP^>t~0No2OVISoQm@G6TW(ap8z~pXjU$^w-&S2+W0stEV!9G#X%a!mREN z^Z<_IuINLX2*k%!pI*|%w>cX6c8{_GnRtyc0T06?RTbVcc4LiaSKXq@58Hw>Lqj+O&*kHi?*R)JNCCm$4^j3}6587ylhEE0N2UP8xADkMfig;RiD8}1eSBbSn% zmCQ>@MbmRTrus&@w0u`M@2BIS+=$DwO4CP2-b`qHZ-^LBATnd4Q zGN`nuaCiPuO5P^j`TE%$!`O*|O}xpdJGouvvF7zsC1-4{SD{WrA(ZxT({PRfyxeET zEs$*!63tSY#BDZdja)uYo)ff}j9J`grz80qJMwfyE@_XXidOjU1_`;$(w=+43AW7? zqR%8q9}O!D`t){*;SrY8E$v!X#*xc`uzTF6o5w;~W(o!a8)9GsuS^0Z1t?8~KEqgS z#@YGhRy$pFF%st~eyJ=Thp{)Fw%vh!?>oZ(Bqog8$r0pF7-wf`3WcW`uY_uI#-XN1 zxAtm2JE|<4)kQXdmu0VH4qgg6Fd6Q>Z_>3+rP0}Nx>T~f1y`Dx3?enjSm^k>w>W8v z=qRm$Q%VYST_*T^`ZcU({W@HQ7 zJf1^)D@z!nvY$99=UEytCOOnsk7E3&xK+7jQl;RFjm7}jHx_hx|gE+sIoNJDPr@}VVS zue#vinZ?!p8C}>4U7Lc@Am2uR9n9=yAv zCzCWbP>hr~fIjNp9uVEb3Y|$wla@4@6xVZ}FMm}`ygebBS?FhnUI{e29~QElna4Ei zVGcg6R+`+4Sj_HRgogdXC6Swy7BvNILM3bppbB*r$Pg%)ibabmJH_=7$vBKgdqCCu zm0uu)UTuUcCAL~r{8rHNaQV(jNPocF9%9A=Xw%I)eC5yD!d89KKAIo9{&SU6l7I1| zc&ESJmVV927+C!9Y|kw5 zv{J088RmA2b2y0t++Cz9sJpjsnd2LLYVIM&&O3|qCFR()QO>A6%U(1t?&uL?;Uby>-_ z)F0LsiZc+|V0dpyUu>+2*;iCC9;A3G@&B;3(rBscX_88Nq3;sUAq)A1 zn})8q%S_%%E0($9tkN{Vn#E6+97>-y9vFcomRrnIZp&QOvt(O05a3bK)uMK{X|I2A zZ}C{qOjXHX8CPI~Q8YWaonhj$pdgn;T7dR_y$NTe`fvL4(54)tQKt;WI;xXQXvWbL#oHf+Vtl-d55uwzpp`3Bp!w z;LDubLK_)hUfnqJ;kdjx>uxC0SZWp001JOO^kgw*Hd9Ibq!BN6oBhpgoW;8y40Km- z5EjxmjgKaZ6d~LMXkvxbn}Kyok{BVCCbg)w0b*evou=_lYqLqZ0Iefw+DALsK3@NJ zsQBxN-2|vibG4RdRKA_0wm50DZ%@ptTh)T5CbAyy@U&p!d*gwh$+raU^b*V3Zsi89 zzRteT;$?3b)|+axD|)f&#k0g(166HXs7}pN@Y1=#m)Sc7*p#Fb;qMC$Kr<|2@C$*k z0>c?(AHqqok+aahvE0REzE^$8x3$e80Gaygv9ElJ)#!VRBJ)mVkL+{5_L(W&Zgnzz zI%e8q(J>_Kqp{*NTZ*ame{$S!_P+o8>1JGhDIc`f%6K3gk4=+CBX{7b`#L#0SS_K& ztvLVFTE{qA)su%i4b682nCiLIp2U?V&Sgh&5|a9g!!v9EOBK9&eW&+WLrq3%0u!#B z!dj5BVcWjw4EYd&z=_J6V&MY##tI!RGi9oE4D_9K6BDdgmBiWRLw7i29y*57q-xg0 zS374NC(p4rDRZw62h~~|ll@NU7?I;*4Uis1g|>~(!AloAi}AY4E4!21NAnt61M!*3 z^IDBw*qU5Lg^BGczVYgbt&w}lP#xy*E1IA)wP0uC=prn1;4q%sQpJdhjW*b<7(lPQNQhRBc{Ek>q>07KIsZ5T4lP9xb2>!XmC;k^)jTw7C>^%YKVtFBz#iuc z|G=6}f?*QJ>0p+E9W4h}yk^xFIi_^Gq02DG^m4Dxz|}n*uMZP~nRB5U4TYO%9|$9% z<-$HozCT1ck0CeV#&%ohqJD@2}1? z7Rw?g(R~|^MLDG098|;}@*}`wPhLTpdc4*ikaQmnjboU=xa zm%K=qN#hcFXvH#03>Z=qv1nrq)5qwKw2o}-1%ifQ+2 zHLCa-*EBvHa%jJS_L4xEa4z<;jRZCSdB`E|wD!Y_hzAY+XJ&MqnJA0K6ez9~Ixo51 zZ=vx}>uqdx+f{p_=yb=ANu)knBQ}Oyc|YMNTnMzbY86nuv86N=VZ~}LH{(PjB4ylG zYh|eYJq~+BJS{n~+Ss<$s51<)kV8uI--^pBFnutd?nNRp?xUDhi#M2T`DVbltj4PqQ-WpG>Q7|K@(-k^hMnD z>0Cc{i8Q0t=Ym$!p6cKUi@HWJ9p5b<1-5nNF837v)Kk|EAKm^|$!spzy@6j;u-*;%`)i!h$1* zrCqfaT6Q+mSc0J?3+L;cS}43R_FTnCDr#O{h-I+q&~g$RM-(wRh2W>rM(U-}r|ZN? zO-R3|k90=Hrrl`x`X)U*2nUmpJ`#+f&BLZqu@Fn)$dxP6R<(4QV7p+Ah92gs?l0g= zep1*(w~hrWgG$&;wvn`Cs7giY*g2|`xdhO0SaAVQK=AYSIyNvGCXdwyTZQ8*U(Z<- zMFzGIMtTtD;LE;k7{%|5^R>NAd)L4mj~+bAPH8(?7AVJjJfD&sdXPy!En!w05t^j; z=*jyldMMW;JQpg{<~DV*C}KR=d0rV=-FRQXq#=&4-2x_~P5%u9QYC z*uD+geIpU4=oq!26qdPq_HL{%r+hzNCB9w-wwHZLohs!aT#7i*5cHA4VQz3Lp3A_AD-7#xedZOc;i$t{%?nTFLyV88dqM+2n z1oq>sC2P<4iigDDUE5=29a4htapq^Hwja$qgeb4b--$(z&Y$iq+DqEitNlV`=2c)E zn9f8L_l(WHt|5q?(8H0`x+*a9eTfBlaw1J%fl=Oc%>(QkLP{RSfM19Oz#))N^(K%_|k+jwXeD_Mm6Fc2L?JA3UtEym$I-#b@I_7f5 zXh2gR2+osoJ<*u%iGZqyY3n`Y#5;v>^V4uhU~RKaEIq$S1F8cezl+?r=lyR5+Xy_% zG=|)0zwGwxN$~KeEiiYSI{SH_UiWvrBADya&G)!M`y0ywm6XfQWwXRI_EP9tbj@`M z-PR1slr zFr*y{scq;;ic{>iS!(HzFp{Qd(LI5iRP)2kHiR?YXt@9AO+yEs8EbV;ZJEfW3EIDh zh?DZ&n%L#N27TeQ2|?5L%BZTbYKz9oU}#;^RegE&JzVSE6{z(dw9I<87+^Xh`E`kwZcT)m^T%Wfn7&c`@<4ZSRr8&xvEB5TCo z#bS-HPBWS!#4A|_QKdTm8L{-+Ky&R^7V`)?P{A1OA7?99Odajp>n%B78ymDgxP7&Z zzl9wXE#wRh-(}k?uE-IXx!S2t3|8W>UF;!5iBlsP^_aLZFH@{$IwYZ#JbyNG;8)J+ zsat)9Ax=BwaxwJiIcu05hm33=%8s3;H;T5RIgQ2)n${E%)Olj%p|0!q)}uj$iax@2x;1!Qlx) za&<scNO6@d0f39#s%4iay$n4Tx^L z6ZaT7TsW0xd_l?>Z7}YEG1)Wrp5}WB(Jh0oH#sv1dN|%H@EqZlcdL$?1OiVR(G1XL zm9C2Q$IzqsO3q>GkM>(p&=JdnV7Bj-PwpkHc!#<@8rOR`e${I?2bBdN+q#ruzNj29 zllH;V5U~>!5fOZRweD$}p0WsLr0QW^*0X@=z>j{)I=9|E=AZZdZ%-5q^z6&+ujM97 zLl$09OQ9oSIi%gdSbvCQhiE)?PbGkr9D$ zo80!9nffP$x@o$Fs4+6|l<;y3Jw*M~zlM<#wi2;T9(K7mdHU|)VRysp+kJp)iHF@{ z1Wxo#Ekr-TXb`d<#{20Fl$?EqF3nWGb8^NzPetp|ZUMIvkWGz$>Z2^bOoY9Lq&Vghk)G~DsRwRz*F=4wy zi97t}+nchX%xMpdg#oMBZ_EAoaN>}RrBA$xd8?y#`1SY1icG4jQFw82n7=7{r!o5HQS~u?1(Er^ujJ~o@?u4MG^47hM+VeQ zIlevCs?7ma3u%*~o3<+#WhNFnZ`m>Us((BqQLortGO@1y=Dc@+re)Nm+uI%lzO`m0 z^nCx`0|WCKjKXw2%8dY}kKNh5XfN|qAOE9&f3pMr)g+*PRRDEFZz`g3X@W?(xuU<6 zrMD$9;aCxiksY*8bf56R%K%X|;l`KLUF$K~TT~^fuc)f7s7-U+@LlV#$X6P8DDg5N zq_;NFAU!0xP5|{WS!q_B9iHo+?p7RSR34`%K?0L}e_?9Cv9^nJkz&cy=`#pDO-T}A ziY^TqI7{yN$F&-=j`+uCdTBs9nJD|kvNYd3cm3a=GtRX=%gcQo9_tr&h5Ndjh^@O; z*d4Tc$o-P>Qbb{=B*n*-Q`frw<+FJS{*P_)?o!A2i7!Gg$FB)||1Ftt*W~VXANmrO zRNeVSt0}q1+9H<{)UT<(4J>0*UATYrO`r=}sWyGF9m%&#n4i*`>t2ecLllf&F0sb9 z3;dn{zoy{)d(Jp;PVLGc4fIG_Eok=7x4}F9_9@`sYQx`d`RxbEkb-@g;pmRiKi!Gk z$}3a|gK}bvY6UN+-pyUhsl!1|{rAWE`0k5aivF#Z`!DYs{%W4Cl*^bQI5|NYea1U- zJ$~tCAa^8gpIP0^AT?Z+JF;T@gS`dr6lTpA6u>;!9Lt?ewinkDB*i_~{!<&Q9WLfH zseJax>(+gx}=KEO0B!k*GAgyeIo8H{MUO!Ubp%1e^gJYFioY zY|H!*CC$O!T@uXc;RIh%tQ~(K-~d7BFZ>c6P@I$gvJyn|+d9-k_ZYRlZt`#XqZh5+ z=S3sc6DptI{I_@DuYC7^wz9dl0x(z5*2S?2 zAfn9_>lcAxxL2@hh>aae@!~(wM$~r7jW7gar_>VjSiGmPUIs$o>13#I;^b|3n=EaflRTIZ99`5;gK03!oqV{+1wB5#3&dT$sv{hJ0{` zMKku|$mSNY!=n$SH1s7&a)^RT*pYDq|&?%d)C(_nTWhy}%)zHG2?=Tq-QKYw419KgH4YQRaWrYub3o-`(of zUpvFPKI2m*n?5`DH`-oms5XF_xo{ZDnui4#u%%cXnKzpZWqMKmmGvS#q$03t?rgNM zNky+cFX;O7>v_+Ez5D<3&DO1$`;Uu1@faWb+G9>*XK;#UhmM1ng|M+Is zSGxU)|KqB+89RQ}JnfymsWQMxb)Sg*zO3(zv@bfme=B#T=TOR&s%DzaGt@*oH55L- z*Y$}Oncg2tWCS7fF$_It=En|DqWUG*_|Bu1V*`m9&0CgcTt(W$?=QBj99G&Fis zCsIxn8QXGH$8X&esi{yuLV2!mu_yQL9hh;F{`SHxxj7gOku&zT6}JLQ5@2EI=W2*D z&#Bb9ZuGLNx;wSpd=T{_eadLGu{JKG>E-${J_Aa~R@P^8?=|w6)dlI#UDIpgU&#l^ zf8)7=ilqH*V=PeR9hS7&vb22be9^!?YF_6Bi&E%*f_x@>vR9h1fYa+X$Kfz3l19(! z)U~%>WgRwu({frnPEc9QaKLA+z3y=QSBSf$ubeZp z&cE+8$#Ir0?jJbb=-Zv-ZP4;Oa0%m&7P(5DW-?0hIEmv{y;6`ZOqhzTbZ=@|(g%mz zKjmlk>F${CN0E=9L!S43eoODFpC6F<{Fd%yeTjG8$^Oc@9ztDq%D<*yiEaj-FvRi9 z<>g88Pd=WTuMC0~DL+c}&V_HE%wUJuJadEgn~c%B0wAZ3?Z{^|y2GEHwO(|H|J<#8 z>2u+N$>+E8qv4mJ^p8egIhS8}#fZKs_>2*00H3H81ju zC>@uRF>H4IodAI%qegiX*rAmV%NDI@q0jC!>G*|9|LM+HP(c8zC*7&=>lV^8@TfO6 z2!k$2N#mCqX!)6{hK4fZwi1r{?Kf2Yn2C3A2Vg&$E)d8FZ_?!PH?URtcBI?86FN$> zuG44Iv)KAZhzO_d02h$sj7UUD2f!!-%;h&zcLI`Eoj$w2cSrN`KEWA(Jj~zt_RF#@ z*=)hy^O84oS(>3wD}r-17FAtGQ+jpAcGyF_8!t$gb02xJ_+U5ttnDwP5H*^H`!Tq> z$;A?_N0z#q$yHV1&R2_?*idPr-uT34mi)!l3n-mGZtLUGH}{3F_m3c>bDO3X+YP0O zRr-m#XQP5Tp#uT@l-gYMh5mri<*WOBsYbpoBy!b%Ilckl$z|qMZX%p1Q4_f={ zTggr70i12*A;P(uEiPx-O-OAGU20k{g-s+>SfN0s=SdI6<(_Oz5?wGmCkj zHUGMAwp9fcX8TVSjuqYsp}_CmW-ecC+LHmhS(Tq04Tz$30wAFXw^Bqy%v0mvM*e?PZA@T9)6SyXN&H+x51lI@@2! z6Ml;I^%E|h-F(Gxn72mwpI`5o&-4BbtMp8DUF<{br9WM^DE9npBd+MtJW93sB8K5FUWinyzcW^4GP=0-K1ldTthbXLgk-sPm4MN zvEGFm>w9qdrpoo1q|45Keo%1y;h#47d0&Vw-#iExn}>#m(&rDmu}Jy-UYuS#57^?p z&pu)u_iAAtSWo`1uWz1szBU>C&$)Gn|8Hsov$W22@Lr4Kvg!hnaP`~^;a4ZtY<};~ zhYv{o=x`!LVS@U-aD$P^j#Zv4!7vh}2M|mq?A&i1ZpwfB+$c5Fmt*7+shki5q_wn<@JI#<@YpF!`xQsa+Fj5n z@d3Y#m+Nc##K^ex#~r^vfo?jDY`Wc$n-;LIxBtuF0s=I|vf=YbfT#Zfu3BDHh4afF z410MWaXszXRh@NXwPzLF;!-X_9u0%4%9wJqqJ@Oz-`k9=M)w$Y$n+*j74UCH4M&0u zot#4sth8};5|1Ba;gOP4Wg~W?1m9x^`?UQ|PfxBj|8Adaus8)TcI)9ycQVSq3}1U%@r z@fk8ONX>D5v>Z>_KOnb_KWFOO+nGd4GrqQIp2D2evycIU4+@3^HIziy=RVR4 z&?Hq9Gs0z9PcmFqZ$^zv7Osh#87TN{gF+|?3aD?jRq&p8-mLwhCvelM*<6zYdp5BDCwwUr_oHln!`j~YmPw+ke&W2Rx zh$J6$c`LZk+`oES@&*w-TIJ06Li(yjEd<#SC`1GcpYP!Fo0?f1cXlbenslMnl{9w_g| z+P_&Mr%d9s#aE2tx@3s@0}?C1y;;Oc+FKqdEfEi{O!G<~2*awy=+>tn9YotEu$yw^ z8O^1^@skmZXhqybB`JCWXKQ(==>ezmakp)Bg|@!m$%B2?^=1i#t>+NnR>vq`#Hh60 zugH^6*Oot!5*m3FMg~0?f{H~e#baBEEsd@Wt~dDLwvc^qU;Q&4v2m7BcRXG>McPCO zc{Q5Y!)Pkw|3UGMf6m77%V49n;!lF(`Zt}e3;DTK;bqHI`jbZUh~}uxMk+;N}waTT@O*BI=#e7JTB@@ zfUIvv~kU0k+IVEp}i zTOaTddj7&kp!*0{bgA*KzC8fhgLhd`LQUR(fqbXgr&ZVg}HEjlG-AurDK{a4Gnv_oWbocvXBX+ClH^oJ{K%% z<@r@#nX3OFC1JNbWg4c~a?=tlk4Lf#QWeu;i-b5)Gepz+o!|L|Y zhrwY+6k+4xIcRIS^CVntIu-(vT3HI6e_ZH4ncn=}kSsnV#i3?{x-sdXxb;%#ancdg zcpXdl=;7K(qF_kb&%?T?SN;!QEkl-zklDVIhm$uAFY`e*<`Sf;YS&e#w`irp3{=7A z86z~lM zMklxcylZb?za%ZRw+3Oa)#4=tl(d_jNx;?o?rlvnK&d4^D0naOS+ajLz{Y27< z7^CSpmqo(7wGRwyIR}G(^AuCl_aI1(#G&$@ zAtX5Q`)3a{So7W?DtEtt?n8kSBh-hLLmy5}UmQiBo#&rvYGk_3i`$DfT={(X?92v@ zzbcb_^YDG*Ul!6gy`2&2621Jf0$P#N&%e_T7{~YmRO*3_(dEecx?+@x$ELYfACLwz z-~*5Ye$EBMp9k{IW5fAQvY(&Wjve2QjDR595mIF;bd=S*q$jpAS^FOv4Vy1-H}`fv zc_91J^}9{P=QXS|d-Fn5zx=pw)+^gw_>G^0AT{HY^EETlGX?L+sf!FvcAZJ?r6n>Z z=m@is>-;{quHi`ga;qZ6MrI2|$6(2)m1A^*5rn+Hb?q&($mw$<>e~6dP{;rAIsKhh z7?OtrKb-rw$FTVUT z7_QyO4~2dC;J0VCeb?hz23G`s0b+cwaCGd45bKLIkI(*RFMxMPkmdY|!qL)w(B4aT zgR@uM-`4GniAC*wznWqC=s4B{3F$38A^~zbvDQ?Qu1XG{B9txciItKD$JYF2x<|f! zHK(LMNP=ace-d?aTK@}%V{oEC^+$kshZUNXPqYTCk7ADRx&KbYp^QQ^?O^rAZ7y5ck$v| zkDbGc*Pi?VD7Pi)gFmoCDX9;ta1guGGv!OvrW}@NgZp#-oN7_cvjA46AY&Z$m{2Ug4SO?w%*{GCB&4E<(aR_x&gb)vRat)3 z=Z^s2<3Hjzz>Uhsr^g|b(0frM1IZpOpX2lOE_ zcU(5i5Jj0jBZ-!qLO*IWj8GTq!L`GZNsg$K`$+2z6jElpDV|Yv`KX0Io$dIx3M71Q z!W!}HBz~QxW6)^k0RIl|FD#qT4dq^|ZJ%sP+16r9a6ezD!dulLoDHYbVt}8~EUk23 z41-Q7^!4TUK1lG#BQXaZl69Gm!b(yZEMV7cDJA}%K8Hud2@WH;jXyKF_VV=ShWR^E zev#9c0lniF)4wTC{JkapKP_3ru5O?X@bM7ci<$JXF^QF*7yn}e!s*3azF1nPj}F)r zH)J$tcF9cX??bmBf&JV#3HO2MpnO!O!nj+txkN`Sp(A z;voHC>GF1#FX9L<_X!u%@I%|_t32D-4P5B{Cs>~Kh3xPTzLI|1kxLR861-3 z`@*C74e@}gOr2N#5vxP)EpB>czobar-FHglr=MiPPQeG8^iyq1PX2M-XQ*i;QVS#q zUQ9nI(tJ-{e-z{>8?C4&r*%?B;~4lDqHOWVk@mv+u29yv)T3C47tDRDesFNGXep_7 z5J#lV7Z-<8i&%M~{9pgt#G6z9wU&{qs6*$^#)&jEz)btYMwpvH23v81{2v(}ur``= zK}7=6LI&mGJa`3jZ|-9p&`;&FdG@2&;qZ$1iB=UWv;>X^w90E-LB6pH<@Vez=~z9p z*1xw=UG1mXkj)D}(7WUA2CL~Ee>w!L)0D|X&@V-SPMmPLw&@auElSu|sqOdS;w17? zX2U^J+kC@*Bbrb)JjhUcXg2iuh_?uVlbam23Q(`V{+xD8j`{0FeR{4l`0L`HS*PIN z+={3!$ZHV6h8b=QzW#|s;5lq{WGV;Mnx&V@Zp}gseZ}}Sc}V>|eJv6=AqF>#es3eA zX?QI3!W+@x)n6oCZ;*OK2z5LC^X|atUAqF0o--11$Wz*AO%<6+n;L)L5#Kwhh^W*^ zM*m!;9rWQ^R6=gLjFVUCr3^pH)~_SXhg~$ScjuyJla=pnEPv3*@B%Jzx`CvQvE4k` zN(Q-1WKcf8w0F{V1Bd^5_1k}&wg26PIepzA@OZ2NUf^yT)u^!wli{uQ^*1Z;WYLZz z*7I`{P!c4x)TU3Ak%sfgX;1^W*>o5uO{zNP1a*^@2@NI>%QRv#@H+d~cKBz@W?dQ< zE4~}N(g577;PxKpQq6OmNODzf5->c|HgR=aa*l{JM4SpSd3wwAO3;f<@1R*vC;p@z zu%!8UR`dpKb4b*^{{qDYiS1eYwW;dOo7J}44=P~JKQNZB)@v5BE{%VF*{>>%r9Ri| zz-8a~yXc+y{^*y(b0%++Ypx!)&i$no#+?<5@J6AsU1SZ3dp_!L)~{}Txb-nHQWGUb z;_MImbsh+O+!>tcUsDAksdT$t<=!TpRo9%h9gXL1L8wc4~o#wou;e9uY96R)nO(BCTgHd~QO{$<#S)FLwIu=h=O+uL<_w=Korb z2O(3>Lhl`sN5<(3Qur)1>q%o?0!lwxHc^rY_v!t%Lb%wpx4~zYe=}FV!y!~!BSDs`YL|tYD?{tAYHc#|RArowd;J7o z9c$PtBOP!)%hyk&a#;M5pg{!qewT33?Q1h{lvm;JHy<$wt+nLStX}V#m zt+D-Kj^{^?X#ZfZSbTn(D$-&1FaH$DyWUTV{`0>i$v=CS=4|U6zN+>9Q?Q{D7DDVc zrU5z;xq)hvUPr@Dv~t$fZVyCu$?*IeHZ}W(4OfR+f4v^tr0fCSVqf`zUd+>I<=X|k zg`skn`-F+1daYPXT6m@(1ySmVRP+CI35NBhtJkCO!$6z3cX2hr)3jN1*hBbUFml}| z$~69#$Kr0s#PEb?xXa~Cost8jteIFDeckG4)hFSru}VEn@w)a|5|+9! z^CFL4(ffnbzaX=re(&u5#m!p?Nh|~z7zLOJ*~LDCsj=#R8xqLsnf~Qdy1Wr$bSPPW zg@tnDznRtkHu-2v>G^DCw#bwt*ZX=R76l9>eQ`cG?>%oZg>%}sTNx+a{Lm1a>|@u} zAK4XQ3JKY$l0oGj{@#PC`=e1U&PsRr-N4lB#q#xE?n>M`(kf7_RBs^EyuN9nwYj-) zE=$c2a;x}vV8_!={adFZv#@W^j#wqQ;CuldWN>R%zNqVCgJ zlvphK9sLqQza7{Hk~0AeEd=LN=38b&_?+RFyT%vC%egZnF{jk1$_aE)6r;lfxV2DF zZRrQEvF*gb#G?@>TdUl`t@H$^9~s?)BR-eoEt6+^*$+j)H4{9jR>-=0lvpmSeUG$q z#PY^fU4rnE6wrw;T<@&ap0gDmttwOhDL|T~Gw;rAE;cob=2{7YD}uXSGBG;054X~l za0f{VFG(s^X$pokKQ|wM@!THj6~7YFQ}=FY`dSfGdK{jmsOkNDIh_3|q*A;eI5Q(g zmVCHJd{8H#k$G13x}sEfZ=WN?Lx(~96R=ovZo%dHo2rCxS`s87Q|FP3PObXultGh; z#$(>{j9;4`^T3m z!ek9}(~uYp$H=f$swdZ`{leHeruP{ko+W?!+M2qlwJTCcv6a`CH{eDz5=w%$9C$VA zIwX#s9$pP!3+^dsr=~+WYn+cykjo|x%%zewZ5w!ZO>~%pBRgg=MlJtGW zYAy~{a$g1*jSpRSBryl&L-_-z%|9^v-MZf zhXo4oXNtC8L$loAJie++|MUjd-iAW6l#C+77t)TgZ!zEJ84U|?j)TIk>y>1M-tyHm z6Z&L!o*`_yB||@F1VBhXX8aAy`P=ECadiAj>UYCn;Hkc)7Xl)gXHNmX(za$btd5oDwg z69PCZ2iUS})CCXvb;i0eg#c!SlRgu$zvJ0inizrR!?!y!>MFu~U${ozr4yGU! z4ATmH?>Ea9>4he2_Y1Om$i|S zhs4#27BNDpu%Rx`7jew;iMa)WOA^+|GR2leohwz-*D{5{djd!)Yxpa7)RPv@4$lfvbl{RK%cJ0j=Wprxo%)b#+ zkDBOM{5Lni{8n}NcMNM_Ny=Uw&7+I(JT|LDi2OycAS8tHj#pcU*u1UXis8+|47OUT zoP-(BJ^PqEEJ>ek?ZuBnZ=Q`Z+9{!ZarTyOCjq?{xjBwz>O>@bu-`n7ktGPGrb}<-vAQ|3=spw{v3t`XVx*Zx0kXphkD#d^7tHYD3z+B#M zTi3i`KY(7kPD=W`a`Ocz(oODe3~XW+e4Onk@LPTg){Ic~kg2@jrSk1#FaKY^N(m!`1&UYaduDS)h% z@J}~gE4goIf-=%h!K$rQqAvyU2j)5##x^A-Gvuc*`4#JnMaSh?MKupM#}lM>eY|A1 z+ZTmF`Mh?AkSzU{v6~v8bni$4fy@CJ>W0)lFD|nYYRrfD-FBUC5lO&IS&z8S+5oE* z^XJAVw87Y6BSTHY`Vo2VhGIukH6amhl3X^w?mW3}aS`vr!PdI>WCnRoH-@nR7sYLj zC8f+NcmlBBQgtU$9is$4y%nM4d~N>}Jlqwe!8~?taKAVa0-JBr@(}^kZt|?1T4R2;jDp*en0lV41#Jhx-I%X&cJ&~_C zy|d`NP@p;Y-_fb~+wI$hu8xOm6KBr!jHr4^Ia4V zIY<5~WfMC$rGE}H`{A6gUj8KXr#(Faw!(-kEWD(nBC1|EB{bl_5p!(j{g-q7KN9#B z>f5l03`?78$sES*CBX`LrcsbEc^|%A5ppqo7ej}WAHS(~P8hazs5Pixco*)#!NP!P zYr#@T(#Lna_a@GwA5kB(F~lfLLk2CIJ$6IKTS4(&w)5%09J92Fnuj8=-N*wZ23R>F z*l+!8l=ZQx-3$c5fx$9dU9w?@9muGYAho?$ZPvY5i}KTWh_5gv*lYD&~F!ms2Zn6{_yV?+Orn=39A!xWUbss zguM=Ylq3_2ZPz%tnrM<7Xy4IPq<&fqeiNk;kH-t|hxC8l8UblhSmBUUtywrmq1E)H$KTe+8_Oo!^cg8lEh=#Wl1xpO8}K^ z_8^z5G**Z(gTuy1i6WEEu|y%0L0lstuD2~v1ri1rkICe9RcqJYl^DFSj4o>RqE%3k zU`2pmA?o{CZ$`FL5lq|WqEO{SNrfs4_%b70q&OETg9<7cN+8u_IK*>v$QCLf(t%@Cg0#)VPwJYd#RyPuCE_6nJ)FIBJ~)OD+ZKb`N_r6P zcwQ)Jyi|KbZuUcGYr0G(b}b!&TJW5}FJJZ2yme@Ht|%?U4JTQ0YWnav*9(9O9j8Qw5pG6%acBZ}bfI5J!Q zT&fHTN~*XlslL%gChpg-AlE@YA+*8JHj3;FgkgUR~(ig9vl35-ln&?rCb$G}LEB^fbZsj!8o;+-e^L@_N(lo1&v2iAsxMfht8% z5vUR1W4;ZE;XQvEAE6(T9)-ur7oPW@vAgyt+>sFa!F}!Wzga(J(Y)%Da{bG%GY9|9 zTl_nd$ukIdwI>q^`GH}NW1qjCjv>Ap>3A1pxY66Fw;vMx7kk7!^zbm^zZRZBksCj3Enp;lMGqLy>Hcx%N=*Jn_r>OvtswH$~ih+VyO@-9qkZ3cuQdRw3^Qcp-&RAY1} zz=AZA^mj8h<_C|lmQf!Qp{$pNx+SB{0q^D1v=ZpQ z=5t+47QbS;c?1MnZYGR(56n@6a%How4wrNIdF~d=Hoo1jhxWVj9AMKQ-uMT?_*zK? zW!^)z((pEq&cMWQ=ecyr?o8!aYw%qyut!dsYthYFPYsU{HKifa_|IMd)$Qpke^|!63;I*s^dFLlTSk;?fKp|K&-Tm+LVE-)V=o9Yf-5i{*$3#~Q^>7a}1vww68oaNsN zG|_iXFqN`N)D#NOPzLWk3SD_)b<0;;F5sF8N)>K=2Ft)51cG2uq0Yhd%Uu6<3;{Y2 z3TFROl^x+X!u$xDz+AsGohIvpN-?8#JNK-?kLC z2hckd7Nz-V<{7L5jCpIX0{^<;Jp`#J8p-_pyllBfc}hiUaRA3aZgja%z9)IrW~;|e zXN><}ZdmjIqTM#tp&lI(x8;IuyLzckfljs!FT?_v$})|rNWe{NFcU`7e$!%8%Rz<+ z&x$*>^XG(oBJy>yCk)zLm4Lj`v$?KHKz$1khAp?O{!-{q&qY6Zo1h+BK+3_+wEQElHm- z9If{BEv$~*n&S4ohv12;7a>oRHPofIKfA$-Bcp2Ds2fyvp|?Jt9foAiygFf6^_BvB zeQVk4`e7E>`)##u(y#PfOO>aYetGtse~sD{dP*kUZwsv7Vm}%?DM}ryd80uP$m!|+ zvC8h=&d$LG=0H(gTYmfX4x2)j+N5lX9O8X}Yw1PHfc|*x6j3S!%NaPl=BzGc-0p&W zrj^{M30<)~v3WdiFO{r5oKeoZf-OEfYv+(i7$zsGv!w^{&=r&XwDQpb#O+wu(w^>! zpoo}|XKp5q$`xTID7-GZ%p<@PZ&PT`KjvrrI!Id1Hj$1*)*o}uYr|Pwrlkn@OmD7! z;J)R%FPmd{unRe|5qo0D14BzK>Gt7;SZlsMP(T>Fk(~C$>U!X2Cg0u_!g=Y*+mgE* zWR12TnJxfI{|ue5(@y!XAv&{-idybX{hW`9rhKA=%oM)|;$@gMVrSaiw}jma-A!J#QGE z`KcMO1TJcF4GMA8a>hi0a$Bu^H?{aX3EX|ouO8UDw|V3?fJbKvF+MiE6s}SHR9Xq# zF#AEGE~phbftJKc(H_>$SqJsvx3twI$2Z5Ce~n9vW+lTxBrbKsjH+FIbf@c-(p0+7 z!YkmQ+Jg|j`}OpS8oM=Xe5t$%Utbyjkg1Z8uGC@`y!!0+gD258Xy%hPn>~F1Ift?` zmx6$7A#MCu^p@{E@tQm8A~aBn6x5){D^dA|*!8TLraPs7ztja#w1*=;XZi zhAndxB%iG-r`%sN-bSm-R^H4NDZ&ECG$-3b_r1Y29hG(5oFL~QBm>meZ%~qB*$-K? zPx%|%uRS7lfkLV&?y=lgaB?TNq@-hQCYW90Ljxs34$|Omi z(H9$70>Vk@6;&M~S^yC;Za5`MeIN3yqg?M)ytk!>C=|6F@1c%uS_&1{6^1g%CF?-E zi^I?M5Sm)U*cIZeRv((N2DZVql%%C_FgBp>7~aJaK*bi<(&vSk_{Z@qm+h<|vVFujG@4T)fpW*3uo_KGXffAmcX2!|)~H_C!DTP0*1D<_S|&%9 zJP&N}nwCFK&!@nL6QqS1p+&loz@x3P;Zh3A6c>(u&@Yvf#(DXQVodVH9SOh*0lIV0 zk25$I8^dEbj$`>@@Fxl|NUbF1EVJwIp2Z_Rs&I`ZSKTg5+&7Ps|#Ce8$)L6TTU?F$aJ;S`^UrVqLBCE7DEHh>qzQc-MD!yOvtHLiW+oN zhNDlYF_4(A-_lNV(lst;o_IY|PjhDtVy0P>i<^zr_?a{W3KmN$U*9z7=GF^aTQ2ow zmo6R4^%1SK4UvTNZ|Be9e4Z2E`=LEmoe~JII#!?MWq2tlit5Wx4>%kqgj?TlW9rs) zSWxSOo#@iBgu=tNy_bddQy1R8%*>!w07do@XZ_2bZkHa@52FK7CDNE8Hdis3NH_1H zu-5C~>ePPk=gK-KrRamIxvo?E)xacHL>RhoeBcZ*XL+l5&NN^;ba#6g!R*9TP}R9W zTus0_P`78YALrLj{M;tlP5C1fAQ^+fNtI#Ja_T3=2KF+~uikGlmuPp1@Eyqxrkn0rb+pR>U6iVp zjtF`78VNt!kXKP^qX`_-qy75^vHv?-zOHF!YG_^&cZjyl% zL|{*OZ3pLVvW74HRuGpGfbkqcGiSVTo6r@umO{Y1P2p(Bv#Z(QDFBULcdR$gl&P~3 zdinrW`ZtNft_2l8XWk)C=}#zUf>gO+jd@$c*$6AAS3 zJnNxp`Pn<~kMWMZat6{JG&C)dZs=14vE*o{RumZ2kkq9++e_mDB3$aU>Tj3&ccrbc z6R#prg^*7Dkw;Ix%-eL$7W&lLcHGAdDk=Ki%lI)BP1Ay*hJ6(5G4tCK;=>O92j`8mBNyjf*5H@aWOfk}+P?ZT*L zYqq_w-lvlOK&ptaV?(-MtgDGM*)MPkSnnH5n`(R66~N^%G$TRj3Kk%*E#7tCT)d0U ztJ;?m#z5`r?TlA=G^maE;$iUp8o;r1);Yim;h9AZ&+=qihtZPM&4_Ye3;lCo zBJS$SxhVAOiD?xuR#bn}HVF<^Xr+VRH;P~tT9ICtOg+Yf@|tXVh2z_xp>8KKhcCtH zIzu%Gnn$Hs6L*40m3e_;bWNj|3&bF?{zMUHOdK2TdAzb~pcHZQeReR+CN*j% z6E-a!!ZG*(Z%WbL$0R3=RtdPu8X%}%3}6MPnlyPbjG;-ii}7B&8p9}xxIBHWepVjr z!B(*+AFTL(NdaG}!*=S9T&m~a->09dEdh7my6Kgk=-t5_0{qo3q+8L3WPJd3v{G!m zFE4L{w&fSc@kz>!@Y|nBY}=d)MW2xLMXHCP_%9aH+zEda5~|F}VulH2!tJCr+j?<& zbc>Pv=EDS1!|{f>@EJmEFmB--1W8U-0b7-!rd>XYt*jEymUi5Z4GoUL6mtIje>PlSNu}R=Rg^p z)X@t|4?}Rum5IiqLy5SA@!V3IAiz8>=hUnfqSIMN#d68W)rr39gnA6BY%g+kT+<-< zIMql$2rAJ&ESKm1uJbK<0r1A zKpEH^Sfb$c6a?&#P-6|y;&Ba8Y6Ea6lRde|TXkI~4GiqFj(2JE9f^M2Mfqb)Px$fJ zN;g*8$a~n~-Q{cdCcmQbpn^r+vzT~l4LG}m;tmQxk<7-S-T*`|Yo2X5Df}3~4CfTkMVfOW0e|V1 zDs-iaN-sYtWSo95wxXr?sUR$1o5t`R2DQA(XFMIl{=_vVfR~ogm2nl(F7+_si6o9Q zhfTb1y+OQBSR?S=-I#TIx)r6QyO-|lHv*uga!M)StLFP}@3jb|j{qH0=*VSAKQ3Z} z=fStx=+KE=AD)~68l-?GX-)KA61WlA^2-_eEQN*M&kDi0a9~^g!UnphM&4Z676~|e z^x;+*cr20oL3xnl7Fi>4nKE&QC74@Rjfk=1Tg17(&VDMju7%Fr z$3z@$3-qHodC5Y0mZTy)tdfL*f}tS3x>9<4*2ox;=X3rOD3tc>#F^^}dtTMjXID74 zbuz<~T_=T{eLiSLczCd?%D0>_P7`#pDo`Y^7jrl<4Rl*=q1OA%7*kV=4K7E=DR~uz z#bPfld@Q`_`+;(mzS_#xfsD@0M}nooB@amP*)S(&aS}}K~I*hnI|A|+CrY$SzX45eOR8q zfM%N)g}KGGB_v}`}Tn-c7)83IjSpwn*VlDI1K=~Df?ep0=`$u4}uGv+af>#G3b2RR6 z8v=QXuBBcR74Nnt-d`A$8GAOmNucVhU*(Ty@#^jMg^U480dwnpDF&o9K*Rt<49)5R z$dRi2C%cGTqGMfN-?LJ?yw!mpdi`QXoh?pC55#`Lk?2yJBK-hM{@{P%jyV8Eqalr2 z?K6mYd1a$G+;5{UfQ&umwD2~#gqaUq89<3N;h39&CMdY;({1)=h~7IO2oN0_bOivz z0Ukhp;MhSVY16gz!qCRJo+ve`W?8Xs7I^Lsz|AC+Lj6tj(Y)Mk!b6eSe!p!fIuAgR zswk8uUA-TECF3Jn^&$XS2DmL)J1rOu_43IZBGy+~_X8TPY$veAusyIG<=;CE|F?|# zcBWIu$@QH2p>G^$e{G1=!=hzdi8fq}2zuRWf>&Y38PVKN3R<_6TDuh`J+*N@ivAM3 z52bSI02$9`0ky*gmdn93?2mzIaXD?bFC@o19)J3AY~n57gCb;bxNgPpBj$i=3rD*3 zL8;SS)ow(k!Vf(j;>V9%+g@(eKIPeG_oMLZoBwLpVLiX1ylDG+?tGZXZi83X?^{g@ zdh5m8`N@|aeQiL2&u^ARL|9P1&t%xb z1e~D9=jYXCA+#8mfS*i%8WLzjB>nw{LtQj_C^qa~*ZtYa(RkgM`T= zj4MNQpT#!#>9v#V*@8@V^@I04*2;HRnwGreOt;Ex_rt_oO)pkiOi;!O3`3>RL>{Hh zIMNn3&kDWO=Ho?AW!IZdD94vQ#64gY>;rl|%4*CtUn;eSky}%3u;KDm25fU-yxb)` z4~Mgk_dTnzbUBm#Y~)4t%Y}spJwL9n&pbiweyY8f<3v8a``n^YdUBWRH0v>(jK%LM z)4v^{zkVm0Tg`4o2$RnR>J_?IMb^msDu~BGt2=!b1#mqY2Qx$QJDoBTSoE2q5!m`L zlYkGS^^mx;+-qJk>vt-=E|;FRRe{mNESOpqIJQh|tlGKC z3w}J4jEH|IP53ch+IYz^mWcFu{**8zo}kh-_GFQV((c9jEDjQWT4M9ut+@gP@S_Iq`Uj|)JOD2-4rb#(8X7A7Dm|B?e!p#jR5D zmxfkyHb6Y~1257}$%dCt(p=S6C1M8w%+eRt>8^sMfbz#EW(QIML=%f0Y`dNpXH)p+ zOC!f^Arim(rI&vf|M1;@gwdk^k|jhh~=m;HYyCHtCv)zez(VBcII!zf~+86#{?u9VwY^PA~)p zN$q!a_8}qT?3!cFt=Dg<4NsdM5`Mh1^qBKQL;YwQuLJluoluBLw`h?@K~{960HSxyy>4l=<(J1>A6;cuh+=M>wdjVaBglixAGQhgJ{SQ z?!PX_=b#^hLzW`Li?1qY3S!vV(bci&f-y2$cUK#loxHKm-%8FfL%lPuSV3+vF!xrR z8&(YD_|KAEZ+oG_N+g8TH5n*c7G6|;_lyL{!!X4CxDO;~#%c>8?CcXlMakhx_a@X- zub9gbZJp)T`?`F`H5mPr$Y-K`Bc{%U!Rn2HhoOYpO5LrM*p23C>WnY-#QJTWeadd! zg?6h#GHDCcrsOmgrujH`A%66aQfp^Hoz%Lm5IMevPU}cZ@E%lc`mU-VS2WSfu4lBm zza>JZM!zw}8y=?Ngom=%$)!^g_85x&iw<@bNwD1aQl08lVGMg?&9Q-`?@`tm^fR}3 zXxg|fJ|9|MG;@q!|<1=DYF!vLr~U8?RrI z>Vl~$oify8GN{Q6+8{fd<9NEb(OR}{CtCMkmKWzuW2}#nmJ?^E?vv3-d!Eu`p+JvV z#bYSjdjA(;!z69qYLC`>A#%lv!4Mn=u1gTF!n!|y)cK-xn7=K0XqIWOkS^YzTnR>;9QN9Bg2R$1h_w$v zqw?YObXFiqyPHmFxee|H5<1qw47ZI5keg|si})c{+QD|+cdp)e7w0F85VB1n;9Xcw z|8e1vu>bA=aXa-=8%N2c_~U?8Q}VD|Am@~rnj})W-6a6P2^mqUl29x&?+WmEjKe## z>1+24QmIr;(Sq0(bLCQ-7G1N`d5zW{a?CTgc9h!ix%p;$BXcrcN^J<^wv9(=Nu^D0 z=h6COKI?2PAuR3ju)#PDQ-xem7nLsg2#|$Y)5EEti|3VYYOS2P0_0`8mN&K|Xb`js z6g?;{c`lb7rj5%!ddyzpu9?XajWVqd#Bip6yA@*6Xp>+{1Hi)9M*N}8;=uGBa}IRn zykwGHR9if`N{dbL=xVf2F4vtv$v$p2cN_oDUH}gzJZm^q8`AO&@WtY$)3)ACI9~t+ z*G|Bs@z>K|D>;V2;&VH-eameM0SFSuyHM=j3dUVls-IM6>wY>8gTH?3-0*aytdImi ze(Gjm8RJfg$^h)56s*?RGetJ^=v=qmUY%&w_+-AjKQ6(Q4Qrny82GA!5work`=SE) z69kw-PN_ndI(YaL&j$SlQj`R`qArZ6UjE|#o4__z(V(xFA4-Ls`Qo0Uz=3_`rm%ip zv5ROm1~zLe9owj+ufik2+n_|&nl*o4Cm&8C7_hzQPxMI7gbf&)Ajqy6Yj?C6YBo~2 zHMD_eP}B2}XBy1>2;q5`GH`r1{m0O>co`Nsdep25xc#~1)s3mk)%7Twqx&&1KYXI-Zih*q}mren5q{a>V zDdC)+t~y_|Jvi`6kx`aEvtcA@{-Q3$qMs1C633ij7h!`qOWtjvM13$eGHxr%87Wmu2{KD*J`jgrYv5!7=%ZezsNwkupRJ|zAXhzQ6OXX`#k$f4 zO^_L_G-3n;lWav*RR4^#CNqa)7oTF+{r6=4&IlIX3>o5E6Jv=`pN7RcSN2G$H0RAk zdQ}-MAt`~JKz&Gp2E8O}gU4fBXQ$tTvbNf%`dED$l0Nvp8}RiC7i>`c$J5vXyzfBP zP%vOZn}_s5#(3xDU<$2amq&xh<5lFNBjydReBww9E1@GNC??_3Vk;DV(iQnsz`?Pz zxJkaJxQWa__&%=DB>(2nAjxU#u}<*mvMO$>^If#5&+IwOB8{l7d5#7_GGJD8D>v4& zgkq0j{N>T9k6{W=h^|T;>4I@zOq+UY*Vu|@Xw}Gz6l=*?8+x)VS;czT)m}*q9<|w+ z9tcv|(bgDrOEwb&j2q6GdrML*KD&tS7(3kMKKL~Bz|z^&LrG3CGX+dmEMXrlM6-Rl z$MqescEP5xet%VJT0GZ>mN)_ucP`h{KE2ZfuLjbeh-VSoymmW`Yu~eZmIY+S3BR*{ zGKXJ6o*iC2_=y`70R60h7zvfFJvA_79SF5db5CfOiak zJg%eujyf|(R!-smE(R@8sW|L+PvAJWT8Fp$qVIhOW8p9pHaXzl=05BB7dh2R+ z8ojFG2TY3Vz$`h8x9LB9pKy;v@NgYRYz8HmFFBZSgj$2^mo+Q(g=ac)Mgr3v2d;<6 zR{|S1E()m1`*L)srA47C0VhI%P-)r za-Q?+8(b~jprcE!*)L(q!^oPRvCE4EZR*w3=IHcEW|HwX)3*= zn5jdZiK}4P_%)1<@H2ow>JOAXn+seb&dIB&BGi|zl^}6lj z6jwb_N;&GvL^w&M*d5;J(;IS;;WRdhTnanUh;P5FpxJP&i*3`hF8cx{)OUXC;aY=) zHEBF{G~nrqwt=#9!@Oki$E}Uhm#k-JCqM~?8cB3mo9nE1>IrPuOO?64VPyVkk2Z%> z=`BUA$inpp0&=9Lds#O6?k}BY-{c+vJs>j8&nvy60WdHJ+SViIx0Q+N@B)Y|1taQY$pQ++FyO;T=M*4r)`_ibU(rsJo zcuG8_0+tFWolTXX(n>ERsHl`80ycoON)Uw52nZxJNm+;>tqMpVL_|lKwi8W1t zXx4)Q@D+CC<{6572B-3}Xn$3L%gHMzdwgXjFOhDeU)FqM9AOQ_tA}fr?{-{)?*K2g zTUmY#0?_j6hk>k!D}*HSE815!15DT4GY6H2LzVW|v>bHZZCuxM(DW#>u_#sSVe$#T z+bU;J?2(gDFuE^z8TU+J@DMAExt;`4Nh-6u%Rrd;=YM}bK1}^lAVGibF`z^gAUBBm z!BcK=z8t?3XbG|>k>_#Wl-0Y=Pt9c}T4RQITB)Q&IP%H1XPInv_i6S<&m>_+!J~Cwkh0k0kz*WL{-r{b=_{o9)0Vfui zuF|soTl!4?^7<7yi_XwZB?-cKPh-E4vjN>!lZe}%k^54K zOGgoFCS#JWvu_0a{0Q74NKDMOPXJ1Ah5S>f>1IMlVPHx-|F37>^%?C(?)_+}o3u_6 zhx&kq{t$%1UoJffPz$-O@VGHHd+N^5BN;cPvG$MG#iqT;y@rul06cxwekQdLYtz~` zl?SC1(xG4RQ1jH|pKYjLJd!5Pm;mVS>WeP?k<{|`k2Dz!q}h@a%} zp`ps1nou&q20!$-X^O%J^uaY7)#jt&wL@-#7=n%2i&<{z5)r+}MOb3zvUys0snY6R zdo$dB*A=7sz$2+#S&Yq6*BqzBMj@^JQ`5393Dj2)>Bg}r)--%v{OagX%4IWFA$ z!6$H*O4EZVn^sX?iRtA2Iu8xj%79zfupZK@v0{ANg+Wm~ACRZq=4flB@OtOV({BV7 zCwX6Zm)E?CFhw5%DgeIf>YO=BtsCwa7sW1_KDtq7YeRa#vQchbzLm!m`s9 z#$`?$U!EZG713v=Biv!aaCW$rdr*C1oY7b_JiteMlP}BGDL5)cH--=nROMIKa#F{l z_S6x4*yr%ReFB#US;=?I_LIKt*qD1pMH;>JjsV(-Xih(-*c$9ATQbn*>}Bs(;k42W zF#HcP;d6=>0`2O1+A1r>h{95Gaqnq<{5rh>^x{=WbU(UB#1 zaa)Z|)ROzvKVXx#luwSPa%T7m+`4}fwUnEs$NQ!`GOU3~a7*U-Z=$d%3Aay*du~#> z_YZJfw{F;Ac#w4S=5L|kx8tARSPDF?Ec*pSyL<$in-^y(`b?sm@jOY}nrvsM=QA{w zTD32&omCYQ7@9GQ*vohJaa1qUU!$(#?(^u`SCC?kwaIy)?VXpEJDMCfH|B&qk}6d` z_T98Fy3`7+NI-`H$R5a>&`b*O3fr9Rwl;1(MhUN@KDTOH!8Lr3=SMFLg~%gEgRe8s ziTQHh#<-%k!;N@hsv!m;ZILDjIZEyx^xhWU{TyUlaEn1_JYaCfmg zLV@I>^pH`ss+3OUBORv}tap=L;updZ?3sXizjgYg`%3%PyUyCqpmn(T$m!iXxKg~L zBL3OKI6{j`Jg%k2HE3K0My$!`D&|MjsF9Z@`1vLQ&|2<7TmWphLRS8Q|4AJ&z;(B0Pd5T4vRPf z0%xtKvr=&p<(m%*I(+9}i*}&jw?dO$#qh;xg?Cwko3jQ|sb|70p`nWmo1$s%@!<96 zSu|_MmVdm?TLEAmF$(B5D_v+~IU8{g(e7yb2XO`(BNZUYXRmOhny)96gk853eOQOO zn5TNYu|-?wt;pL-{J98O{1%q6Ovzd#U$xCmlzm6+A(*%?FgW1qk53CUCAEtaBLpN` zMT!O6MXRqz0XPXTZY0Bo-`2)&$Kxu0#4`U7MgGx=U+8EBeyzw_)M}ciS&L*hz)GdJ zrqRuA&?a)!57#xeD0X(OC&#*{$5%yzAk2j*xN@(TQloj?cuPN0JDFJuQd2`;*cW}d zUf6ald-aH-kk|7Wf z^P99$3W>6O?tl)K<@da?#mPn4juau&=|A7Jvs3v7MHtc&mBrRjBo8^M;QUM*l~^a> z#-6yLvtu5-b7RDAm4H&HQ}J$ox|?!X6R8Z5q+v;SH2JPD`v_LE;`tiqVJ#5eyGfr2 zej}6N&nfCIjURlZiik@Lf}L|OGYZII_$+(U1c_wVXTC`jpZuK2eLo+*E7FLC8?ImL ziWp0z@Y$i7E?x*RbbE4K)Pz$q83m0gDdB#&=!0wEITG~il-uEAr8Mp5fZc*IBToa7e~Nli)>>8+(@jSW!AIx1JSeVT_z=n*pKj@_=bFV&E=FxwHo zoc<;6RSRC0&F9{KOWUXSMFBrD`Kn@aD6cUCw*)FWt~5MZKco9wz21#CU~_ZRfhjff zF34NWO?FB5L~hvYv8@+xNbYT+_+en74D0TC1>H>I~4A!TZ<~ueZ*Kk%;xI-heQCv-?+43DR0EN_jx0c3s9L9F^fa zt8#(&kf3)ZTf)1w)t+Tl6|@>M&XWh}lny$#NB1y%aXoj|>i^3HxRUBNphDqtP-xDJ zPqFb<*ennifTQsx@|=;T7m(fN&^vU$`$|Q>YTT|uTmmdMkw{%;b4sNYBGUZx(l`w> z?nvlLc!zo7-4KAvfCkPX6#=PC>V|^;Gx*~8)B}F+#+pFrB15Hx-UErVYW1)2_oBGyb6zk?yldo4cnJoxFmvKxW$?)}WVdJ;seYBH0I*+w=GQ;WxJNk3;1XP(cJ1Ou})wFY>^DQelm^P{lWCt-Ws+6+8{lJ<; zR2ia|>TwU1q8EG85W-SFA}VuJ2t;@3ih?|daA6g}I%g(?dv|(jusr0OjbcUmW>HTF)xDFFmy871zBgc6!-nk|Z zkH>D59QgDx7O5EyBzyjJS2C6oWlwss2ptRbje7fd%}(+-A}R5Z!{1b)HGS+W+ z9{#*C2%0`F_VgI7@8zeHgdjN+zL2PPVeUt0Q>4)fA;JZZPj@aDj<^>1q6xal=VIH+ zq75YwuaqgSF0&p9-SkLoo{xtkDKfLi_&ID8D2tq4e?@oBXoN-sR+`vXViBOsGZ9`K zP!KXbuQpe)8FIAc_Fq*No!$Wn`Zryw^V`I0N;6oXHjfyp4Ya$ht4&ulX6zS__ciAZ zS%Gw5@XXvq&T_#(7ki;5cOK=cEu~<|Zn2Y%DcliHIHL)I5R20KpdcYA7N7)gh4{39 zA>5&K;7|lMA&@q^HFc-**g(RIS#~5S3X^>9MlAPQ&rI86{Lg|+`+7XtFRPmcmMajo z0YCZ=g}XlT_SV#U`jTYfem|ryRJlOp#BjVK(c&YpC(f;$-)=Q5OTzEt1A0X3(Eyk7pJf)E{AJ7 zST)F;Y=$@F*5+jpDF>&}6&jL^8W$lPfD{n9^5}QoKN+0jhb-a~H6~x_W??hL9udg^ zS75{*3Iw#yh7H$-Ak?k@%I*Fe3I>G#LB9trU|9?5mOv8hBSp-bJYX6woIViBTb4Bj zX)&|_f09?>g4~yies@|=Sr9o!kIGsQ6UChL{D_dI?1CwgQ7W1mrUdDx5VwDR(J&+v1H{5@_Lo zbUT7dw&)Kwo___7Ol85%at(~O#K^DD(T}s7qitwa z#pgx9*{$N_*r6AI|7bfk6x%J6gIQZ|Tvk%e!s?Xs^%CikO-o_6FW43sM ze9hm*XL%rCJW=sx+5lmC?ywAFJst%r3g?0Zwx=sB@ye zT6e$r1?vCZ-2)Q(kikVz-$FXK(LRM`EGh3Xob#zb%_Ab*Ul$)vfiLc&`hC@;H*Jsa zvF)yy3p}xS98dl#e8b`iS>@)_>~K!a2PZrp=;MpoPa6O3zM-D#*W*pBIiuGRjQ=lZ zrj-VmSrHF`Cle^)!9PKI?o(wQb4hE?vf;&I=i@%{5`6af%V2sPw~`;)azfiK(bu5w zO@^VgItUoRDFm`_>q$G5*y=#zmmsqKGhjT(*W>jR+E?^sEpS5Wbz?b>z;2G^NLurPHO7%= zlIl-t+1Uw)M2LI3Se_M4yUzJrabNZCxb=Cu0P${?9#i#{4C7y55?An5vcx-B0cTy7 zYm$0azII|hG`)5*R-LU8YOhU=V9gGa+ zDjc;P6|7@So2o%L)5%Nsk#fYO?o8C4U_jN64DKbCJ;0%xbtHi|lj4NMsr9sEBb>N}29%smY*^ zYa|`Vbe&WDJt5F80}q%v)GtD%i;;7mzIsysjNgX@^)AP0J$qwv z9@ufqd)jOF3>vMIqyOaQTe_p01z%JF5k{pNR9fKDGusV`h3So>ae(uto z+>%m}PAmfn_66&v2g@b$j@YDlj`B_%0=ceNyfpUM((V$eKJU(4q~{Ap=cN~xx`rx% zc#`O^T+J0aEMM`-9<5>@bLmRfQ{sPWAEfhSyaGjKt8aW1`k4s^{J;DcZoP~1I8(}O zzIygb$r}KdvX5NFkE|K)RCzoZj9xBcV}iYoQD8_-1oG%(JJb7IdTX=?Rm&V9$A5d` zFe}P`C+u`isME-O>aWqfAqo9U^Ew8D;fDLb1-n*P<^+90jVmk7J03VknJWEqxNu2@ zaAe1DSrD_wP(-eqW}Te9778@_$#jB+d1I(LhH6DgfRRR2{C6qiUnw%0vA34Ssxl;) z?Ia4yzV`)5uPJ>olC8wKX4+z`jb7qqHQH-yUcE1Lr-enJkw@D7mO=U*rrA4r z{SNVwL?i#Isvj+i6wySp4L3T|k_=o^E1HkV%OBGkS^(bxiSXs`<3Xmiu$(`kE#CZ|p5={t!BdYox^lO*QK11$>T0*l;6Wx_m0X+HicH?PKCcB$j z4J6Df$}>Th&^)Q4mqu*qsXN{`7Cx6HmlIJnwL#wpWy(~8P6VaIq7|SUfF1oOwUBjZ zkMN5p*O%a?&TvzD-;zbySh!DUX-x%hr9+RGAKUsK#G`c-kX=qJQUV+Q^6G7$ph-le zn(KW^B<*9UxnCafbsp+!dyQAvPb^qs4elQp;R|jMd~Umb;MGBNouG_!9Iy`=Jh{QA zx3k;uh=_uwxMv2X41z@4S0jm03x3d|6iEL?Z*?x{|Ar8LJN_T{ z%ROOA+8wqE#z1UIohVv$qxyj54+v<0E-?gx5^R1!DrQ8J$J8Vdzi?@xb*Vp_Q{i3$JE=YddD7i28sGsG?V;TPg(7C{zQvc zid3xF-zQS3GsS|nGbVHBK3UYjK9NH;l&Eh^b&j&ja*iSvG@$^yR|!}SoR>9lg*2)I z9HfW}((kpz2N#tKs~92dF#Y7Qco^wJ2@q>{J~bNwLI5$^ATOgsa}c9|qygzg(oda)(+^0idBGy=QoF zt+;uU)$#2XnuNsx9{+S<+)9%?Y?Y>c6PXa9<~k8Kdft+Vs#`g$A97pAzk><)&r7EJ zVA&CKHtfzGz*aJF8P1o0AUfA@({Gjd>;KM!mwQU7*iR{gf^OG%Ol67)_au5~i75v9B2#>;Rou|d%jozzw!~^Ha9(O>p5?w3}ca8ahl24 z--;dANy%+D?9dDVL%;zn$3Nauo(asi+kr2bk@IqHJPagQCbuqVksPu(|>~@|u#xn2Wba{*#FOL$U=9R4qi-37xEW8-wRdVBLP*_p84c34~N{ z%NGA0RC;DuMhsar5q65I1+s*|=Nmx;Wdk?YC<(0#i*+?R=`f_PD!Cpg8VCq=?6;ut zkK@1R$>^&pD)hpHvo+0lX=uTyTQ*))>Y=g&EfZ%N&Thz(ig0dPBzTIYJEgo=9=x|Y zIjiYnD&HBbw_3i3t%??M#bZ51n71w5I@HQJJ9Cdy37`<@a2WNYj}4okqfCy-teb?^ zx*-E*Yph!y`0WZGvcEavLW+6cuxw9^((x}Gn_4c#gtP7~UKZUM=b8o3y7@erU3-*Z zs;P9rdzX;js+F83)a~ZN&!%(l`CCqtTQ5Y2-$abj-A_ZJIMdDH zVz(a83yBDb^T;9omHrj*M@GZdv!$jY_g-0wQa11v&93r{?IsTCXLhtFS;aG`GiE+3 zT9O9Mn_^BwRa#OivH5-qm>!xs;|3L^8bLxTAn*__<^~L@ovfgl%wFNyClh$3t~pci^2F{}5}9#Zn9bL4D-GGyJ9DBs1cbIV<< zJ)Z^(=$8XAr(_p4D4;j4!CgP36qxiv(l*BOGaBU>!3S`zmBofop(nafKVRu6!QW94B~Q zc+mn|rzgSN<3SJqwb?+I%&+RH25=Q;NqGMwmVn~ONTM5$cZl}$i*&={7`ftuDz@-b zK^s7+(fBle%`t_t>Xn`*YyrNJ7codgKQINlNopxn@@}oO8SFu^Dms7pOSEuqa}xsR zAYl#RtfZQfcsib35@_K(rEPxVUwnM;S&^*jso$gskV-)v#xXBxavntV)=u;o+NA7Y zaJa|4Zi1poP=! zfR-;tKcIAkCeiV`v1R%=Ll3IaaIwf17=RrX6Yl-4k<&5upLM;hMftbzX!1Q9Kj$$~ z(hhEc!b0nosut-^*vPh<1fiRX9m(hJVq0%aeuSS>*G6B&&Xs_m=^AUO{e5bGp;w~h z)^>oSuH$tiWKV)b$W?Wz>IzVJ((&y#W%sd69AFD-lx?30{C+V7%FvM5wy3 zf9WlF6=R}iaqTMDk<)1FrXgT@$UQyt5H6kM==7y^Z_Q@8S3BxAu~61cx(z$K0!wbK zO>sUy5BmIJz(io9I_`v2Pc@C~Z&JFDozfXiC+6~gNHYIo@10N0l{MT|NqMF#gq)lE z(XZ1DaLUq>$iEz*JwwU5q@YLQSgu)v73f20bO?6sqZe3HfVPeN-^wwUY6FkN@=#i5rwx8w_=Jg!`O zJBC}awaH&EG)AI7@vNciWn!MSZtE_C`I2R&X!Uh>GNbzY&dN=xqV&kXFJh(BFYYk1K1e=kv)_293F$TF&MUUOCC-wJn zDhB*ClD|AUKaEALDTi*U8eUE*bAHwdFXm;C{UP_~ut@BzX6?iH?A^Z_ zzGInakxrliA*ni+(Caia^Yv-)W*8jG$r03TwoneWNgK9y7~LHm{%!*e>f8N|)m|lq zO|2Zt)(f^!Jmg2@lQ(?}4>rA*DKeA-2K9|#QMqw)P;zo8u6m)U(j zJ^W><_rvefLUx`=oVoVw`FH!zrCR40I;xkZ-MSO4b$5O~`hiS;Kv@f>KzvDg9e)+(6?!#&MZYJt>Rz=~@&Ah26dM^{iMy$CO706kuFiIUikBQ@g zdVDm~hz|Xyq2E7WboqVxOzIzw0txcHq~{9R`e}Tcaw9teObFVCV$77MzeK1T(by0} znyi$JnIK!tX_Xc)P2HC^#q&?QQ6Q4v*4I5wFM`k5!=jyV%5M_)*Oo}iDq{9YTt`PL zCAGAeJV<-ah-&|?zFLG_JR4=S)%UdIo0c#+Vxq;y3Xj6fay3d|?4a^NH1qcT{8WXz zku~h$D8wo=j^92UrA5jhdz+KKD_)-IVnwc5%Y=7w`_YCdu+8bhEM11h>$3(Txy2mj9jr`nj;kIJal9j81iTfnwc@hG zE4|kzDgD|Xr}HCn>>HAwiRaFBYGtEL8&HIPsFq7|c4Dst_bw%xV_0(MwtDd}4 z^3#_SU~$is;v9k>4%x>FKlhkpm7(LqcZ2IorA$;Aw>E5eWsp?t`43L`_y7F)Zm-Ku zxXV4VQfS#pfALM#QQB%BMD3l++T3-+A(ogVWhUq+yMD*!#LSMp=*PYq{%E{$n0(Mv z=A=mo6BWxZdQ7FzO}`5;SNygiX!=yFdHI!y>qdU2c0}z>n&aQG=Wm&CCv8kf?0f`< zRgT%pR)Kg{!rZ6j>gC>~Wqy*T2XhQh8IYPYeYG2MBCA_r6Fty|F^*TPm3qsb$r3ZR zoW-`s`5{K%*O_h&;La?+^mjj8fwUL`!>NLMVBzJRFA6a)84vS_OKxi9*AuR z?S;L9>x+aAKCJ%uD+}i(AIAr$3|iQbAoxDmL3;CxaP0|>-6Ob5np97{`0Z%@8d zO3KKdk!4p$M?e~j4(pp{*NqEMua@;(P1k#W5yA!&-)o;BtQ!0%A%5x{_==i{z(ifD z8rC;3Cz>^3CaNB-Kpp#fr#{N8{26^Jmn)-Ed(5u}qN4z2A1LMRC^y7pRS7UHOj`W2=`;GP5m-<4CVM)#5`h(+d z-5jKl_-wI8!Rv6Z!I;7NJiAg72E!}9`BNpT(o1dk#!}Ps`o&pjA9L5z>@*9hlVf?% ze*ZpgZy)orBigg)eWusekq(p^-P`P)7OYvU97agAT10*fL2OE<-Sh8eKCulqgav94bQ9^)=WJn3N9H(QU$6y@KAsRDpu> zt5D?V<}|TKoQ;JAmwuymCDGzA%`LIFH7@F?ti|A+xIOR_JuVW5y-UB<3s)>2YDc_$ zsq8Y^zRZwInug~3y-NtLes3ya^ET@F90s{ZTl%Ns6dq&MlI~LVZ8E zBbQV+GhC&p*h(F)Yk%H*w;pZOZeYv0S05@*Txgc&VnaR!#QFoLSsQ~sxw0d2)bM5@ z<9gIXjKn^SOH=m3wK5%4NCQw3#uh%QcQs=_b5>tV)FeGbRR%j-YHYoW2wAnSB{>B$ z%^Y1h!%wjs4R4n!cjW>{GIzFANiqgJ%R7cuc62}wDyiQ^M9iRKDb5heNA0@nJh#;g z=+nkyy4h*r`fUd0Al!{4jU1CmY0SkZ(Uo91@pRjYycJ;k`R>j*B&s07rP`v{*R*l&=uap?s zk^2eJ9OpnjFA1$tF&fI`-mmI_R>F^QyiI853y_rh!WRhB7d|moEEtQx>TV0sv$gRv zT1{N(c#W{ygVTNB+h@9Gbn@f+zFPwK;cPWpl~wc-sbS71J**o)KPZAlc!LWsjm0lz zRkXt=W{|Ra<-_eK=SNj=DQlPxqE$@m1pONE)E!-V?)x7>e?E$0J9_Wa!L`wL3oF@l6^Y&d}Eb&oD&EUtZX9^LvN2Wdou5?UU zC-m!e)by5-@04o@)Y_JvDva$WR}D&7ka`;5O*v32Qqo4@o#*!1pjbC~(*E~G@0_+X z@V1zu%J6smfV`+QYKT#N-utg7$YQ`~K+oz^k}f2u*Gg6F2)T>%t6N^+E#u0N+AVO8 z#NIpawXgL(YZ&qyT~(`Hp7ar&uYZ{{yDZo6*hfn`??>Mc2&IAWeS@qehf?vwBOUdE zH(*>2N9f-D*r~!TnWk3ugqoHiMF=bvoBnWPEK#r9_k~=HLHO1d$N+alF?qOrU?#L= z@aHP}6D-rO1-l&dE|Q~F+f#TagWG>)y0nkAVpRy^Wk_A+v*Lw|orOaxE6FtCPyEI7 z{^b&PLA5Mt+X^UUj+lVjQAH2M_X>9{v~r3Mz8%C3)}k&re;8QVBZOGz=D7ss5(5DOQ@Hgg~`2G{&bdEa<%uDBAa~bR!#SoQ4sf0^f>0%H3TO zK^l+CHtym%SXYt1geyx|iNnC%30*nQPg*5od6BCNuYWBWHrF($kM~iWq0R-@w;t8} zcEisONyWSV4Zt&&UzSxN^4}~jTZP54B6)Sgb`!^VBad-{$=7bNXwIluVKT2pbTKxs zq9B7S+Q;O$5LPIBT;AQ)Q=ZExD4%G>NeRvNNCi`e zt7;CN^B?VgN^5umw*9#Q7jO<0)-s)x(anBEKK|H5xmPbOz6YBa6hAn z#dz^{Za`Q)hGV!H4A?s}dfjGcF5B2&%4sV*EX>hj(OweD2#bX_Tx<=zd}P!)WN3NULpJr{W&shKHf?8FLF;GFbVn=qB{b+NyAW%d-u38aYE@ z{Fan`3P(K5a#s4Y!{A8=FaT?m`Ubt~3#msc`8VyJeElM>@tm8{YU#?`*XuBA%rw|! z)MMU9A)Rz3!I$ZDpUm(kmr0Y9QUe5-scU2Ow&;5n!?*Yqe*DumIf)DSxh%b~iPI1v zv&PB{q4Gi;_3ECrlu>>3rqNH&C-U8)kR79wXC4Iw-rC~(D9WoPp>!I46t|zv8fxJJll<_@cy5hB00}dUxA9UIz{=Xenpwo5(T} z7QFZ89kv^pRj8IRs?V-P$vlL{r~<^(c4D_#wUwl#d!DZF>M020I7R|GaM%c;nOT(d z1LuQ0?jbob36cWBOKF4sk)O!5=CE;h#+7)ia)!c7PpBM&yLA5O#N7R0WYv+{J01HE zwJJ@`+8C90N>kU!cVv`8WEMV&Hi%c_(5~5rUho;f8DP0WoTx z7H?*!R}dHSDr%Cc>uek`V1wV>7i9%v0ghl*>7O$LW*quQuvnt-SYy{>)i+x-Zzv0W z$*hwCzNUDmfnj6t?wjiJTdF|E3C{}8X-C|x{cZBjtmt~NFj`s)gHxU?yklo(5_xUp z*G%c$Ie3Irvn=x-qV{%|m}OJi#m zQ{HJ{ONyzl`34mv3+HujSj%m-Q$?Q4$9`8Y8Pl)PZ*BIZ!;I&Y5*Kc12t~(T z?2hOJ2Ql%jWm)Xa&k;AeQ?XU$EN-J1iPr!S25c}Gd4MWF)_L0T(aK^+-kVcJP~2D!`x zqsvQe0o>{Qj5=p{0H-`Zqg8@{0%H!3oE3-o8mH~*inMMQDYhy{ueOI>l!Z8Q&7<^~ z%2lmp>tha^+wWb_6&1GFqv1MO0!CqjY?jI_*+pQuPb2jnk#GU6^K@LKak(P8C9U_MEFQ4sR^nO&&gsy8!NwGUoKoWV72kUZE*n ziRt?w$)R;s@saN|jO>@y_5*l=P#Tgp8j7VsrAm?Fp#mMRQw-WQHKMx%r9-FOwsf?D z@a!r&L(ou8mk*zJ5c%N3)oHDr-t&%?%P-s^q2a!JJ34r)X3v>@^%IzK=lS+5dizNq z{sFzYxpwa@rOnXufm*zvuBFy(Nv-mVfP%=yXj&3rYCi_yEc^YdMSI9=o@|lJQq9fG zbXX);s?hgoQh?=1dE8KFj`u6dLi2+PNbrx0Cyb7@{!^`y;i!t-pL&CzddtoRRp$@6 z?urjcEJHN5j2_<(Pu%^;bLB`G!m4EU=hA2u-h-r82~A(>)jpJcJoj1Rv*x-p4V<&R z?nhUw=w#lS+tK86qLy6!ciIZ0#~Tl74d*6|W*?Cys8R* zk~Qspb{08kA5*fXeyve5cOK@aJt)4zb2i+tLAPW3uHPxlf4-kF#<=dn>O(8fs(QCSkCWpy&tOh9r)W%{rMO1WFg=A;;1`R-B9vPUdN zv;{V?{-t@F1H?DSP@mtItwxr8+8t_k8>#w2{EVqzwoQ37Fj;;Jh!N;Wdf}LCZtJJw zs*+a6$NM3yBKid9I(RikD!_kB&U1w^|G-z5UAxn3en4LgEzfxiWthrR(=s!N{C*kb zn3)L&0i679kQ{o66+NW!oCK6P5j=p8aE*yF5=uz&yfF`%28#2TVC! z4AmQPhQ^$2uYy#?Jf(p($Z^0u@Oy~iX3uUSAhxq)t9DUWA^Rj8;}q0FZw7t7-u?PZ z*mGtW&#rxl7>u`xp?8clV`%(Ubcmc4(VkAhmIh<@#ZgsG!h!X4+j1)EHBC1imU9 zYxthe?AZSTw}-(VRyYWc=k}{h#;&|QLE7&SuMp8LnJ4j_^cSFB;CU$LA1#R2RLlft ztpt38-IgRy-k!}iWDCCSgNuq43Ra@j_Uxe5_CYBFXt=cLOcJ@GT>nAYc9k1h$ELZsj$2!H@Wpd$0+UmW zt`0e^2GsITbPqg2Wd+i&tU~=1EeLfF*EyI3-s~YvxOk0Du=VS06c zA6+?1`!1-CD(5C%gn8o6zF32tTVJt05UC@Q-A<)f=-07+E{qGJF~!lq$lwMJ<=D4% zoSFonvpC`&PR+h;Fbo~drsVy=c;1oW8+gz)e&naMq-v*G2ja+J*Kxh^hVNOFZDg^M zp(-3Z%X)J`y&aa66Aw$M9{1(e_YB4bVIvfa-wytg)hv0L1Py7Fy!=5=nG&V|3NMmg za6Hv4$>|m9SA;TJY2~ilLL%{)3ZP!(2e%de8|uX$Dez&;&$c~%(vd}srcDGX9QfP97k^70Wk7+5IFur{db!#DPM=#et)`gLT z&UI>%pS<7V-0>!oyxfVM+i&8q`P0;gKmmW4ZFc#<^f4EsiI=BGFLu$c(M$HtAJ(|H znlgGeb1ek**7gSpMtbdZ(VzpE8Olx1L_iD@d$z{Z9~dTnH1257RPnuLJfbfFa}H^~ zOtkYu%e{FBXOp7Rvuw%-RV4EI5)>j1(LR1$ER)uR#N9YH-oP=d-DFhnECGg~Gd1mG zQI8{Ugc$CY3T_XIG&Wi;JoxO|DDC5M6IME7wKMlffQDB36#Mq2?*`*qlshjU`IhX6 z9g_G#q6#@j3@DOsoo(hlco4PC@QG2zxGRVh<4PJAcg#AKu-rEjNhnR8?&OW0G)s?9ZkOzZXr3i z@Cqt5hF3UGP{_7VSn!FM>5+Ct{n*pzta@?3;zqwL`PgYEFG9^zABB`W;@hB=PJi;{|NqhZh57XuJNc!^ckT zV44Da=*Z$c5lMc0Vv>9=xP8Uc7;V}H&U1NJlfkvK#QQ@!^YV)D7BBs`z9JvS%$h=y zhcwnz3Aw$bbVL2JBNA1fqi0=P_V6(i25!62+NoT-E7N{SXNY%@6k%!MG6^2xz?N?q z&1*mU431qE)LygFUCBek= zWHd`x%q}$yG1n@ZvLf-`+n(%}oN_AFbk#gd{zY=~n6-^v0~LB9FP;v$+9xF&JVw@+ znauE;P0Xz$^X`;x6No59>yOxUMFY0PRL`tE9aSNuMaZ*3II zBd-Z6-POlC3HdhvO7K?n&T}C!;VIkq4>62gg{C{W+RD_2eFkPGE@Pc5TE-DRT?dw2 zVsFSX?h|KPY;D?}s&3LGP;C{1{M*))aJtfyqCP=b_l@=0uNPLZ)f0ayx|$5Yc4FiD z>{su-eD^TzTGoU!G{&7jsaQhpOO3QQbyCvmW zY2{Zc8B-6#MUS3tmUV-k&kNTvwnvi)Wm~kQ#VG1U0q3WYBpS;DmoZ~u>Xo7}pWr(+ zUWL^#zqhE6bKdl)IrN&3fTI~=-`2ce0zY`vD5JV()?HyZueztyd9Xv= z`X2j4ED9c`a4uM9R;(g#`MQdi<5l(}P4FV>VU%L)S&Aq?&F;o%X)r_sbm$fyl)(4t z8)b~SdeB)hhPj@*^ym(KLlKo8Mp@MbK>_@Fl;uld}ukoKqKJwD=%JVWhfV%?+zqW0h` z2WpnV5Iyln_&BfXIdN8kC#Z;BZn(INON*(wbA`Ld`+Y{~paR^cuOrNnT&}71^tQo3NHKdtmjQ$eF<) z?BJ^6weqm7eM2mpIA6iR8*cK`6SGdG<(_{r&WTq{K-y2FSM(4~$p%V(w-xNMB6~Q~ zDUC>FWc$DxKHnHWpzI=?2v(#w_{{GE&0q9#Ni9MhJqQ^h~ zvu@w=`|jI+n4e!8Oi{7I6#t{o?ll8nwI2|QG3vSy3Q2h(>EAYqA{#~}5L+d8{% z#Tq+pdUA+)FV~5gxh;S^X}%9S{$lVB&4PYCxG``4fT`LXVY{_Ldhf9oE72zt3`m5df2{qWjV zJP_}DNo65|Njk^Kzgf`uZc|HNd2qgz;2!ideB?MkKv{4GhY8IWild>@|M`OzPscj^ z&ZGC|lWl(lSO3T`k}CWAp3j9%zwaggKVe|-a?Z>3J9hJ%WSNt@+ha8DAzpa=jdXYB zOUAvi+}hM=Gv6EbsrlBb=*9HhWKOfv8?X+YP7NIdzhLyHWtbiyzl_&G%-Y6!#w0hy zy|N7a?JIc#HUIFtM*M$16#UVh{}8m`sORdQXR^AaY!*@BCRHK4soF+N9t`*(0pLPU z*mCGo*1ehK|Ha;WM>Vx=`{Ulnz2Z62JSre92Mee)LFr9FMMXprq=V9XhtMMzDN2_n z0zpJTr1wswh9ZRCNgxSCT0&?cBqYC$=bSqZ>Te9syYKtH-|@!Ve_*nNz1LoIt~o!m ztT}^@Pq3$pU7@@hsd~8IrmY{z7gi1<)7sgicB>P#Z`nz8V#Ccc;3wl#p zSF-Rax~dHlmwC|9hgtt7qRP@jyE94YG~kISDiCmNT#zB+fUdd?<*sIORWlxy%a6jj z`A{nPFN6Q!+bOr}mEZ8J<&Sbx9&R$n4#+8LsqcaHNRhW=LRF}v1IA)HL<6@^n0l8_ zS@8G`Ipi$M%Q_+GDC%aoDOGdoA{X%Ric&;tUa=VKvl<{r$==F#Zvz`|&c&JV5_oGq zB&(V!m$ziwkY}Q!?DgeEEw5a4rflr5EBR3fzP46y2GbKY~`{#fC^W#MSP5xJ?Zut`*i?`9&(=#1XF=`|jkKcpPn|q4`Ge7`*cimZ) z`bda9t!{4_200}K{PZn#yjYx$*weRFJmIL#G5Jw?vQl(22-VLRsKITcj1NZHjBSWk z&|&?IcpyG{?-?fM#2Danl}t@6hFt6ziU9nf9@e{2GH}?myFi<}MqW_R;U4W1?W?S+ zG5fJ+~2|acmOlU6VnQJmK{VU@HCBR_y9@(=nMEgwZDT2^QuKI*v z)2R#||FnR?9nLpIdnDJSBx8OtdAC+iI+s0Oyrt5E)ez+uQ6|1tKIqTc3oqBPy?>5WuhvoOf4uW{e&w3T^QO`5WBm@<SBW^MRly@IAv@3$%Mtk*p&oEhJXd?oKJTvt0=wP`bpY5)D zglj8X#Kaee?AWwgI_Q+*mFT$*uZmfDpyhxw@DU704*+%-j0M+Jw z(vA$YEzNKOlAuXk$wRpfNUH+eee*z~f-KY?qQxQo(hVUn&j)(l8|~x1nZ=fYkA$G~ zc6_L_!QPRT7L>Q%X&}rr&?nJ|Gkl&$DJej(Cdp`{e5_n!^byAA1b|zfkZcrUVUVbNMt4H^r5N*q~1`JU;m zsRz>w>*y{lCoV!{^lC;~Z(MiE>BJEdpV3ADKV!x*%FJ*1 zC3nZvUQ%y&Jaw;*Kb|kia(CgH`;7v6MPcq>6)cawSA%Ho7FTWPh*u>RFZw8p=vo^c zz4LpfgU(ofq5JQ;<|)H+xH^!Vdhq&-&gBt0^Bn9Xgo)TFMwg;=8w#3Exh0z_=rIwU z11TAQT^{Luxh?pi=djK%Boi6aD*|FedFA3wyAzn5YZ*Ka=k{IQgPWQ_ z+r06Kc{YS)fL+{HKA;utz4o<~b(qlP)%@6C%~eAd6Uvom;FoR|m{^88EKYL{D`ENF zGx8_kOzn4}!Q8j|JkAo^LJs%5s@QvbY8BSJA-eP#@?jVH8ZbwP{7>metlBvIY7(CQ}`1kYz3oy~6M8=w$adf%i|L4CLQ z;|JzE2 zvT_HGz6oc8ZD$>4#_!kde(z>YGn+;a7P8%A0v#phozBRJF_JxnPAp<{4aV<~qJ!OZ z4kMZ79$Sxam>H)-Yo~U^L4e)pf8Hb`yMv^6!Wv$^QP?;lo5t(pMGFkCS2LeVRfk<- zTeh!DM+8B z%Qbo{0cjBCv=czigrW)G3!kY#Kz8>*kHe0^PQ{}J?T;NzNk$HV-CQ-VD443 z|Ad0E@%zDu_Fc1?!rm)^pX7C4dVw9~&&345H@&<{;lTal$sHs1;<-)*9bUtf&m(NP z8}S;_sPK)bt@-i8bxPx2wxmR!Y57JDCrkM6fkB@sztM632H4%r%FkWh%_41eG9$B+ zD~)VZA03PVPxRZ=+x4kNP6bS+5jZ0L_viesDS%?dHQ#{lf75(J@J@d4nS(uBn`*xq z4x?VAcMouQ)!(0Tz2c9PH+JQqk3Ks?T^t~&`V*W3Infz>A^>@x^7`@MQ1-46V^w&S z!c{_u;e_=N4$0(7uiPP(l4Fdjw7{((QC8zfZj%>VjZzI;TNA&zI>%Ct7ZeA~O*^5$Nn{v6;{11x666Q1sW3Jaw>p-vG{@q=aiES}$wx6Ss;ptZg^A@&y_E}-Rkm*q z)AWxJ$M<~)FM+gmf9qcZOBx!=4G8{{l=t~HoM=s_3_$Or`dB7D)R}ZG%X?SE23(O% z9HvhYTlHn1C)dC9s;Qz|e$Zg4s?tjau=a`V?XU^8Gh=27-isx}y`wC5Sp-()9j5@V zK0A71?kr9&ena>LdKH_M&71R>s09rU?x{wL^R+k4dEi)LCM2+r_nJUecOSYm{zILb zz~kV^K%6!$I=_-GWL<_>c&PwYI;#^e5BT;g2+i}ag59glr=Yjs-T{K;#?dFoFiL>) z(BW=riaQA2hUB~l?+km!Q()?)Ec+|=vHf!Nn4oeo08|0%#~~v7^um07ShkZEqa@>h z&DL6~^~!sl1&92C9)nPp9a2pL4NBvSV61b7@ED*CQN&6-V+IXK2h&-}JRivR7L=iI z4E^DkVd0VBcTAA|BNZO<^7|nsu0g-KN8|px0D!_1YV{iHgKB!C)QN~QS+2a9uVCCQ z&zn5L1P57PJSSh~$KTtQP3E|G{deHL9TM;h!hA(b7z~;Bfp#gSeDUmF#2GjNmg|c1 z-oqYd{JGKgsF67~@Ri~kjdP47eQO87ef%OTaRT8kA>T{gy_*q56f?kTR}Y%Vaux%< zX&OQ?s^WmB^#e)9d(k&MH@=Q@5jf2J1$KLc-LChqL#US)e=fF5o!ELWvk+)I#pAy( z#DG%_WdkP^xToeO*Ge4|9Y|fxui?{zKmzXENAriJ(>j>gW_2(tmSsd#SgI0`1KxbWs$C7F$eyGDg(*)95OoKMX{G)Q1iY zujQYy`zEk>9`lcLU;g_~Kd%1wxS#$fxpe0LomKq9i})>(!GEI4{>S&N#nJD-q1TT` zi2ki<{#(Ar{{~`zq?_XcRr2o*`3GglJ;UbYZ^_sd1T%PLN2x|}vOG9(lj)qe7eeZ& z{W+8S*U#JK9vx_xIof`sR*37ma1BuGbFR)%==?Fp6Nzu${p0wM?n0=Z-GjWP50MjC zts$n(4Zn?rvw3ZUX$Wgl0D|I2SAeUEa=feab7eh0>zIC~ zxu0g|YNG6l+$3myHEtJi-CkvBrRdz{40+L{1o%4F8grm&Eli#NLQR4pgFJC)Z zp7Jn%8-)@6&R9Xtyy5HTu}!D+kGt6~yR5g3$ZIYa)bhXMZRF+GT?ptH%OZm&Ta=dh zkjy?Mp1PftcJ7_Wvs`JKp(x6)SXM)1e^0BSt)t9l(?)RDIXR`mkOudS_*gMkUgp{! zj<4qR^dA?6c)nWUL$O)czR4Af&Hm2VR^KLYl?fyAOW7D1`9i2$9gbaR{HBD;MPiQ}vey$<^ zQH9heZX;1JByc`H77UHd$XKKcV*^IUTrYk#&7>f1OXp)>4Ib(o_%;;KIrxKPc6Mol z4o7U&{49||+M^J*^|~OCDs&}sBh}gS` z!xx5f$?40Bg@f7@A#Pg+nNWaS2w2@mG}n>*^c}NH*Z{cQ5>R^L&)3Jagv4)F`iI}Z z&Y&tA;McaqY#hI4(;ZM=h45A;``cfj`iVt+{d|jd zU9p$vpo$Sb^P&GpV|W!$$;hFLf)tfbt`}xD#ZD!?t-$E2C`=zmxa`el$AUnHFCjM$ zPV$gRdD%a|nYt|3H-_vX{qKzt?rLgkO5gO!QQ?BPTuvd*>ZhNRayshj?3dlg@F!`j zJ;^p0jf{?6PM>wQg89w(A>IH2n6tp}XQT}(Q2A7JwcQQ-)`k-4bv&srq$Uq0owB~8 zw<^i^8Nw9m;k6MIE0$!|q~LJ{Ta>N%^-fgB+|+;a)s8*%Mr#ZXe3m0>jEBr~!{0OL9Ua93jH8C)CY@Mg5k9%c`AlN$hsL*Ds z&aI>P87m7(;kH2F7eQl+PCGc?LnSg!2`9hV5kJ1)?OqKwa2<7ZnSCH(Ilm2!B|S=_ zYG+5cKv&gEacwT)(tJ(a>(NMq&h|5RqgVyhk=|^}<<&}d;4-9R`_hGhNBWqLKPIqf$N<}WVC*A8s{o2c{|uNg!+YUIG0az@~*ve zavNig6DQpY<%UFE9XzLA$2u$U9wmd8)BNnHh%OdZX!~^Old6ZUZe>z|Bx&ZeU`i{b z;fRkZYSN;QI{b119(LG#oA)aL{rGvpN%pT;^v7Sy*V-4j^pkKSdf~wg%AwRiXSMZP zmT_YR^~kil&u(Xp;X|o2Nyc5L0qFe1;^I3ZqqJ(^n!~nx!Bm;ZDL(?)6#Y?oM5UnW zQHvT~DDQRFJv>!D3%c{c2YI1Ey{Y>8s`YH@A=oYEWCnppj_VSq&F>DfnSE(PD+55vlky zc{yrIrAUNYQtlwfgI80?oLOqgN7x=L_U(fkXNc0W-}O*p&qa ze$$nGBnLzzt3|fszM82Gr)BYej>LiMhdJ8LE@4o65*#v3p0$#|Emg`zI83vnk=u9D z83kU(4cLQK`HIR_@+$W2smd>?4IW-^)VNX6$FOfF<8NDO8!nWIm&nk>^)1c8PaeJ-?#19Ha}e zx<*Jp>N-SIUrfV4;8kqdz0aGOFXd>vb$#*}?y=pOoOuv>`rO4a_ZBbipd ztqfWg|ChdPq-^ST{mijDD%#cc)mqGQxMUS9eKmOKYV_f6oMcy%zB4u|KLlLe3{k85 zYI9Gw(8h7|<=1zExMvmokze(%|NG%beDAUUJ9g;1NS@2$4yAS#VGg9zK(>3{qw`xU~eX*PTC>dz?pUb2eP=8ZX0 z*$DWc{L)kEMt-wje%LM=8NQV5^V_^Ey1Q2u`3Z%>&9VZastvxlFu=aYoU#*%D6uBu zJ+}+kx6`;lcas{#*$4xZ0AkfjVA%=Lp|sFALU$XEy>X3H{z;ej0`CzrrmzWUfA**A zvyoGuN5=|9n5cVe08lyrfYLvaF`39%dJXxiTTw)N&==VV$V0=jmWbFU zg)+euSF<FMiX{hVo&?OEq9o|0Y{{wvQOm9kB%%%KQWc z{o)#?7>rdpOzyo0~t43WEYCobgjpa?O^<9u2UMmyD>3ZVv!~B97xB z21m)Pp1NrfDy!QF6GFgkUiRij_a{;5f>WwZ3Y+?6YP$T&u=U$Un9jsl=kypX{&Iu7s+Q)S4!9CSZ4{o@4c9sOK8J)`Yv0lg3EoztW0+IuvFM2c@!`mhSe$5-+Xh%BBpV*@N$}xSnb%Y zv^u~_!cMSG(RdKzvih$cG%yOYhBfU7Pn(;1=Gc#@?Cv%1EP`l+2$>R3$8g60H4LBo z2O}eM63i>i-waFdm817cvfbOxrH5BejaBcEYEY01SXEP|&}qpq$;n+7xa2*PBjjCg z)6UC~7%pwe(FJc5wWohu%ufXwuztIfuAgSQ)5|Bv3sIJ*Fsk2xSC9UD#;t1eye~AO9=>MgU$rUzC}oD{$}Vz8#+p z;Jl-*?Vjfx#?<*}>7&BxWo-!w^4KfgB9pXuRdX(;YNaXni;w0ub#LqNkqXl*wGhSr zzpVGgRacaZG_i>>ZCU0fS=Ep1_FPc!NdF~<2TP!f<4xmaEh9BY4Ppz z*kWm?qqUFx-&i`9bpWmQn8;!nZZy}(Ld)@o{87pQTxI^o!3_WpG6u*F}RjR8TxLZasx%4A_j-fxbx5!bqLlrm3DP% zZwHSd8Wr!=_~t5O=PZJlyE>zhHCByx4wdJHAXw7zEIv4z!TL(O1@`JK>!0n7KzXG9 zI2<2Wo{D+B2)zLaDi4XkhJE|wIAEW21o`36Tokd98Of!4H~Tgr>~6a0CntB&RKsjd z6=bb!0B9@5^J0-tlNer>elocOQ3%m2=zT8R5EC%6<1Pk93 z#_zKBTG>0-!LKTe-Fku`!-h8fJpIp)(pMHHAm&>U#p@22~#urgqcUtblly_WMB2=!c^*gLPcN(sR4&QE7&C~ z3v?BuECggg2pft7zrN!KBcpG^zZ36Nk@_}l{`17Q0lV{?(=9D6|C|dN-QJRBRi&Hy z63LH1zdW`6gguP$CV7X;3u=aVgS&PLjPmoI&S4Uxn&TcwY zB)XzDB%PkO(S6kU;EG@@1;AbL0`Z4p%>%dA+N=^Fy>9{zr!!zyJ7!f zRfdYPVwex7FMTiqk-DEV{O4;eQY!ds#dYXJ>9?Wp`<*|^E#D((+5hYt0vqIMrI+$B z#L1*}z8t4w;)@pu_vh|r4C%gJT6qOe8H_1tHqN8tY z@%IH|W+*EDbz;bv?2)f%5j$pe_s`_o|NQjyj|z~AOwX`|YxvI92nY+Y_u{z*+UV8r z>I$*UQz#Vk+^1mY5UMo!~2TzakNkdq zzcU}p&;?38e_G1!X>hkDit7lmepRSH8t_K%bY(O#6RVoWL!la5?>8TWFBC(#&@gbr zG4xn@@zR3}CCG%ss$m_@Om*$~9|X0%);jJ+j@cGx+J4e}mc+t3{WIXxW_eaKmVQvH zzP^>3dT<1o{=diHQWf3(3N@4);gH?YtN1jL)vcnf2l!5Ey0dBnu#j!p8e2}PNs6!O z>fxX!b_#Nc_G??UaxsMa>HMoMW4{JJ({N2(UpPb=g1H**$1(7F@i=kA7Ln48BY_%E zpoz`B5%15ru3CiG3xGp*>~P-UU>@iP1FYMWr!%_s_421h`LY5z4jlrmoIj0s^@2j> z{dBl8FU8>}jOnt1QRI?4Ixt)`a^+K^@B5`IdVws1vxEK<-0m))ji@VLhyxt<)M|7A ze_&*vx;K7w3){5r^1cR6G7xHkDsW_+^Fq-MRulXofou>S*topKR-Ky*fhg;?py)J} zaMQ(C&mDKD`P~}c^HFR~<*Osp7r2LNhL58~673IheOhe9)E?$djm+RJ&)y*|9v3H& z(#B6BKv58}T=11V^9na!P+?n1`UFP{F9p#dH6wEp0rQg3y*`G7uo5?CgV;zp9A_<8 zWO$S%5xJhCZzGFJr_Y`AWLj8$#T!X%e9mevkF(1+e~=_gTO7Am=cFs%=I%q?Dn=;V zi$$(55i^U%@xbcW+CzbbzSX`AO6ARmsuqaVrpfcvCkKiWL<{rr2mMDPMTH{=A@BbB zowxc?(at@(+V4+yJVFpl)fZ`p<74t(8O044UL@T`lL51793lpULh{U*sLz9`IGOJdxa9k#AP)hxKEB=;*1}V=9}=BCC?g{j?=+{y?9l zdN$>0b_7bVC|1|(6#dafzei6lWRICC7oo^f;Px!x?Lq_Qk8+z!qy4$Gm8AN+4|i@@ zn>sAaMewKbt^VZd?4>+b*aOnsuhw^lAOBv0jW;+~#Xqn}5ZnjFm!ItU43q$B!vv@1 z4^MLXs#&YZTdAeKo$zF%?1f#{m^_%_^z`JQ)#I->)L)R;Pi9zpb2wCXhE`0%L4g^t zcL5L6r`9x;yLf%c1XR11Lj-UL5GQa*WC>r`Pv{9SRQ3PV@aCE))lGe{q?~_pD4@!> zl@k4IZE1GF(z6OMbifW?R}_Ci$RZmrx3x}Wv&D#&YY18HUe`SDgGlk!9_Dy!9-phy zP+xH~o!Jb=itI#fWIktAZOD@Eh?)@FXXk%iPj_uDNB`^F?;rjGsw)W$%Tc_pyiC2= zmN63$TmQBqTM@jX&x#K`h8B}YF}Z5`Hs|!#N|^Y}53$ibX_b06ZOz@~R_rC){|kU^GbX$-FE^ox66)Rv(1#Pj31!ZVoN zH767hrmWuR5`!RyE0{Cn`nMm3*FgOXIO+OWEtTkEb=tCth)jaF4Ls zmF`>D-M*(L7UJ#i;+`mE<)#Ke=={7s;i*$^i&_(>Dr&q6n~($LnSGfSJav5u_F4)! zDmHEhhtgT@*kd#1oJf(!^lMj2pnt0M!pH2r=Iuq~S02NC#K&1Q#FI?}_>u-V2=I~8 zW;U?)Df*JR=}kE#v&@)&&MITeR(ZUks)B-xMB9)wn%vj{I?yuZQZ9Yg^V3I#Be*idrs308{@*0=(GBi>+^T|eOtg?WmSG0o{?BH$R9CkeX z)x!bJVD_V$0U;tREX>Jg<7f)mxU@;n=E!hPA==D0sjAj_NmP8WCrnsYyM3O%8_wzk zUjF*Yx|5Or2UhwkvHkQ$&7jpc*5Z%Ly6>4Q|Mm8d`%&Nu{c7p}AuxAR9~@k^zrqLq z<@5Z1|AzaPB(@hD%|k$PpoeNN@2Yq>tZRpZlbJ3HLwTM_N-D?Y2YAok3Ks*wt*kGt z1HfZ-StZ_XY@@>f_HrK~$SCO4-liZzUA!vb8qdxFr5~ztG_f1j0QA*Z`d!D)+|WBM zdn8|^=*GKcwv@^vdQX7A*Dhm^D^j%>J^k47_cORpb4C_Mzaifbmp~2(^KxW!TWjN&BaVACP_GMbIhn3yzg(#wTQN_1N_D zGbYp@JT0M9DC(f|5`qO-(uP|4fhzDn5nAuUE3GW)Q z)%{^W?WhN>sp_x^lw#=iu7f8u=``aLjhQGyR5GP%!N9%1j*_Et1uRW=?-B`B`NEj= z2Ht$aWTO4OE!2IpQ_?t$so(ssCji!*yjXl=xPc{3KjP_R=QTaU#Ie(M#$lZWH?Btg zu~fbT3-=B>+JGhei#+&<6Z!?}qm;Qj)626Pk(El_yeTkRviGd1pNih3HbF`ll|@c5 zI;D#TDpGzi2Fx*@!Ccd+JD0%g(J|oAou$sg9a5vUs)C1TUuy7F{+M#W>4jG4=~ zA4ovqN#N;ctqi3Zpy~0GXk`yV&xos>Vn6uoGhO&$)#02uy zV!)8kE1XL84jic!WfTfGkB?TbdR3ZN+4l|=K(MnhOVHphdDCrd zV{tdmu6Ny?MBR6IYS5tDds%%lG0~Q#Q4uM}D-l4e9@fJ6;1Pn4muR##PS0OiE@5N` ze}*w)WKRBmp=T0>7Ka>ST|g@qZwCa}y2IA}yhp%m=cYG0N_J)Sw&iiZC}A#6W@OZp zao6Vkl%#)w1BDOTsZJ+QLHV#`LF_E6fdHdB>>noG>FZNnb8HCav#1$6e^OlV$$~p9 zIeUGO;@&{hc_>aa9AY{-T})MYzsrJ5Ca7(pvba8SVINNr(mYKfZoy(Kgi6>Sc-5Rxe4+`JjX9DyCUqD!H>3~ z*_M%EHJ48js4@i{%rAp${cBF5Ss%Uavv;L|R~1v!?$@F;C*$nFX>?ejM2vwP;}{w$ z{nmn~%ncFT#A(XQ&E)F;(BLh5Z}Z~uQsxPp6gfAwB+`loB|UMOLgPe4Z)*!@**jC+ zCra$L(y7~*~*jMvVALK7QmJ8#X za`nF0wx^cgI5m8&2mAP?vY?p{W6yBhLkv|D=cI`DDctMpo-Q{!<=)CKDvexzkcEBx znib?(bUi&0rpEhX#zY(D?vtj|V<@YqcQa!Do@Ek<;7mJ$lu$p5tlqU=S-o1+M0}Gj zjoBM)TMJ{DFYHrv_P0+C?ydf!c-6_GNfmQDkTyA1Q8VNSjV8p%t)58O7-fKz1iF>* zk^EC&42n+_*YXZ`H47L;+#2IAJE_MitV~#{=R40hrk7}a%}Q~Naan*df4iP$f6S7Q zTp6BgAj6nk&;DSW)FxNVm_)D+09f@mEp(+&$Pxc-g^eE%SQJcUl4(#j@3ysbf_pAb4v+8ASd3Emoq|lx>q^e zJR9n>8}BaLukFpa;7yh27s0E`&Rfr993^|L1S&}0q$VQ@ZX0gCXYCZWv*51)lTJNC zT>Dta264e$Es918a8_oz?_1W|_<~m;!fFg;@3S%i&M+k%R$_iBx)*<=QaEXV9%vfQ z+PhbXCeOD^L~C?-%@cH^_WITX5UD?_(RM(kku$*&i)xo+gWK)W!}OC9(UP!L`Crhr z^^0WjgkXdm_giHn^~sXP?)hFbrQYN-wV_}ES#R>)PkHn^eS{h>iMBs*gRYvID$Cds z&=$mowvksiujtovXEMOEB6poU1rBjJ&&}$(E4!!XJV6S#?rMhEOaRT<_>}N)XD`6i zc1bM#(idd3v)S)BDAXH1CsOMkx(z3-59uHsb2Qs1TMux6cR{+xkNN@oSa@UBrnj)b zho+lB(N9{9*?>(d=2xO7%#^?gBc?eI30m(OcZ*qP^Uro^VKG}QXHmIuv{6GcHjSs? z%?-Cpy~&E@WRykdE_&}(PvcbETFb2lkoy@TI3u`son@d!R&P&wHgSjdd>z%5x&oX~ zfVEy(a6VEQAKd-{(Mqki?M1cUaW&!n1kow7t3_Swi3=9WTQ|5~#}c&V}zHfMpbaX~f4|;|>{A2Vq7m4@n4fhf;7@rOS z5W#ya7K&@nllq#u#!e4{KNjf!iEpK<4`v1ch~URSWSOK^1~s=_qoT@VlrZ~7v#2&7FBggJ0Pn}v;q@%Jh11D=oqec%qz(BS=Lc!mJY=HP?!8xY1a;oI*!-+lvyC(1O|b^eWql&H3>Z7 zveUw&rx|lK&t^DVCrRj)&h)P1QGlzb4TpPK`nibeGi3vMeIC`CB^lj5}kYxrae>mP?e^;19bVA17lYAfd+6U<`7j;Rivph1~m#hGI zKiS!AnYZzUnI#u}9}D4tUpkgeRjlUI3uf=V_65kl&y~vh=A`A1YjWmgFB_>www4Sl zk_vT=LOr*dx-=aM*}aYL?}5-otIQ3llny!R%m&7}&%cG20N)kW$=1`LeG`l3}3G*mc`W z!*YSf5GINi^q&v zi6U7CdM9?q`hvPiq*B1GCl(zA*jdq+iPTJYaciFr>h&XGB&bG*lYq1VW3?{dM-S1! z;R1{Z<52)ay$o(2wP)!={XAz>b*_z&*lm1*0x*4(7&B`dk3#zDQ6jlCTe9-xJ3^FS z-&u2AE95+^^(>)$2D5C21xOFGQX9HF7ziAo>IN;a5)B>@E&m(0%8Up)m5WHgA16S{9YN9ZV>x8%Pcre+HK+IQR zkxBqUL*ag3SOJQ-p=sNy$h@+U z@sZ)tPX%4{H?Hpe2G`BwfeQfuKl=AIpV-|kXv;}EW=HGa!ewa;%Cu!2K*+&3EY8Tlb*9wZ$ilJsEm zl@am$^$jo{5P8wn?w;??S?I4U|HfGFK!iu97)LWqJ+?!XjFqT_TBUoed_a7EorDYm z0uw3ao}9U_RExpwFuvD7b)x3gT45s&IY~Y7Oo#)tx@zTai!fYPKFe!)O{MJFe_`p)DC_p6ZpHWNK+1 z8>~KZMOJT~ygtxI?=hB8dey+1Xl4pY_1JUc)he+BRLVAmBcjG)_c~S7MXn2D?rE!c zW*66=<90!2EWFq0CC{e-%{>`*U*}5!QpG@HjKdnQgKKf>pPGlp4wnx%Z`O})8}svY zqn$71F8ANvmy-p*k`!!zVNL~FK|?>kAmvi6djPlYj&Va+a`~%x&~TwEbIxt|lF2X9 zL!Z^i*v(~NblG?I_57QykAek^q9z;I$By>L7Uiy6DZ1!%HMjQ^-nfD_cr3uk4c+>f zZ3q3W(9+YyAuETkJupA+{Hw^+3C#)Unc_!!?F~)KW*8M{-NL2v`-9c}5|2tPL?=|W zOYoUQuI^wry3aLH^T%VLT20ZzS!7t~8R?lS2!uT(vGFF!iqnRDlOx$v?w*K*+_ z+)_A3(W64FO@4cU0AHMrlVOLyln@o;FCGI7-ptXW#*qc%4`N{KxJ4SOk$HTzqqliH zI{0>qao6-GM9&h*9DD)X%>`JuE?)#0;N~*_iQ=Z#hvH;%g==wF{}YfAN<7>XDftd+ zq_}S8&k;cE_X^ENQ!b{j7yCk{Mp1F_w5;9>cWm&Ut1yWP>%Mm1_t#T&a|$MdUh_$y zh+TF^yA}IbLOSLgAx{2fZAxmgB>^7924q)02NdHn_VK!ZN+ikI``3(M<1nG*ambaX zd_MIKGfl99a&Jh1ky6Di7B422Fz?SU4&V_4Ob`P?oVvJCgnES!dt`h|iOxFm`k#~y zREiZhS|0L2)(rrtWCyxTRsPbnFj)EK1|p$SfDtkbl#5p|?Lf@@?7FKcBt$V5;*v|I zTGdLYsGT8F^UX_{^;5uqm)#lO?Q7mi$9k_Df-8NJ??6a_4hkfBRR)`vJVtoHQl$($ z&3NAEXHMH>9d25XNWea(4;Qw$bF14gJg%$^Us`6HC>uM?9)HwrEzdJO*wcjdE`-$g z+C$N0)vct-{@6TT?Q#)g5`PtGq;&FL4?5~r(x``x|-=jcVzVdpyt7Q+I|qQ zZEITWj95Pv*XprSAGrT6_l6&)4*ci6T>by+RsI4p_J2J6;e59L7Ki_L9gtrq%nz;&jwvEH;Lx`|KPOGpIws=pP#v)RO>#XGt=iguY>(3HfVNWXcOumsI0_1 z3vG~L;tTY-n=l>E$fBO%^XAG^zx76J($fd-+Vs?YB^yk9wfuE5)*%n{cS>)meW$Fv z2ljiv7^7U5ybyto*9_d&%=E9eVioguR!WFb98r}FgovFWIM5{$fHIRU8DWDF<$^Cn zIx<#BoGI2#hW?v-92v~>f=k=Yw`v2(TW{<9IGmoX<6DL@8(>7M^N0e}PxJBCJyqQ$ z5wN*zOsTO^Uf!P3sMTnh)a43b-Rz`lH?M8HhQ2^eIF8dcXq(w78&d(srSk=v&{VuV zI5^&z-ab>UN?zzwIUh5FI{(4Vmj=)D_nRxc59Jzsh*J*WD{9-iEEcwYN7^_Op(IoA zqE?EV!(b8T7#UPMQ2;8o+N+_T*(^2_)|Z6{Cls$XaCARxSEyz09!o}V3&LY|&)R+{ zLL{OM_UYNqenys2r?0Zq)Okx0kG!B{TemG7)lG=&^;3Q^=5?BTYV2ai_Ea)vD-eQl z#(-~H^7dtHUg1E54z~9mOAjt1=5X5EH9?C*v^1A9Y3SK2Eu}8dqc0hKPi&ovNWTcr z9|&(}Q6dbt)>gYCB{2i%+w^BTJ7{$>!q40Jd>iL)u$oX}?(ifPFLM-+`tx%$YH6A` zXQhQLi?QcNw7%4H*t`W$?bfe$DU#K+ zrbt*dE83|+N>CKMEiUEgWG}-xU?{_Hot};ITQ@G0Jxo+EbNYKn)*KlX8EhWZc=^nF zfh@q4YIt$wuOZ-}{^#H6SHSD@Z31Zj04C;BHhHh{ena_Qk6FBP0Kk5bwc$fc#P*r{ z)I|h@yIZWULoUs`EW})i>@bZJLU>JAbaP}luxHR_1W`=$ARg|vcJ!J*U$h6fT4Ak? zI@D`dPH{bt&pn>0urS6ek-;%i8@RA_A6f5mCIQS*Cgln_b3zjVX>aPEq{g9&WZ2n>B`HnV+vv+_~7>VU9F1 zJ~AI>r353n5(h?CHZuK7y#$G*@%rSwiSf%+U|W2Uai{5>H=XhkOUNxdUKb!6tr=kr z)vSH+S(U==9J>A~OpIg7Na19UAwyo5gTjJU15FV0T4`(f{^V3NPLX(TL(yqF9R7dyVAtZF<)3y0Q??oau=Im>Zn^EKRz5&p#Xx>@O76z7INAVAGhXGR*3 z4B^)z#6@UibV$w3TcA;b+gXcJy^VdYzG#3R8lGQa{Veu*MyB(G2v)!>dyn@0_fCv#W4FU4j*S zAr+LQ*)G|dm=nhN%N{D8{%)sDkvuTy%y&M@PWZlf(k6F=WK`=1g^LJ=k@=vPe(S8T z7fR#Xiev@WgitFDe;46L9AVjy%u08swZuUu%+c@NG-+{T*1+GdD3V{`S`3>6GvH71 zmUg!`?{1IjD59W>y0XM%W|9vl)p@^c8*4S3+VqDG`{UoMf`36wUj)RoAB<@p*dR^g z3*!$RL0hctf+S^%<9V2j-{}N+hC@Be9;HK?)-Vkxgcd_LF^g+6wPRKh0fhyCU|vs& zQT17%dQmC6ewhkhoG`?m9vskU9H|by9SEl)(P!)9g=$eS3t?pbm0Wk8Goe&6rwLc2z9O3JDJ7ap(uW9id5Vo`x(9PT-58AYW*fQ zlK93Go_rFAT?Z|DJd|(6U6FPZm$M-+ECK1h->b_4QxIZ?d{9A>G7HB?HB>CyGlbz!R}&8wlWaV zb3{b2iD^`TvT5tch@agBllodRcl&Z;C6Jl@>!I7%uW3selFU)cDR!g9iUo#T#kpm! z-j-sth5CHU`nrJHG{~Y(LsK#Ih5M-4s5P$48>%JSHB$kfu?9C zFH^f~Qra6-M)s3UbRR}Gt^`wktx8=mGBT1eAsaF~HVL>y+&^!MvnE_z7_0)INrX}V zEo_h$_wUezouUKtc{6-Nsbqn~X&CNUO>NJ|Zh)sPTnS?n;B~3{aSVD<;`H8hVXIFI zU12wslE&Je*xHzt($@E3&afBXdC$whGCA;S9S_T9H!D5OQqKXW4YyBbqZICc*j3Ci zuOBaTtluKJ4u-ilArT$<4a_{foHD|@5$&P;Eb57}Pj^UxUog{^*FJBwV5NF|UvA{& z*16YV=A+=|l=&Ni zfXo^mp(_5}Zk^5c5DA;V&gO`UFZLD95@lbO1{T5XTBXk$u4*yeX?o{En1ZH@rA0@^ zdqC5X|3CKLJgTW|-5#|rr=;qtpce#`CN@=qiXb9=2r70*q)|XXfhbW>=?qBUM2k|C zE?V?$Py|G23`i52L<>UbqqLz-NgxpdiAe|{q)tr5LwjkP8ONamE{D-0(`Ezm&+Efoa0)g)YF38vmn`5fG#TE(!FMaIR zNp`18g=1I9-@79Uon+@f=*-;j-@xi*d}VJ#RALe*H;ww!1J ze|;{P;jv4<0h4lJveT+-cw6AzV7TnV z7Lv^SZcXU-b+qLhum&e})$I{KhZh7cw1qCG(mbFTO8B8cV(^g=*?;w~WLdAehpUop zMs{Sof(~1?mn3)3KVavNW1-St?6PG3S6ko|kswnxyi+<7(G(`0Yl27Cue95vq;9=1 zg3>vZq-)bNu@hd%w$fkzl1q&?OvCJGQeu7~%R=vLFAxUk#L9?1iM9o%;ffwB)|45l zpxeCVOTJPJj-a)jH<=9I%tTRPuSP_S+h%t8Fn$izwwhnr8gr6 zV8zsAL>027lAufo4r;!ZzwxSUz`iTLAYrkPWim+(H%wEl@>cJOb&u61Vz19HBs<_6 zL_rgbS(g(Lf(7_PE+0blmAreJZAqD~;aCH`8VD%MKBo;wO=bUULU8gf{w@kB0uk9HjKGq87`(meyzEA2FeDUS<_9|I1&sx zGnAq=>XGjwIv6q6LLF}J zRtbMIJYNpV17AU&g{XzeR<(1Q4<2RRU={nkLU4w32h9|2*!BGV+i& zwqQF6b8m=T%~v87Z8bnOU~>yeeDV*h_~ZC*QI@xvbOB)tQI;+}l*X2_P|9%O`-A!# z4c+>%(ap0cF%k2CD}YBEr(ssCWEU1_@ByDuZB**er^gFy)OW=q!iva2+GLM+)1b+d z3SPaGj6@?%lu@g^X1m`NXpZ&a+pM2gJh-iECZJKzr53cBXDh9KkSGCn@ybiawFZ8G zX~#^zJf~1tI~Hx0=2C6^r5Ju=7Q1v;2jiYhqFCU8g49kSB3`)0%ky2s8&}F7OOj1m zhYcC^OhU|o;i&ot)Np2Wb3rOYefU{!oyFe*;3<6fiDU$s>o>d)CTT9eJ1nTeJRS*P zpC7koYFQ z3r|Dy=iY}y7+JH9NU-AbQW*uqAGt0 z*kE*BhI_K_J&7_I5iUBDhu{jY|Cpv+2k>lM=h^*Zo}%CgSY9p$GQsRjbp?db9g;qat8@2lkV|NqhLem z!gW%P42X{MP;=T~yd)Ly)+VIQGJG+BNFE7!3N5vk7KE+O2v^079Edu(qg11^)M136X&EN^$x=VVS4z|%! zynt&%|LOED#k4MWI3Otg8kYc`bU_`A^{Sj^%6MwAyZGU*?eAa+EI_D`ZHYr=-Ez*0 zHQ(hG zkio<(_d*ZgH0~dC==Zg53JaoPKE;4ISS0~mTYKC=;`$`nXEcJr>~i{u7cdnJ_N?Ny z;mC^dbyad}E7sK+hSghp%kZ(U4*?BlJpCpXBY$o$_q>D0R|wLlog4s;Q*F~4rF-r3 z)9KxcX_pDwaKI8pf|({a!=axorRAF+ypR~_JXZRIo%+}8sg`aVF zo43xFfEZe%MhqTm9q_)segQaJqZV(nwj=kqkS(04@`=;`!7M^O5}8J*3C6$Ka4-H>MC_mX zG5#%9lW)VzcUWa2?2V>c9m%mKX)-U7)d^vke)}Tk$6lKk|iHb4WV!Oqj)|jZP{e_*N;_stA#InS))qN znyuFCF!9a3X^g&Tjjk&-$V$yb5c)(*PjL`Zil7GUs-rC}aTFjd%q=nKP5V7i zb9Z&v{^W<;Hj7@n(AR2F7st*aF{<#L{juVZCWtCz(I=*yD(z2L3~%wF^Nf+Drd^k% z$EPYUYFKz`26}!htHFXP1I-^>^H<3HJ4w%u<|a#wXd|B=Eq?A2R!h+S04`bC$Fj?$tc^#{*U7=#$!~;{6EsJcdCJ6(-fzm37ByDOw0%7#e@+kqKE;vt#UtMg4#cmN3I?i@%Y7L`|OLRSTHPUX||E>kpu+ zM}Gm&qyO~qh@#V1+2lFR0epkV!>2Kh9~^$n7%Nae*uETpWAlQE%IoCTi!r)&m_X`b zMW8(NSrNG3!24tZR3h7CUg)U2cJuCJ_Ck%gTXD1F(Nb zqRM2Kmn&EW(L*gwtvGE6(*Q^7@ekE_!A&Ilx(LZ#}zuwk*!E=@b_ zP**I~W!LN=OYYWbGv%a24%_~%`-4kRqe~0350>;f&}!!BYVGyH*xGu{P%9Ho=;Eh# zm8ng$zERpIBE0tpScQE$Esj;xe%l}2AdIHk;cQmdc-%aey6YENijnbz+h-5=m#x48cu+v|R1@zV^K z!^~e{qzmK5J$7c)W%Az#LflT_S^A0g`>M-=S+%Cp5qLK|zJF@j4@+#bAfAy2CaJU? z(xO5tNQB@$qa{nH%LQYdi;D3Rf~uhiujjjsb27c<%gHu7l)~E6b^ItubrrUBcQ>o;U*0OjbAC7l}UAM^4K1k<9 z3SnLr%?&$5Upk9+CSC><1c)IZYRI%VNB3YUdsEjXj{fwUrSFJdwYR}%WW9Rcfd($F zGm2}iq>8@!b@&g6IA!s`h>@%e{+iPO7@8#!7|-t^F_+tGZ>?U7s4JXYQ)25-0UVia zE!tL4B;~t_RDv^%DSk7RT9rSK`_YLBQLa$-*E10)eV zNn(pkidK}Ywn|X@m+uI&u?|vc>LEy)HGlE(=$(cNo|T>gYP}BDC50KuBE`SW%gb3k zD626!A)L<61U@g9M+^%kt60{CfTBUXN2MRhH`qVqH|LuH!2CSey?;206EsoMoDp_n zu1mPsK;R1+Uk)>#-Ibi-TrSzfF~Q`d&=zVPXW3Wa?Bz+Yk>Zs3c2VotE`>;7&A3E1 zO3(Z@O0j3u(Q2E5e0QgjZGD`}{hBzD@Ez~mk`J{pBmDL2UK0&D%>k9|yhk-RZBEy2 zNg|njj;|S2TP+Ir3?8jLuUP4099rIPd{{7+>?ewwrLDw8zE~OUomZ}Or*wXBP!LkF&{%|n0hZ&KT^1#%$EsN04QG&ukAAi7OWZU zk&WiahRlp=SokwH2vp-nxv}7~c$-TfDHJIwj;orLp3eJJ)ze-(ml-hZA-jTHaBa@1 z*c&!YG2~wy4YkS%ycDQ##V<<#e0ytEd3!`4&eeLbe)6s5qi=NTT7q-2`S}ItMM-}! z(p_ixj@%tk|Iv5x?v`E{mq#DlW}{E!77Hy-6(=ww4z_>kMSS3@30?8cTJ_mEDT}P> zc#U;k zA7-m5z=Qr$Mz?Tp)fp4SPR+r#HBw=ofsXGZ#@6jaxLOsQ&V2+OVWB|W+_73+Lc1qg? zctNABT8WWtVD-0lSTDVpT_4lyHi|~Z!yi;qv&;HP8-R8IJ`dN zM}x7wRw-9MyO(#~!B*E2_%9w6--w#EF;q0WWC{meXFlLfYT5W5GD4khkVX9xUktFp z*}q=m?qEhunzj@^OKKhKkSksWVkDw)=`gTZE{K}>k6?_W&9dAJhNlDQl51ya6EIuo z2(cxlF=VAIODWtn8FZvSHMQTcp%6!MH~ho=_~ZC*NsM$G-XNCn{j4gABOn@EN!)tv z_DK&YqwXw}<>*5%L>~b=caqq#DooA*3Kot=ab)d0Qv*+}qA$eB@FWcCk}SU}irz## zLq%~$9azs*He<051Se)I7xQ%vG=+=fa+Ja?SqRGv)l5%?*@3y!*!bE9B_p5b9L#Y$ znGIoLep+sG&QLG|RL#2xZzQ2QeHthW>hlw=h|LeUCRX*S68b1VuQ~EgOXdi>O=9cf z&tJ<(D2;cXOBfN+Pl$Vi9c^aWh9;OH3nFjKQk@)wqV+lym=R)rGdP%UzM=+(RBPs? z+ppK77&N|>+0=@z0x5i9cjeMy1(U_N z);(|~>iJQMgNee(TfWoKl<#WHluu&FOn5|+i5)Rgx6fzsc~;!Cf!+;Yd_XKOT5_da zNxdprOOx;WNUwdee9@z6tE@STPfH_z+v2`h;@jXk_HM|VbH+aAj@osEkQG_(7<Pv{VRnayqli`{U(<`!r1TPo;U_| zm?&I{@$RPjDuZDM_`+_LraC3yLo5NOF&$SJ3XtSw@NszAS0I@h=B=YrEjX34*}ddi z2fg8N+mY7o^TR*ZB7PGF!PuzH3ze+6;V|7xK+5QOVP{JirXF-9-n#KRc*^st6YrSq zx-(L{HE{@(OWCe|i^ZnYX1G~hTjU^VV|GB$1_}MwGe_ke!tC))zLQi-VJ)Mvd|`y2 zEq`tj5Gvq~Tt;rxY{jO{4{dk=Y!6I zeZVwmlDW$WR=KBna6?*DmG{R=@8%Jv`BPGC6Xb#(#V$Ue?xO?^Rdc87# z)IzhX$;ZBddrY*Ge*YKutsipKd^_d7i7x`lrp|A_k=vvAH;uWc@_V1Vpkg{<8TFi2lCMk>A5J;5KGe@2jEg5rlJA@=Wl$AnE4q|Y zkOQ^(^(P`;vGzP^E2$lqXI!7Tf3NieD3rCddC7wc-6_4ZTHk4XlZ?Ou zU;KxFpH9zs-QRn`P*$onyumgYTeb&sP<0dfr%>?E*U{zfx?5+-GsSuZ-AqAtGbl|* z1Yy5?_t{W2x6KxO3x}1pcz>c+8~*is-ctJ6GeMdcd8`v26a*B6NT)J1GvW z{2nKBkd91mLTR1T?<>%$Q$tn9M@IL8;Mha16$>na6U5qFF`fz6e^m#}79F-8RI>|+ zC6KUM&3AxB)cL*M+_a(&YQN*e^qevB4S(-LzJ}HSH=lW@+CYw0&6Ta>Pa2QOB*_j? zOIfH+U~fCOcj$qG7L%|ses7aBv1v47@j4^jBXjAuF|lb{p#GWzQ*=jD>lP+Hm9X}$ zd5*HC$2LD#)Oy$$>*?|!2e~W6Kn2*4RYTK5o_!X5sw1JN3l%RV{dkape!#8G7l1D* zOMB#maP{JZbS8Wgf5u@ubDS3<_u;+2)s{t#!CxD4y{+e_z10^9=$|smhq_WsjA0wrWN6^4`P?r}<|0&X40LKR_&gT8-ML zpFAHNF}cJm5iQ(s|7-~9@0PrL=D<7eIX{hql4mTV$71#9*KWy8w%tx1ff*s}=WlF| zJ_&BlWY_Y2s=23yJN&?XX!-*h_u(Iy`};rsjY$=4bp+Ho1t&Ot%le77cs{rZrSBc( zUXoP9tU0AtvbB7cI`htS=Qo4TO6+7S1cFkRK9o1Q+v%qweuU}j>rX7w zvj&Xa&)h6{bVszO6Js?S#3IVFa^^Xtul zs1KJ^VjeSMBlmhX)r!YLuE`+Nu>J>%CpgpbzR#LNP`lIYQ%qnpPbspc)No3t%L!}~ zb}x&@lB|rBZNsUcUxA>3%q=^~KPHTSl9>MZj}YTW6a=bF!%{03b&s0QFLrardfa32 z6mNmw5Z~fmnc_|q*ywwDmV#Cv`E+iZh2c`iy&ZKWRdkP2dD+kN^V zz}>W9Kj1oro;Wpb<+%Jl_ca!-NXjuyc?`s2R%CUq$MunbAXo;xW7ttx+fCv)8Dzja zNkv`4!r*+p$piI}l-kc#*0%zqjMKEIZsAE4EpQ*q=DB7PW(GNU(Y@PqLRWMKUk7TS zhG{-K1@Au{4lyoZvPN@mZ#VdyOWZeNLZf)7tM=kG6Fic~g=!6H$tFxr^FzeK{@@J} z>y^P@Htme;U5B@$2e6bU^!s$Zq_Z01Rk|v^TJb+(DKB3?Uenc-JMGsN*8%Zmgu=d* zS&$5FyXIkIJQARLsr}mDbvMe-MQw2~lxh3kdo~iJXPn%>v#_0eZD!j}dQlGjdH)A` z(To=)!pPsM_Jj1ykE*#A3DA?sLsro^3VpiFb!z9`;*Ip*7~Iuf;y&_h@;wmlp&CY% zB{H}Vx!KJJS|&1Y={8A0ELjvkN+D#B{)-q>$c-I5IUu@lrjP}|c8I@xe(G$KbLIGW ztlmC$>n$hxi-j>=R)(NC!^cVo#35uDE9cx;7j-s2cQR&9f% z%c?CVPoq85<=R4VW@~&f1A%G6-!)GYyjm5ODV~V%kG{8Es*jCL10hK*A`)rT;e+8U)>V0#A&^!pFgAKlUx7${ou!R9~I3PfG`hXTD|` zoALj1mQfS~NkZZt@&r$H7-P)WST@5K^eo#SBKn$`po%Eo%-98ywqx&VZG4Cgm09Kq zRcE}!Eg_5Y7Xr(-W46c4`~a-v}_o zuc0FH25rx$vG-yusFcKDUl@Lt%h7Z0qn=?eN7j`vuN|_e+e(_BYNVE~LQWI<2>N6Nq!1FR(9b%7}ly5Er3$6Bt}&UV8o(ifN6& zB0CAJ^=*lopy2}OO?WLfpsZUy<)qf74k>tql0%$_UpzymLP;9CBu zl|{r_g@a|n);m1L^?y#fAB}1R>5_7}gW~ z_j;9AY%Aya_Mx3_8nxrL3fI14%MTNWCqFN)Lhgep?phDAqzmdUj#`s$Ptlsa?tZtM zH{LXtl?DuNP_)sj`&L3Pnh&~Ab_5ba@o_5#^WE5GxwqxF^o*U~GU|e{w@%Uv8|yHa zZ^}Y&l)=`RnGzi3XgT3botEcl;z&?f?Sg&1ept;$t#9S6GDiaSjJI?KM}QgCQIYxO zX(!Q}Jj)lYPl3&`m`)oHXl9rxj$+&vndg2;^x-~t<;QeiOiR?Ld_1@OvSG+qf~Nk! zhYQk3v;6!-TRs4s6W~>U!({=0j6DJ2w9Kv%3fGt)-X8+s|CvZ>bSfvL_MdUH3#0R!)_+FR~o*ObSO`+@0L)^d>dgAx>8`C z^g8H&A3w~0L^6%qo2JjgYX~BQ=?+ttqReN}Ywo($o!zWp|4(zT<^}ufYBBElTV^2v z#!$Lsak>ay4HLBA7K0F$O4pUwNQh|DrqN~V+t6WNvLnaDBM;4}{ijqS3iI!$5}Or? zQqKPzN(|W=b685h0`Zp6&J#64z6%I!ud@(bUQlc`ljiBbK=#Pa*0lZ>jzv)YI3tWH1FI)o#n%#33@3F_4&P2_MoI>)cr|?udiW>EcXMVGcXk7+{EQai!xS#Sj5c+;mqhs)$z`B zKPJw;Mm%`8ITVnO2}yB_UrcV*k0UD6rjfVyv-ZMEG3sqQCBx(soO5+4;{M*fkLp2r zQL@{ggl%z6RKTC}=nOty1PW}wn{WqIkAgb4{Ax1sHtmg*dLkdVXwJAokleBCpKf*m zR{GvV;%R+g#535}ZssDld<26F2&p3qQ3q$g_E-#d<-s9mG@bQ6U;A)Wg}Gm$JBaE# z3QNfH<_p7n?!SHg@=QF}NyuR&J({OkEQ8>NoHsY5O zfm~p^0b`~gZ7p0rVY?ZWHe7CdF}q@t%DunhQ$n;KV9|e|)3q&kzKAi6m*ti+6K%nG zFX|u~yTIxPp^zb6)%3=WGh5;sg;uq-8$S=|%y>DTf?d*Emc6Pg4Mx= zkt+*ZhdED@yZ|h4+&uyI4fdL^ac!XbVqmG6jp2G#RDdxid1}0I&Bg**j*j zu4`}M0(%Xe_CUrX0eo624eF{kVbDLOZYO_Ju3)1DR^`2V6iN^KQ$^35^V6Sp6e`^N zS8?b_@w1kr1VG}YRZD@-q6J~HqLnU1&xlX&JYqSW-a0axzEn4jAe*jvCT^1n(OwW) z4y+p{%q>^2zmAew>rBds)Oap6hTA)>W@WnUB>rtpE5MiWN?j<)xw@Fp^IG4A{c5%r zVMO*tl}`HvyI6fc+a#bZJKoxxW=}?GbOkOnJ8K|bvCg4#7K7&&9SU603}irKK)gp* zGN~bA`J^PQ-N%{}KMGrB&5qYQkX!FCC+|GzELNO8&hxDm2I*8?_y5g?(A9;Qn{$BS zcA~Li(TCEi>@^ZeXR!*3^VlzUIc`d8;ZNTOl;MZ!x7i!)<(e%e;Re)sC@ zT5ScnCZa**BC$>=ZRb6MB4Gh2q~S6S>xK4ssU8+AG@WRNh8uZ~cfR(BF3qxtC*;o} zVj>Suk<7e>P8ypkm17PR_`nKUtS+Q1+L96~{4fWbMr%Di&f*HjrbcwDNYW3zVgn;g z#g8tuomZ`hywCM1aY~G=Xqa1PN&Kwep-BH4cN6?y zuihTaU{A1;n?_woZK6>K3{?)YjgW(lb8%rc$RGpty;X~Y6^@ZlD$0CGJ<*o#m07+c z8(MWR_V~A1y`-jvbX7o`C zgMM)|5bYUJ!R6pVv=Gz^*Iar3wOS$mqT!h#;=pZiubaVkWF zY#H30M~?bSXSIb6ppq=p(A? zvk}jXhf9c(v4^;qgU+z|?~dll92I@4DRXO;Cv{(lH9yCI|4wRMdG(pgdFsbLa`%KtKwjA zRWc8Yz6n^Aj*7*9Z3+GbxMR+YsZfB95s-bKL4QfF;qhd|hu0t?)R;en*t*u&doR8d z5xeG${nO9CuEPEs{Q8JHO8vf=0E{u3C6vDqW-ZjOlkH7I3A`qxk6-0Ol>{6s(!u)q zhD;8-jkiMdApnLIzm)7C70A{y3l;3%_#ocF_pRP2#G$;8>5dR(pN6RAlR9ks<{e#z zR%74I;tW9n{%bd5yl?odczjg5D!yNRz;a>fyM>t52@b zo~07_0XlU5T_HmXUQHJDvAV;z=29C7z4Zx}%KY0m{XVsPc`*54mCX)plNv+-w+xTl z8FnPYE0?l*r-{PgW(yL?&%-M~W>mnDTD2ka+|_;w4YNwoWcw_##_Ytlr7TkD-AEWj z^D!Izl~*lALSb zBRFh#U2+X%sp)!c*qb`5chVOr8)MV`k3jh;s^K?aebjCyc5%Mg^j%Et_ zo+-3}-p386?NT{xeoUpG%R!-O#DU8C6mQ)s$I3DRXcc*D0Iy%@x+qTO8J&)Nv(GeK z7Z+nzAeuOdE2uEiLS!VWRtqKTX~;78-oZphNRUyArgkFRhsMgTRw#uhjsz|qo-T}X zgZ&`lsmE0vuK=x+AU?F#*P*ypg0mi8Z|VegpKA?(EZ6#a09ha-mBY9{-|J!e6Nl-b zp|Rfhk?g9=Ox?}}?P>J;7qi#n)n60Sk&j7d*810ij`s#1mS=c3jgxME{+f!^$5KA# zM)}vhwDxbQp>AOjqq;8)j#i@<3MxdG3KEm~(0s1zbG%lF z@MQ@AAYa(+cR78svP`36_B@oIOA$~*rwCd^p!l9i(C75(gu#cm(*lg`>^uWv;lc|S z)&K{<#jn8;K-wMMBcz<6XE!^^{sBY2&2<|3^0~G7dMXFujxco49lam;hr{S3SKWde z2bs_`?D5vGLakPE-t(74%j>g^EsG4VhuW&SL%cKCeB0}ch@-v>L6w>*KJ#NE0B>ql z5;a?(5Q~JbCxmWntaIUrhd6On#MUSoSRcI51dR*$C&U52{9E?tzm|SPPEb)=2?U`n z&}LF^!!-7CP*OC69BuNIJWX^(7#t>yjVm-2gEZ&)2e`WgkC`eEG@87Pg(SNw!uF)oHe)m<*B2~6W9cMn$Jiz(=F_fz)JE%>|x=# zh>6C8N$PjR0k@{cIxS{{sVo4Ss2V!;pR;9+h`Ot5c8(pr53npkmx4j4)$)6Eo#QoM zi#owU+t+65VU2{tKS*ev&Bj-1un>4pJp|47ydpED?y>D7Xjx??BgT3;-p)P$Ln^ZO zAy?5Psv*O6-1!r4I+f{D9a<|ru4AW5j781iOnvfmStZjkYk8}n%LkXk1hKmIMhl9Q zYFA7(nMl|$?eM$<^Bs@FCg{SlAGO-&L>)?z@kh8L&)(KsUhy;F*l|AI2Ms9%&Y3DAmN6Y)r3$xd z*~Vd!qYdVo%%xwi<4Ea>ik?lIi5kPH;fGkP_L%cM5OI`keuZmh z-s8pVbRbx{kx7&D>5KDYc6o@{AZS2vH^9frKCP~uV^mw&#@2N|!*1O~l?>*jq;)C77LB;9EcQ${+ZPbWVl9Zlrd z!}r01IPwSMurg8?|tp9cgaN2M*gU3x9ANP{OO3w(VZdseZ+bCwX!&z zYfXf!hJ7+ZL&v%8r_*~j8va+8EA>qxOQDpywfp=i=In%uS+u$`{qHzG0w@<9Bqs`W=|Y($o@d zH3wxE9uZ4oBIua{=Qf1EobVY@w1{u6!%_y{G?Jl?)@+8Kl=<1UeMef zmT2oNtQ3}4747OpUfc-Rc|Y(mD3iqj2<)x%H0%JQ3x8eUF8w={ z-p_GWCBL|kj{$bIMv`{gpDKtS68|EYY57-m?}1cw;76#^MU=5nf43w|06T;?;D`;0 zKJewa7EJt-mA&-FSxg7v%Tf)|48J;rdAKBNmhr<=9+y@JieWEUGH&K>Njd`M=uRsu zrJ30^ueu}8qehKT%LCJ&sj)G;U-%}ZY!lRW;-0+ERgHDHzS1{+Ww&L%Bqs7x^2+;K zfk0AHN{&(Mf9(VRer~i|Uzs{;>GF24&yo_YofmY&BBPgI8$&)3Wmu&GH_P|JXX=p< zUDeI%7hUxINId`MkzH35t>@dvvAP4qm0WvrTkP^`8COt24im8a+M=n@?c=SHvBW3{ ziN=`fM4zo6RnJ|m#Kop#k;W_ow!mcg=SLNrGArb6GD3u= zkD!A&kNoc*Nhb)?d)W_{R=tet^ydS_yk5%REV{zVWlVLB(4bcA%}MX9pezeYtI&vh zHr;OO&6LV5T1i2b#vlW`%|)**5=ont-WdJ6db6e|rPz1WG)Q~dazH;bL=g8NRLDBH zyty&xkT2xQjfi-Ws~#HxYeJ{@hW97`rs!*&bfe-l#=D1J8Sr(WaYu;mk!B_Ohk!lln8uiU z@*FIQ@-+*vXc`}AC4Z>usbIF$WZGcB5Ia=?(C7ZJf9Ng=qj2tC`#VKr8ZT@=Q_iJc z;i}$;i(0@{!h+4f*C6GIsRP9ND{y>t_iHe9c=hPpl^yC0l>?NoX6NyMsXPX^=q zWPj*3tH-DUg6S*4Xp5I0!Q!XvJe?8WE9h@dA6Cf)fB=^Ic&ok+CC3Zm4k3Wkq7|is zrREq42=CfWiJ(LAqPhr-K0CeoSaHLBB8 z7sc!Ds128YN0`=v=C=@DAvQ)~IO&Gq8ocLPo0sDdzB$^C;5eKr)lxyVJhhY;^l6Dr zqoeOO>6g4>DOjq$e!K>O<*o~m87yVVm4uM(dBJs9n0oIGmgcxR1O228zN~-#iTo>r zNc%4gqR2?@OXXfevds1@VW|eALK1%_8EI#WyPt@cdE~+9Pi51ok29yuVnwtpG(>`s z8OF{Mh$2&i3!ZXg=5;HcEA9LiCE|{Z6aqYW*kszw*emjuF#QQE6{g$w22U|&kRJ|q z)@G4fXn`*#25WUO7J(0z?n)mlhMfpnUa=5v+kV*-@dL11g!v05Hn>AG7>XK+|#+wWmyY~qCIpN__zmR`sFXr#WnDRj4-Em{L6w>V!s~`A?M;m$Qa+U`{P1c-N zOG`s<+lb@WAsRAhv@>I{xMiAI_||HCbl6@`L;Y^2QN8iLhHeLTS+577iDz%OL3kNC%O{DDPxU5H#s7xHR7ve0SU zrk(Mo4oW8aZ#6{Mb0k{v&t&f9{H(xxI0`=>ELYO@20Y2^G|L!3gSpDmgRjVtf&PXU ziaFqQ+=F!g;t=l{&D7!c9d>k?I6gmdsHgQ}D$aH4bWOzY?cq#@|8D2yEr`Q6Gt$EC7oUA{fc$=Skqd z>{1wksa#=|xlSesE;Xq*DP;!KX*oNB+357ZgGRtN+PxgtXvhD3D8h%kBd~7g{W>fo z%03npenb;XzM&r%u7uTpTrtTQ8p`plOYXMpKLQKcbvb4C#W;Mp#_~+@Y0>tFfF5DT zG6fG_@!wYph)zTNKTe?b?lTOM@~{%X*Atv8AV|0Swc2mEUsUf_(^JVkZLD?0P-W*2 z%DH5d_8$~Lobe63z@hq|Q3MDn{lCZ?F8$R?Z1$+7Q6Ef9N%#h7FSzahe!ik*YybL$ zofRZ!j;uEY*-YkcOB~a-@&#eeyecGR@ZnmQ+@$-4z6AFXNrA+ z!}I^e<^Rj?^Z#d0Tsnh^SswLC_){SD<(E|Lv_CDk_pj5-)PI$S{+}oQaohbRP5*!C zcR*uVfe){k*L<-%OD%8yWE$9r=UqB$KeD|aAVAP<9P|a>?7qRE)xNz7 zf7AGRnD^#rhkH3{T{gDe|Lwb*ma0rEMH{;9hc3W_?(1uuSNE&e^4+X(=2)*9bjx9d zz$UF<4h)|xkAHXJ!(!yw+i&-IS^n)2HwLh;DathgabK`OVVtSM&RtsLp>V%y6BR8h zHw~STH(KL5-i|dUmo&cH@R0X2_fN^7e}^4?R_QGzYGcGJkQ1v#Ifl(EE}M2s#D;R$ zX<>pBT-Gw#dKHtXFOE3day0C@sn_(JI5oV=pIy`MLf8S54BL<&EIG#Ir9MS6xay}a zE$hXq^*1GwA1=l9npj7M(gMz6pf1DCr#-}5^fl4^>D#s}MvZw*!B94b|E5EjTvPS) zQrEKk*{XmR)qZX5`2c*U(QP~AyyVG*W~OntX!42sSd8|Iz(w7MOIT4Zaetq#c-ITI zE`EFefadj7i82$#Y{axTNbB!1f|{#}eL14i8Xpd$k9;?#7dM@?95eOZ%g;8K^q`Rb zk+A6)TUBx={|O!oeK>o}At_LQFyt7r{B8`RV)_w@z9Y@Dsx$*Z7(Zp@K0?|~uQq7C zZ0vnAKQ8VUOTko%z#yAH%iJyr_q^m{Oi(BAC`qm8M~%zQwe6rRC;8C2y5g}cgIMz!qHB||hr)z=4eok#7ExKDJiko9{@7qh7x%sPmHdTXUaqz(QU*{vrA z_l!F(97*thVr{e#d3I+mGF)bPxa>VF>%`*NN%<(Nc|*{{lw;5piuiK$o#{kmM^F|GMI8F)uUXaE((gQ5-yWYDO&g9 zDT7x7%VV%K)_3ep(GC>WIFh zyo8o3Rv1PQ@3((=!be35ZYUgH?p)~3D-9rYY!hO1ubSHHSp9)6e;f-{|BA=|)w)-u z+UWBi#VpUWQr<0r5ZyQHl6Q=tKQF?(MKzTV1i`3-~}zxb$l zem`eJZMfo26Zfp7561O|C6F(bc)8_INw2^3oxq9DaYnlUjsMFjMjHK)%h%*+Kqk?s`~tPkD-7xkpMYnTl1ii_jgkOUuUjU}DEd?& zvf6Vs^G2hZ=$&xs8k(1s9R*PpwwMV{oUIz3`WSk4ak5)l&fXE@rk>mKCHgF!8lnH9 zv_`!#*lgL}#s_{Dcf~jHQz}PIDHG9P)6H>Rv8c8wANsIqUk^xPbR2EDrHJTZ>uT5A!vR(7HUdM~$F>N$!{&iY4MWr4*`3{=S%=gwl8}YhEknhdcgUYZG--_=KVLFi@W#nG_K;xX zaBtiIrRRYNkbG?>cKX=firZR7*Ckc2MYm20+U+oj0$fz(`^*FxIq3!xad3GuVs!R^ z=od&kXK21`MUcCt`ui_!Pxb#KiVOcz0RJ}w=iJBWNH$})q!d-_purOxdcgStuwErf znENF57VG3$d+20{R^elxRs&uYc{|n3ZG7|GfRB~J9GEgWY<2d7C2ZV^CW{0ua0@Rr zouPwm%ZJCj&O(|b0cY*~TXv!`?uv6_{OcYt2S+#JSNs;k6eboS$}aAsv3p-sRSnHV z?a7!G*b%Ee#~QCh&x+44$g$m1=8ApYw1E3RHz)qtP4lcXzi^TLG(ULuL`28!OZLl^ z6`At24ejZ^H`LuH%`Zf&5D6H(8reY9>goc~ZKod8bh4;GF3h_8`VCLj%WcXPrqmzh zyeM89nK0y5Gc;cW9Llh&lEy~&IF!C=7*x-fHvx9@%h-cuX24h{b&dK>CkIkc&UjO${432!@J~FP33oEdu_dA1f6M? zzVZ$2XLBNIJBH>K%)Qqem%*o!Osg{kMLxGe;io+Mm;u98u~zIbT8ver zU^+E}%(mvdY51I6zGW8C&=_s6PpZy^ue>p((k25i_s- zEef;i6VRc);|{$Vbg*tCcUSr%;)jAbH@v6Cc8r^iTW&r^my~TIXKB&Izsl>qgO4s4 zyl$6<*^3H|4b+ES;Ykl=3c|{`!k877-*rUeH|^EHQG~~=p75(jMOpX?PEjG<#ztyQ z%8RAmP@@hu=c*z7S;xQ$KZZ+~2rP91RVB^w=4f&);;UW8S%M;(8qme$elWVrj_cmk zodzpe;{LDp-aD?zY+V~>wp(xn!3ru(bQA>y5$PmRm_Za33%x}_K)QesLP(;6fYO4a zbVzgn5orR_n+TyuiGp-OOCVB1O$cf4gU;-8Ciwe4_CDwP-t)e{oqq_+7}m4ay03NJ z*L^+fF$Y9tms4U)6ERY3x&KJ?w**;B`18Bo??6x6^@b) zbCbBPB4Q}niVuVLR`t>|`0e9v0bl!xs%$NBe8+x4t@4nh@EvDFvfz&UX0=ohmDy(L zeuNI4kh=~AZb4ZV$Xs#3t`eM_FWV*3O{xfpDXQ|X(+_-orjPN-}f{M@N z)E>Oh(=($be8wE?f~7 zCHl-^g#C24-gSU90^Co#z~`fz=gb=>kYrco*UhcVat+0jMv_(v(;n<8eGV%MZPU;6 z^J>}UivKD}#<$}29iaX#RTAz!de@&W7#AyL&tl)4c~|}BQvwEa zKZ*pLn@MXBu2NFl0TB}?!p#9i<4jY4TMHmZoI-0n)3_>tcppL(k0%7(NG-cN?KT(0 z@p}FiI-M`+THt3^0@gS0ThZeJALJ&Y%1LpFi*0e((7G=IYPfy56Fd639$q(U_}pHpf2P zDNOGQ)c;7DQ;GfB+Li2-OZdEOYUQIqz=#b$RIN(wg)5f-8|Z>u1geHni+Z2i2qh7 zR$RCRE0PH{Nggu~SD+?6#^0Twri6{xyxmEizW0mvu=_x}!0tT6r2mXOtstPl%8L5B zp5y5J0$o#q?I9NCOXaw=@9TNxDI)M3ARgW9Gl6V~8j#lvmz&cb7q%=M1djQn2D+yIEb*+f+Xt!`$vkuhXhvc$_6;J)=ThZ;978Z}tHpJIoV1<5`9t4&r3rs;P}Tigf;z{JsGjC4NvHH!_TB5YZocM%;dQ=PFmm+aa0jXE2^$- zY$yMj6!yeY-xAs{H{1_g88`z$$ben*sGoI=4wk}Y#P?9xb62|c3(K{O0IX**kcXDK zbtMXsZ^gN&HMghW)6#SY`;eJ04Cw8J%mi~k*`BfeBp*cIs+zQ6u9BnA^Kt*Ez+_Z) z^L|j0VV?CPv@P+&RKPFN{`;j^baQo2N1w@+Cru7jI-+Nyz9QN>%Xw{g&VIi@!0p~L z^I08*u6F!-S(4u?=>_TRK8l2vu(87>=DSfm#TMZGlKs|hECBKr8KA#;J$F;=MoGn5 z5&){Renw{FujNs||0FHfJ=(Gm47eyCOx&`VL4dT+D`!|BWNdxz2XvV#i@3f~G;I~> z8B>|P7gYKsr3KiadkVnRz=cQ-doexuG|EI<*11B;zami7=p=VNbLwtA7fwNQ%Y4T* z8%!&d&&m?e?(7r|o z?5S~jcY<wUvM;R+=+)jsio0MJ7{lS1Hqued98Myvtwy2>%%y8=iC zz%Kuwc+0tUO*Yfx8+Ho#YOl?)gfupVxCBznQsJ|A2pBkJ^lNDOX2hhlUu~ z4K8tfwkKdFx*q^AKHt2R>fSSoKKUG9i0@V4Tocr5fHk@Sn^C!Xan67jo8_VwTWO*m z)!Oq5VOCG-!4ayD(ebT+0@|NHH=p2qm(T?)=ATR)W*_^Bi(3W?qn|vvJ_|9PHEVXm zH&AQMrUqOhfum=Do=&Ieu4Qtm&~P7?&zb|RdH6QmUyjM7>P>M7sDm942H7agHIT`0 zlJn*|D2t%!BpstNh!Pn7jsDsAY}X$oMpprX%khE=m>fzCJ^M78^97}Y(sB=3P6)>6 zts%5M_w~f*%BMkZQvirdlT{x>CgU=-Z*B2eI9Sr2@`~GDZ*72*)ovWBVyy}T2vn3ZEL2GRIj(zr3Na1tpdAyW~G-w zPAdRX%pD9W#g$~n=Ovve{xq$fKf_Uzuc&N8c?A4@Y78J?ktb&xm|CE?uE$Uv1*6}J z*y2w1HiOy&#d*Doz!OPyTzkYILX#`SE4kNa3{6YyYAk383yDj4jnupuldew1#WI4+ zSGAks%k3RQ;8k;}_;R?zQgAf3awi5#w2YuAw42LR^vL%tGC$zX?OVY;(CG~OF39M7&{j`1Rg+946j)Yf5_-C%h^fisDT?2K^{DiQ{U^j&_ z(MCRz>y?;WOQmQ#@fMt{d>?7_o|L0)W30~$`quFSi0 zT}|47O}^fJ-gY=sJVR*2I6J%uInkOW1J}wC3;i7VgZ?#+4r8#RC>~2__`L);Q0Pwa zL_*AUc;u4Rf`pUkn9ihrnDT?HK5CKnyFgaEzFK?BT$VroxX<*JWemnTr}Ag8hv!ap zje8Em*kRY6f8b&Hqpgp(Aa6Bk{Ooc@Ok5FgYBaj9y?VUG1Xsw^_;_defq)V&ysNG5 zIuMU5-u=chwlE2R;{k>Yey`_Y=8b^uq91Pli^7+th6lxkUgU)WBZYCsP-s~#YQOha z7l&jUUU<+N@AJk{=ibbCuRcZT^D`5?=1W41YX}>!Q{^WoW&M_EOr!-Blis-rC(2E{ zn58_oux9$LX^zuT}&NYm#)2gy#9VpOG zW(}ufqvCMCz^j~VqPk6OT5r0oy^Q^;!~|OR==J9|in``IC->N=+7Yf&0HBLEl4uAp zsLF<-D(rBVz$mSUrAs}>3jIG1)lyz0a9kmExuI$N2>VcgP%`t?X~v9JaX*lsM30@c zbJH8_GWkI5AIv;A<@Lt63l3MmUCu|<-ZKnf5kG04J zOsDnCPFgSw(0^$5+3=dcZog`!8OuKYj9e3`z8hfKSu)p@b`F@-&v!t6rQZmp;uP_t zPd<>bAM7hLuh6(UWd|xg223xIG=qho@%M@qa}n?R+k-ma`HXJq9^pblY%n?Dz>emA zR{;>18exjvNQvWJbCHrj4U9i*YY`RZ1DDoN%ms#1hob-W^#%Vu;`cpc%1<^J>n&=(4! zoR_N&)Ekv083oHrd5ZP-E(>>LNbi$o-(h;NZqEJOO6l~Kb$F)JYb{b%7BIy=46C4w zc>?G9wMAo*2$eJn0VUC)PO;rK+4aL5cPbcGU^KKXliDV9w?pp@Jv?;bcNIdEqkbNK zF{M9p9PKJg+tRp59Y(4Dw4@b%uq()%+U{8|R+8x5~i}3Ay>~VHTG#=Tk^fB zoi}}=O|gEM6ky7k?pv5dxji*27~&K?4k~@ZzZhuSLRE?7F0;)s?F!Evd`aUfGF2rY zv5u$1o^kl3UxuG{wCyF7tt~z(CMgZDOIN>~>uwNEL-jOI0sPEJz?hpsz&nx13-NhX z;nE??jDA-g1#sDdUnRXc(m$`Wt>EI3e78K?<26s|Tv=J$NP*kFBOSWgTb@=d%r^)B zu=Y3`l;J%OJH}pH{ds==K%W*H~3ZkVf(T z>336o@fk6hVP1$9<%OWOY^(#t4N=X08rip~e0E3#(>yrRuHS}KXwX`+q|I;!JH~q< z#KZ_v-J6vKNHH#y8CS#PrB^8}DN&q7r zVzO>)0%qC#{ZZys@pwMP`h~8Qlmd_L4-*lFjO3-kTM_w%ns?M_I#5PRHd;%H;B^9l ziqPdg17w~B%gF(Lk}i^=MOCdc-9Ua zJ>!$_4aT}+4WC(hkWwu)VXWcPeS_x#a8azA85ix-e?)Gd>hFK*F&;L$POjD zn6sJV-dJB%?oCB;y==Tslzx@G{aQ{V-$_6o{^&m=qn)khPx0<yW1j}qKMx1(%?AZKx$4*h$03h6M|-WFwVyZ7Yw!WxPVTm^i3YGRj6t(6 zl(8ab&*FvyqZO%Iy0_z1RcvQ{+sdLG~8X8&PJ{ zdUDJDS^{|qfE_*Elh7dJRIvXt_=?1x?5E8HO+^IArD*W0MmHM(bvrGlZGNO&DG=SQ z*Z;b2Pb}>g)I5kAa{#KB+t^(X9ORC$cLhMlt54htP!s^=+e%vCVoF})#8=wqrp`1U zm=km@kyTLrf}5hP3v@Tkd`6L`Vt@xayHRRf<6}I)p&? zm<&fsbZ6X89r>~5^j`ssk8ks}NWkjm{z-=|E5pc`JZHeA!GJSL;pHS97L@y9^@}`r zIZs(y310*0@)FfrXw4r}PDjkSqtT(5kg z(D$>kfYSs}xbUuuDS+M0Gv}lzWk0#xCW+NhcqBUfORqXMZ}kky43Xie~tGQF5ZO?INXYQgmga9l}5`ADi=eyzC+>>IOA* zdCoh#V#zsIqZwB0GIs<=C)#Zg<9k~vhEUrRRt?yw7&+## zKw(C*G|?`ltXl2t=s0lXFbQWSy4F)+Y(f{->*lXf`^uT>jilc+$A99Db!i`Mqn#7&MP{Slp^z0>y0lrpNUH zD0VZuZ{2osFHk$o>-qU|Y&cP#Ldl`nodiDeO?}(3Tk!ScEjC6L!1D~KTe7NaAjq4B zs$UJTS^(?~g+@9^9FNI={waQ`vCJIEWPMMGxvGhT6Q+T5Dl=lMFW``KQ226a>};cL zl!G$v1EqFU-X2-^Cvf)edIF*XDk#d$-W_KF3~o8v!P?OK7}&_KkYX6a8ge2u1nJua z2G-1o^+)~C59W40U+6tD0@$JOmlbVV8jOnUlXN^vIOcl?m&^R26_nReAE=;iyo&SR z?Qh$6@DD`QcE)EnMzxn)ReTlf4*E-Qf`Js$IRDu78mR&iN4sp+y{T%E%EDdK+%|>W zH$&bvb)yHs9z;J0aPNK{v~UzDpy^d^V=*A$MSk#E?$PVuW23>jN{vpb1p=p|f;nog zK}%vSs;k#N`gytytVDnQmZYwyk)xj<&oCgnUGvkuJ!kIzMX2*TE!Do1A6m zsyIhe>Yj;Qhp+;vf*KbfA$~C{NChx)$7l7o1AAf{T%f(%_Irbh0p?t8j>+l!3VB6J z#kh5WHFc#|iTo{deNq3Qf9^-a@#;6DbbjHQcK9j4>fC+29S`I)2dg<4U5Vq8y@5JI z1FY!J^}9uW5Mx!eO+{wK=_&9?8#IjCIVQe`0J#xJ zbHEKT;Rf6#GBjlQF-y=0VwFtFg0h_rxCAB?Lx~5{(1!IiR0(~c1FA_=$Ez-?2u*hy zab9TDorkg=f#h{EO6kLcwSKa7>0p~6h@--4lpo-Lu4$c#mU4%x{LCeN;C2XH-WGK;l}fo=QiX z4h;!SGK%og;Mh2#rCZQa9y(qUa`-ekQI`lJbA_JCddT%?7xb zgm;+2owI4e2CbWMHNptbdA+!dn<`*#UOQfmQD)^kj@G708uk=;k*~}kUP2Y8=L7_O z8BuhU_el;)*0sQVyw))rQHXHTEk_C2(#+zb8WA-Ca@|=$`+KMubB@v#e0X*?o-#CP zCj@|ICk=J)Yb04Ji3NhhiomRYfUg$?`SgtWy5 z;^5}H!QTcJf#R{H^{)4%OGV?GmpxvmGe*n>rc}T8iGk{X$5*+&FgrLzr+@;FBgoOd=#z58=X(nz#o_lhr@$uuugTY3? zX+En=Xg8YDQo!U4mOx)uz#5v@Nf%I6PC4#fbC1PN)DAd;wLkI_c&_}9lPZ&SV?xv6 z?t-&@(OPAqOTbaDkF{8Hrk>js2xhJPl2cL5wKn=r|1ROv)WtyGUxVXi!S{#E5 zX8^~pi4br*oPWlOI9RyRb&BJXezA#k&$eI>dn#inB_9HO9c4HnH}r)<()J_B}SX}GLEfNo(SS+}7WYH~K zTJKCe`nE514ZliB&z8&xjQFUKb!|X-FcT1X+|f(tfa_~oTO>xtXH+WOaDWc_2_Kw( zmmXH;vyilJ_NaJWN+iYHdGD6}!4y4i!JWlH!y}sAlS=3b01B?ID_hq@zTpDk{f7Y7 zghl0>uiYrbhV?Y@j?UQG^A_AP^8r8@xvA)flx-gtPzDrY6R>nSPziVvwH5ioLn;<1 z#f{s))1f{2X7=rP1pM=(E#qwNTzoxW2==dTU(;f^l|c-$ZhwT~LHz0dB4*c(1%k9t z0zRnY7jXsjQX*&is&V!?VNL#52u=pSGNW8$fYi^AIf*?1)<()$ozIeFHrC*Bjr&LLlIB@`DOwhoSqQ%orYpeh^9tZYJ0&a)1au727Z8yU?4^$e zLvua+k5z87KMgE^Jsf+?rE6Em4n<7`7zFIatc6#{0fo&01!47HU4SZODoD2uK#%LJsXbK`P@j6-|Ondo+h>l&XVqqt2P|zwk%Qi14^9htm(}^gnm27 zhoVI=AQ(wD7xkVmC|!;QI8>_F$d{bZ!M@|TBK0K^OZpCW&xIR7MIGm8N5}QOt%tmY zo*W!xY5=GKRE&Wext!f5>{9cUD%bUX;G54$%(?bezsaRPOjpL@s2GnP`z4^B`BqAs zT-|G21M~vWwSvlep8yn#f4=~r`=#?MGigja@m7KGBi@oTKf0EwzwwYtZnzD-PTYSO zsKiwU2=lHBZB9P6qX-AKMHUjXx&}*7e zT6}nYgXw7VUeoUxk-l5t`oI2z8M6C;qi^`$Z3C=@i+3GIQ=+Ra66(}-r`7;h9cUI7 zJn{CNhOvm+uuvSX>WvL91&~;*5pLR8_BLLwE6~ z?f5eW&n!Lk{`37mrf>7p6tMVDTY~*8R@v+d8TM1aQL(0kTuG8))&q{#r7M1InVzH``R#UQWur8_iTf|QH zox&!j!)D)%yF)EgYsAAPUqLN$d^P3io|B&QG~m?z8?H(Zmvh#$vF^p)r%nUoW^I9l z_D9-(veLG&$&--ftk=AS)vvTR7UL>TGj17_NDaS#)xrPgLgrt5XtyB;{%1z3X>S{K zE|^T5#fgQoCZQ)EE|=i?LIVTWt{HH?P|EyfX2@6 z`Sx!DHLE|_qNci{b-IuH{9!BY=6@mU{%6qMJY{rT{U0mfk2jkyK4(DIW(o;l?d|xb zNm(lyb`8hvg~kNKsl0lM8g4Ylok7=&a9SQmC;OLA>!dwH!IXZYa)uWO+?B7DXJpgg zQfI${4vU?^U2Qx+A*TI-&T)WirX4XBoq8u0+vNmjs?O@6vUA?QChG&A~ZHWO&X+~Gb!=>Waa!-f)(o#wQg!|JhRvT~#f`l@~ouH3<26Gu}lnJ|PkDQZ$m7KN8sxGmO z9L{64F`aJz5l3#rq^$LFZkMVLVC@5GLprqpvHW;REo&(6QbWMoL_1<`)*iT|LFCjq z0f(nW?0&zz9a06H8hHOB2hB3t#V5p=&jrI(>xSVetn8M@bT7bJ9*xb_NLO1G2<_yT z7R9l+GlNEMCOuV3^LttfreBVx?FczCx347X-0#O@9S$G1dAP6T!OI&WHy^%w7#w}o z(f|IIaEu%GLaU!Fd8;qZuTD;P9`7-^fiXv*|)kWO2-rCK^kmwft1Oa;tq=RBPHn}E+j_scdRAKJy z_Sn8qSL}P?X^1X%jk*wxWBsn_2WMVvDv>6DA5yw2OF(4W#f8^Er``qLo6!`tg!xi; zz^y3xX(i$?gs#UG%e_URfvX;@n)=cF2jmDgQA8K)PruqEsYFr~X(;oM&&CJ8FEtWt zsH$P!>lhb9fCb@ZM^Rw#JY?(vq~29XtUvDJBo|q&F@LS;Jiiu617Rvl`MZ-KJ#e@z zt$CiPf$3;7(i<$5Z6}!;#V}RtKoIY@N6CW0uGP;F)qn2|;@(@i6Brv#uv^fSkY4?% zm}*4%Gyq{*6199!kTKz|PnR{GNoba74i!En27`-#%J`W!A}>nUqb{tr4;IUULv0$B zWb4FpX|^X{*Hh;2-4YR_Qhdaj!#f!IF-~yh-XJtxjyAG-cFhA)kpE_gJ$oT3rdFy| zvrsm-&EVEt9gI}znG!Y&!x_;VbF0UE_6{Uh7Np*d)JwN$duxgq%g0a{DKA#%PPE-4 z2>RsFIGMD$%t?@WuZRF0U(`zk?f0e%5xVXc(Ou5@7zKt3ixuBout3c%b+1Yovo9BJ zo2lhe_RZ8_Bnr))##E_ zYO`txKS@JM4G-R~x89Yo2LAUC*u+L%4`PWrIm=1}Te*9HTfAhR|BG|lDmC(AL>p+~V8!bwFJJGpX_%M9d410HmE`BA=ERY+ zCg-p97aXY{>X?kCV(=4^!EnNiwZ>XTQt-;~={Rug4~SEqSc2VB4SKJ4&nL}n6B*dD zq+FYk)=LZ>&th-`4~n?u3&j1l@WAN(onlG%AIo6FH=CS(gSni5=K)W$qV`d8;`G48 z8{-Ge|P^PD4lapBub2S$wx+dE{U>V zkbrVl#&Y596=y=}Mny0}gv)IaQF_bV=&HnuUjtM5dSC|FZ1u`K{((P4UsxzO(7!A& z6j(0H<+Ks&zP!Lcy#QU120GWD;LU)%XY~fbt0)jb-0VdxvDD9`W=pK&s+9R-Lf7d2 zEMNtt|KiWdB2+vJq{BzKTiTwR(hmKx8d}U!5F74XBp<)JfuG$z@twA=p7xGxk;$Og z#Y)8Syn(%oiM7(YShw(5amT6K?lUCym;+W0h|FxvQYrfjlN^!RG2>&kG~{WAi!=%O zSgNSGJPjm(XprVU@n>0Wz%!%yTn2KM8pl`|sPMvF!c;Uwu}F5hi1|4x+Vd?qVuxA- zAt|mU42IfkXO`aoqgRgKibxwb(SD1}95sqgnPMRnVra9_CW}1NblI}O$t4lpp;B2e z!YNGlUPDp&CuyejYeEVrzGtPPecqzWOAMRZ2@|{fDG3)+>P0BqdT+O{BzjcQwmPvt zXn`0wafh{BAEPG&_*2<8`YY8Z7jDA_OLFQKmb&LkF>!*3`7Y-aSnkg%1(v-Fnh)-%6k)zZx9bv_^aI@@}|Cn)k z{S>PWSg`pS&+AQh4pgZ(NnePT#ieIF6BmOEL6~swJ8dNCF^&E)%8qcIhm^#`p&uE| zW5noq+|lRH_K#~eizPuOp{ zb%se#7A&I&4yJ~d7)u8(Sg-=ia@#HvgX~3gB~BDQWO=3g>n8V%$~T7XxX7#^N$K3^ z7heqK1n($1)*ECYiS(MQL*iqDsXLQMKBYB#xwgsJI@lw#_fpo^!-mCSxRcp7qr~AS zLa5`K-rh@-`|{P~{Y0V~K>kHb#Au_v17>5x)J}@@UaMznevOoupAXO{BX2{OL}(+B zG^V{7I(Z=1E@%w)Xl|80M*ds1Ugd7u$Zy`$#(^;D6Z^X7Jgm87y5Xp%0(({ACH>B1 z)(g>9;%Lo{k`fA&WJ|HluD@3pPS!<;|JuwSnvMb}8A7_`57`|PPbL{&LJ zi7cB#4IQ-AdEw>T(b!+qqsIwwL(ZgjT-C6bOUplx(Y5WY1eF0#1M5&qB5A^^qma4b zNAk{ywxiV&tx3~QV7j&g3D*07zrSsa`=gp$1WsyFdRtjZjVyWM`WiYUci6XKOHhzf zF*yeIR4*spUWPk4@giEgxU%t<(^2<^#oWvjhQ@^x`D;JvM9agoRuT%1Yzj z%GQ#b&Nk%&75qw#t`T@xUG4`#Tc74P0+czZZp)acgvGB%I8T6Y_H8KRy2jKFX%(q! z`n`OEG0Kikzi_e>WbR*G!4E7A9~JOGX!!6#@r*(F%*m8+WaY@tr_{X!`k*waL5g|; zb>3EHrnbzGgH_l=8|f%k9>U$TH3H6uhD04bnHxJ+ty6lv`{kXoxpRL^j%kEe$%f-% zo31_o`+rQ{w|7m~zti?QFDCs&iJM5-ENvyN4R2_o<&1>Xr<@#@lRfj(c{%rdOtYbv zgc!ATh?Gbl)9II=RNWmpJ*H`ee$*pTxqERoEeQ785%-i?8MA{~BI~K-YDQFbiwtg^ zunnk5XH{FKQxD0dbaJy zCR;G#Zi8#}u{IF1E*ODn@G@gcb@=MAD@*Rd8;T7LcTj8JFCo`hLD5<0M#B{>#)nG0 z;U6Vjf5T&$z>$1W<`e>BN>dn;W&V)04r+{g0BB&WoOEmlJh3`NypOMg>Itd;; zcYkcNV`RonmCk8gwCZo zz4bj-xK*@m>f@(e&WkkCj*Nc2p<>3lCb2oG?PYasys`dZNM6I=W% zo*tY30LWwEJdJ#tmd8wyvkGm%K;Jn*s0dvwzbun?fF(n2F7BX7p z?!%e}W&l%d)E+N~FEgpo%{;TK13DMDXE7va)&#*9n^=1adxR3IJJjU_<l$^dy-EOTAE%7Xf3TAdYgD!-!W7A))%ON@W?2E^ zJGbF^Et?Ly?}}1TdBYnXeNx^7v(p!n!sA}w>sUiQ0v5H&l{*Ge#{G8EPvgck6o(S3 z8da%y_*=6MS7VihdBO`k8;D2FoBp@=&Jj&JD1248A-FdUiJPq={NM69 z)2j3zRx@8jU-1|cUrf-Q9$L~%|Gmyifp?FWKc9l&K~X-wO)s#o1l%U6MdgVE+<%fF zGo05^7m`DiDS0M#D&ik|s5fwDeUWdm>`A%ELa4Wk+i|ihtU95^AV`(!E>c$2af%8y z*IJMBh;bm!2UC*sAI#Ts<^(R(1;Ipu2N$#&czYO5vP=oy5Eq*Um+t}2l&hmNHZnxx zjK7j|fr~4wNxMbqmc$;qUgc^RU8cmhLHVt^B1bhZQazM48bym152J{6=Pr}h*k(=k zH4#W-QTxF+drh?Jo}&ifng_`2{CI7-xu1B}@PAb>{(ohE=^dYMS2|9LwaKU%Pd{I1 zBY%9|v3fW{C_d>$T32%$LJwR>{fe8s`H;DguPG14@$vl=J9?R+3cw!D5B*q{If?Ra z0H~44qz}?SdZu@$cUdp1uQM&Q5i=|VcVD_HQJ3QBDE+?wvJ9%XSkbxTYHN*~FuW}V z5~}n0?Rvp&=GNFPH|`*NOyi)Fv>MM4^0nMZVgBpz{&mS#9gd@X zHdk~2y(bP02=Srr)4Cq3d2mle(`-!0`vW&*B8k;fi?h&Hw3G=m(E3jG z{USR!gI3XeYN%w`#an>#r8|?BHu|l;Q5bL`l6Nbg7`064+MpP0dgV^JIyrZTE}t`m z4}qTbxNnEIjflt?72|0;RD286XbVXnB613h&AEzeS+(6OA+^{4b1b){6 zJVb?eHu(MtG1brc;INRFiL(y5*=h2`c*8GJbp#Yv!g6UfR3oZ*6<&8(WVGz@Cxi?H z(CElC?}Z4Bu!{q<0|8Z19XA@TIdyn1So zcPHiBG!6Wo1n}QL4NqCP&6iLG%^oc&Vxa-FGi42=M&&$9T=G`c-&GPEr_1qJ##L`X zCaaRcP3ruSrHLU7c&_a;Ach{~Y5OO_^q&_)!(O+s`_mC7%;WuUinJv%%lEz$T#X}t z?rwkopteQER&x4BxEX$pCqH;|%C~#n1NE2J=FucCCEa;jW=D6*+gER^!n~g8x%BO7 z{IqyISCcsiZL53`Y?YE+cFTUD>AZ}ui2|<)COoxWYeR@_ewoJd-;`?L*BjtUxLs%m znZs+hRxz9(iPMt}2kuD;F6g6;n%a~!cz2)GP%ZiY#0TGT9Vnbzsg<2N_me&~*~$tA z@zp&tu$3^na-qIy`?l>5w=VW~6e)VNBtJ8G7NWTKQ~HIco%{Mce6K%L`{iwy`#FTx zw)dwmKETVg9M6CF#3#1BfU(En{q8(s>%M{c))rE2!$bsSX|kHi8X9IIa6KM1U&lK7 z+Qvd-+TM-jj!aOSW1+Lo$39d*mPs@_DZn0?-buBUnBooC zV$)`w{}fMOSHt~?jn54{l)ka(V{qa-YY~wMtaz2i&g0ezH39PE3fm+Av&5Mfem-Yh zrl$S*O5{VGt9|v#reb=@*yJ4y)M!YMOjl^=cKO$!X^6MGvljWWHl|;qpyuxQ@|~09 zwn{DSMk9>bdkY$MmiPinxn+Q6d?}F`W*+CbqrJz{C3y2vzrx4A5!S2pe|g>hPH=v2 zX}%s*PPMQR@(S=Sesg;`^GS50+`!$a2J1&=FR>4;rK6noPxY-iT^WRf$epQrG9}ft z{*HUMS{^585PVirWni9*uijMajrJ^YH6#|%Y(kws{juKk950c2Yj*m`U-}39awv6^ zLp*-vz-4H2FmDex3qHnhdeqBZ z9T>WB$l!psSt;qmXWb+aQ%?(IDOlD~9=LMrR_OS6j~=)~U6OE@@@eh7#-iUN%G7y5 z!}6Zt7p_pxihVf&;bu|wKDn$MhjRpeY2G#ZF3Nb(g13L0Ubr!^**m7VhpRq4snHbE zsC^y>#B*{g9PBxkP3lgzf(&c+ohBlhnf|7cof{l0?_|~fk+{gTG%!?A*Tu%8tL7u} zA6#q_SQBnQh>Gf=Qdb6ZWX;#A=OYrv<6YUoN8ik@p;UHCd9hoXqopG-Vo@LIzlKhU zbM2d8;TWD?-?vF8`|yV4rcqc9)_!LV7}%?Q^TIKyo}q#Mi*eCrQ(j1Vp_=Ayx_`!6 ztI4Ed7iU#UMbKzFEZY|ko6fD?K#{k^EyY7YEn@GnPIJip zi$p3|jo0w#f9~iO-o20S^mjJRXWzj+lcB2A%!l`G0%d4*G4WvS*IQ!V7iFl5I_XtI z{7;i#bc+WF@1tpWll7Y*3M-AE*Tj>s?BKU=-|So*tu739dOP>V%S&y^%yS=1Lv{Dq z+S8yo5^F?!fRii`r}QvzqOg~ijmQjE zQ+Uk4*Ip874sNS4NtmPw)iG8`o!n8wk** z!PFu32U|&zx(j(+%I&5gY03Uy)gKd9Th7<)U_i%?RG_$&$@jvzqlOD9wI!Q6}944JM_Xs}7u{%y4Ms^k4TrJ#L!}iu8SG#NTX14bt z9{=XKf%E@Y0kFPMw`ye!_cQX!UESxA8V^dW<(2YMZ4Pz?1=G zV0M*vX!r=Gr^WuKbn?IXn*YE5I^(`O_f16O8?ANZPne2XVX`9;U#k~opc+CAl#b2eXGrU^w2ae zi=7}Wn)~@1ui@aB@Pvoy)RHeAbJUP-e3Wtnx$_;+I*t6=IQ$xH! zVjHTIY?rspfcYOC>NJ`3SmMox`E0iyg>FctHs7nBD94oxk03D6cDTp5`DkqZC*Z_v zwTZmoK%a@CXhIhzWRN`=iu^ET_Xsiw9I4a$<)xpE*=W@qzAF@iJ2{BTr81*sO-(IL z-PoFax1xaCK7BY@Su(@b8haNJR$gmU{*U6S#f{>4CY#SH^>!35DxKB;*E8x&Z%V{V zNLuHXm>txsnrnVdp|a>7;ptL6FwfN=ZEV(;22}(r1i!NfQJk1mE}AO=MyZkWKhb18 zTOnbHnk|G&Z_h!ADq^rfbmU-xT-zJ!n2Oi4%sKGbHi^n!h#b&pg*Ojj4 zJC_0;G0UYMRu))Rrgsz)Ljyv(@ONiJ5dwO-B4%p&&MiXMvoflv7MBCCEB^D9Kc!i3J+Mk=9{^h)+D5K9!Epo$M5&j{Mf6L?<*3EB#|JL+2 zO1R&f=MzL*h8@#N9j;DV?Xp=2_Qg>i^OQ`pWugSb*aP!Mv4))>B!SF&Es0SOq z1?)^@G^!GIiaaz__FmHLrD*?5pL7TCWP_%d9k~3ehA}s5AJ$9=uFpntJN%}2J1-G> zH)p(P!vo}-C*|K0a>s476T4((ID;$4$z?J2!B!3WuG1cU@in50Z3#WPU^B=;Z@P~( z?L=0%4CihhglwOh)W3eG#a~`(>9^hf(g6IzGc5Dy*};6*Jzo18M_YEa9`b*F2!C#y z*O%R=|4uC5#_789i>zeDy{pl}=j0_%f4&~)b9Z5U?I`)x@!2Ie&r&84qt5(_f`@i* zRHJ{NWLvZ?ovuoRA#fi-+6qgZFvy3%qHF@BmnnF;keD3H2+UVpa;Zp3bPVG3Z&EtL_%I}Xx_cT8f2!pwdV&U~LY4H_PU;|0KKWvHM z{d;`7zhjgB?o|?PE}Ok<3=cnz?sXIJlxVG}^+fl3TxkicHjjg=j>T#dk|QSl386NJ$XdJxNg|{24REZMK9^TeNyEabe;qQz`;xcmBil>6k$9Fe~)V%?b?*F_| zV1M-Y4bstlgMWYQFSGIQ0r|^t@bUe7KzIk_PXC#<`T(9*zWWbeI-`ETn1rXg?2P?t QAGq+#m7jBUZ~pqf0FSe~%K!iX diff --git a/docs/docs/behaviors/key-press.md b/docs/docs/behaviors/key-press.md index f048b686..12d4094f 100644 --- a/docs/docs/behaviors/key-press.md +++ b/docs/docs/behaviors/key-press.md @@ -33,11 +33,6 @@ provided by ZMK near the top: Doing so makes a set of defines such as `A`, `N1`, etc. available for use with these behaviors -### Improperly defined keymap - `dtlib.DTError: .dts.pre.tmp:` - -When compiling firmware from a keymap, it may be common to encounter an error in the form of a`dtlib.DTError: .dts.pre.tmp:`. -For instructions to resolve such an error, click [here](../troubleshooting.md###Improperly-defined-keymap) - ## Key Press The "key press" behavior sends standard keycodes on press/release. diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 0f2ea4c9..b163e7ba 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -26,28 +26,35 @@ Variations of the warnings shown below occur when flashing the `.uf2` An error along the lines of `CMake Error at (zmk directory)/zephyr/cmake/generic_toolchain.cmake:64 (include): include could not find load file:` during firmware compilation indicates that the Zephyr Environment Variables are not properly defined. For more information, click [here](../docs/development/setup.md#environment-variables). -### dtlib.DTError +### West Build Errors -An error along the lines of `dtlib.DTError: .dts.pre.tmp:` during firmware compilation indicates an issue within the `.keymap` file. -This can be verified by checking the file in question, found in `mkdir/app/build`. - -| ![Example Error Screen](../docs/assets/troubleshooting/keymaps/errorscreen.png) | -| :----------------------------------------------------------------------------------------------------------------: | -| An example of the dtlib.DTError when compiling an iris with the nice!nano while the keymap is not properly defined | - -After opening the `.dts.pre.tmp:` and scrolling down to the referenced line, one can locate errors within their shield's keymap by checking if the referenced keycodes were properly converted into the correct [USB HID Usage ID](https://www.usb.org/document-library/hid-usage-tables-12). +West build errors usually indicate syntax problems in the `.keymap` file during the compilation process. The following are some examples and root causes. :::note -If you are reviewing these errors in the GitHub Actions tab, the contents of `.dts.pre.tmp` is output (with line numbers) in the next step of the build process. +If you are reviewing these errors in the GitHub Actions tab, they can be found in the `West Build` step of the build process. ::: -| ![Unhealthy Keymap Temp](../docs/assets/troubleshooting/keymaps/unhealthyEDIT.png) | -| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| An incorrectly defined keymap unable to compile. As shown in red, `&kp SPAC` is not a valid reference to the [USB HID Usage ID](https://www.usb.org/document-library/hid-usage-tables-12) used for "Keyboard Spacebar" | +#### devicetree error -| ![Healthy Keymap Temp](../docs/assets/troubleshooting/keymaps/healthyEDIT.png) | -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| A properly defined keymap with successful compilation. As shown in red, the corrected keycode (`&kp SPACE`) references the proper Usage ID defined in the [USB HID Usage Tables](https://www.usb.org/document-library/hid-usage-tables-12) | +A `devicetree error` followed by a reference to the line number on `.keymap` refers to an issue at the exact line position in that file. For example, below error message indicates a missing `;` at line 109 of the `cradio.keymap` file: + +``` +devicetree error: /__w/zmk-config/zmk-config/config/cradio.keymap:109 (column 4): parse error: expected ';' or ',' +``` + +#### devicetree_unfixed.h error + +A `devicetree_unfixed.h` error that follows with an "undeclared here" string indicates a problem with key bindings, like behavior nodes (e.g. `&kp` or `&mt`) with incorrect number of parameters: + +``` +/__w/zmk-config/zmk-config/build/zephyr/include/generated/devicetree_unfixed.h:3756:145: error: 'DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_12_PH_P_label' undeclared here (not in a function); did you mean 'DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_16_PH'? +``` + +In this example, the error string `DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_12_PH_P_label` indicates a problem with the key binding in position `12` in the `symbol_layer` of the keymap. + +:::note +Key positions are numbered starting from `0` at the top left key on the keymap, incrementing horizontally, row by row. +::: ### Split Keyboard Halves Unable to Pair From 32c8737a2225ce03455d7df0145a96a451672c7b Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Thu, 7 Apr 2022 22:31:05 -0700 Subject: [PATCH 045/494] fix(docs): Fix cmake version requirements --- docs/docs/development/setup.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/docs/development/setup.md b/docs/docs/development/setup.md index 26d667b6..bf1bd122 100644 --- a/docs/docs/development/setup.md +++ b/docs/docs/development/setup.md @@ -70,9 +70,7 @@ sudo apt install -y \ ``` :::note -Recent LTS releases of Debian and Ubuntu may include outdated CMake versions. If the output of `cmake --version` is older than 3.15, upgrade your distribution (e.g., from Ubuntu 18.04 LTS to Ubuntu 20.04 LTS), or else install CMake version 3.15 or newer manually (e.g, from Debian backports or by building from source). - -There is also a [zephyr bug](https://github.com/zephyrproject-rtos/zephyr/issues/22060) with cmake 3.19.x. You'll need a version _below_ 3.19. +Recent LTS releases of Debian and Ubuntu may include outdated CMake versions. If the output of `cmake --version` is older than 3.20, upgrade your distribution (e.g., from Ubuntu 20.04 LTS to Ubuntu 22.04 LTS), or else install CMake version 3.20 or newer manually (e.g, from Debian backports or from PyPI with `pip install --user cmake`). ::: From 22c487f2767b6eaed14366379f6c3a07687ab6de Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 8 Apr 2022 01:59:19 +0000 Subject: [PATCH 046/494] feat(boards): Add BDN9 rev2 RGB support --- app/boards/arm/bdn9/Kconfig.defconfig | 6 ++++- app/boards/arm/bdn9/bdn9_rev2.conf | 5 ++++ app/boards/arm/bdn9/bdn9_rev2.dts | 35 +++++++++++++++++---------- 3 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 app/boards/arm/bdn9/bdn9_rev2.conf diff --git a/app/boards/arm/bdn9/Kconfig.defconfig b/app/boards/arm/bdn9/Kconfig.defconfig index 9af7ca4c..17695185 100644 --- a/app/boards/arm/bdn9/Kconfig.defconfig +++ b/app/boards/arm/bdn9/Kconfig.defconfig @@ -1,6 +1,6 @@ # keeb.io BDN9 board configuration -# Copyright (c) 2020 Pete Johanson +# Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT if BOARD_BDN9 @@ -14,4 +14,8 @@ config ZMK_KEYBOARD_NAME config ZMK_USB default y +config ZMK_RGB_UNDERGLOW + select SPI + select WS2812_STRIP + endif # BOARD_BDN9 diff --git a/app/boards/arm/bdn9/bdn9_rev2.conf b/app/boards/arm/bdn9/bdn9_rev2.conf new file mode 100644 index 00000000..36910853 --- /dev/null +++ b/app/boards/arm/bdn9/bdn9_rev2.conf @@ -0,0 +1,5 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment the line below to enable RGB. +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index a28a3ae5..8a66be07 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -18,9 +18,7 @@ zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; zmk,kscan = &kscan; - /* TODO: Enable once the GPIO bitbanging driver supports STM32 zmk,underglow = &led_strip; - */ }; kscan: kscan { @@ -40,17 +38,6 @@ ; }; - /* - led_strip: ws2812 { - compatible = "worldsemi,ws2812-gpio"; - label = "WS2812"; - - in-gpios = <&gpiob 15 0>; - - chain-length = <9>; - }; - */ - left_encoder: encoder_left { compatible = "alps,ec11"; label = "LEFT_ENCODER"; @@ -83,6 +70,28 @@ }; }; +&spi2 { + status = "okay"; + pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; + pinctrl-names = "default"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <9>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + &clk_hsi { status = "okay"; }; From 8c99313a6781e7ff37149c711766e35c34c12fb2 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 16 Mar 2022 17:50:57 +0000 Subject: [PATCH 047/494] feat(blog): Add SOTF #5. --- docs/blog/2022-04-10-zmk-sotf-5.md | 265 +++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 docs/blog/2022-04-10-zmk-sotf-5.md diff --git a/docs/blog/2022-04-10-zmk-sotf-5.md b/docs/blog/2022-04-10-zmk-sotf-5.md new file mode 100644 index 00000000..b0dd6310 --- /dev/null +++ b/docs/blog/2022-04-10-zmk-sotf-5.md @@ -0,0 +1,265 @@ +--- +title: "ZMK State Of The Firmware #5" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [SOTF, keyboards, firmware, oss, ble] +--- + +Welcome to the fifth ZMK "State Of The Firmware" (SOTF)! + +This update will cover all the major activity since [SOTF #4](/blog/2021/01/27/zmk-sotf-4). That was over a year ago, so lots to cover! + +## Recent Activity + +Here's a summary of the various major changes since last time, broken down by theme: + +### Keymaps/Behaviors + +Since last time, there have been several new powerful keymap features and behaviors added, including several asked for features, such as tap-dance and macros. + +#### Caps Word + +[petejohanson] added the [caps word](/docs/behaviors/caps-word) behavior, i.e. `&caps_word`, in [#823](https://github.com/zmkfirmware/zmk/pull/823) that allows toggling a mode where all all alpha characters are sent +to the host capitalized until a non-alpha, non-"continue list" keycode is sent. This can be useful for typing things like `CONFIG_ENABLE_CAPS_WORD` without having to hold down shift. This is similar in spirit to using the caps lock key, but with the added benefit of turning itself off automatically. + +#### Key Repeat + +[petejohanson] added the new [key repeat](/docs/behaviors/key-repeat) behavior in [#1034](https://github.com/zmkfirmware/zmk/pull/1034) to allow repeating the last sent key-press again, including any modifiers that were applied to that key press. It can be added to your keymap using the simple `&key_repeat` reference. + +#### Macros + +[petejohanson], taking heavy inspiration on the initial work from [okke-formsma], added [macro support](/docs/behaviors/macros) in [#1168](https://github.com/zmkfirmware/zmk/pull/1166). Several [common patterns](/docs/behaviors/macros#common-patterns) are documented, but one example, changing the underglow color as you activate/deactivate a layer, looks like: + +``` +ZMK_MACRO(layer_color_macro, + wait-ms = <0>; + tap-ms = <0>; + bindings + = <¯o_press &mo 1> + , <¯o_tap &rgb_ug RGB_COLOR_HSB(128,100,100)> + , <¯o_pause_for_release> + , <¯o_release &mo 1> + , <¯o_tap &rgb_ug RGB_COLOR_HSB(300,100,50)>; +) +``` + +#### Tap Dance + +[kurtis-lew] worked diligently to add the [tap-dance behavior](/docs/behaviors/tap-dance) in [#1139](https://github.com/zmkfirmware/zmk/pull/1139), allowing different behaviors to be invoked based on the number of times +a user taps a single key in their keymap, e.g. + +``` +/ { + behaviors { + td0: tap_dance_0 { + compatible = "zmk,behavior-tap-dance"; + label = "TAP_DANCE_0"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&kp N1>, <&kp N2>, <&kp N3>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &td0 + >; + }; + }; +}; +``` + +#### Conditional Layers + +[bcat] added [conditional layers](/docs/features/conditional-layers) in [#830](https://github.com/zmkfirmware/zmk/pull/830) as a generalized version of the common "adjust layer" pattern on smaller keyboards. + +Example: + +``` +/ { + conditional_layers { + compatible = "zmk,conditional-layers"; + tri_layer { + if-layers = <1 2>; + then-layer = <3>; + }; + }; +}; +``` + +#### Combos + +[mcrosson] added the [layer specific combos](https://zmk.dev/docs/features/combos#configuration) in [#661](https://github.com/zmkfirmware/zmk/pull/661), so users can make certain combos only triggerable when the layers set for the combo are active. + +This is used by the [ZMK implementation](https://github.com/artseyio/zmk-artsey) of [ARTSEY](https://artsey.io/) extensively. + +#### Sticky Keys + +[okke-formsma] updated [sticky keys](/docs/behaviors/sticky-key) in [#1122](https://github.com/zmkfirmware/zmk/pull/1122) to add the `ignore-modifiers;` property; when set, sticky keys won't release when other modifiers are pressed. This allows you to combine sticky modifiers, which is popularly used with ["callum-style mods"](https://github.com/callum-oakley/qmk_firmware/tree/master/users/callum#oneshot-modifiers). + +#### Hold-Tap Improvements + +[jmding8](https://github.com/jmding8) added an additional [positional hold-tap configuration](https://zmk.dev/docs/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) in [#835](https://github.com/zmkfirmware/zmk/pull/835) to help certain sequences produce the expected results. + +[jmding8](https://github.com/jmding8) also added an additional [hold-tap flavor: `tap-unless-interrupted`](https://zmk.dev/docs/behaviors/hold-tap#flavors) in [#1018](https://github.com/zmkfirmware/zmk/pull/1018) which works very well with the new positional hold-tap config. + +[okke-formsma] implemented [`retro-tap` hold-tap property](https://zmk.dev/docs/behaviors/hold-tap#retro-tap) in [#667](https://github.com/zmkfirmware/zmk/pull/667) + +[okke-formsma] _also_ added [`quick-tap-ms` hold-tap property](https://zmk.dev/docs/behaviors/hold-tap#quick-tap-ms) in [#655](https://github.com/zmkfirmware/zmk/pull/655) + +### Apple Device Compatibility Improvements + +#### Pairing + +[petejohanson] did some sleuthing and fixed a long standing problem with inconsistent pairing with macOS in [#946]](https://github.com/zmkfirmware/zmk/pull/946). With the changes, macOS more reliably pairs with ZMK devices. + +#### Consumer (Media) Codes + +Another persistent bug that Apple users experienced was related to crashes and problems with keyboard configurations, that was traced to an issue with ZMK's HID usage that was fixed by [petejohanson] in [#726](https://github.com/zmkfirmware/zmk/pull/726). + +### Debounce Enhancements + +[joelspadin] applied some major enhancements to our [debouncing](/docs/features/debouncing) approach to allow fine grained control of our debouncing in [#888](https://github.com/zmkfirmware/zmk/pull/888), including allowing [eager debouncing](/docs/features/debouncing#eager-debouncing) which can reduce key press latency. + +### Split Improvements + +#### Behavior Locality + +The long awaited locality enhancement was finally merged by [petejohanson] in [#547](https://github.com/zmkfirmware/zmk/pull/547), allowing more fine grained control of where certain behaviors are invoked. Some key improvements thanks to the changes: + +- [RGB Underglow](/docs/features/underglow) behaviors now run globally, so enabling/disabling RGB, changing the color, animation, etc. applies to both sides of a split properly. +- [Reset](/docs/behaviors/reset#reset)/[Bootloader](/docs/behaviors/reset#bootloader) behaviors now run wherever the key was pressed. For example, adding a `&bootloader` reference to the peripheral side of a split will now put that side of the split into the bootloader when pressed. + +#### Split Connections + +[petejohanson] also added fixes to improve split re-connection for certain scenarios in [#984](https://github.com/zmkfirmware/zmk/pull/984), helping ensure splits properly connect when one side or the other is reset. + +### Hardware Support + +#### Backlight + +[bortoz](https://github.com/bortoz) added [single color backlight support](/docs/features/backlight) in [#904](https://github.com/zmkfirmware/zmk/pull/904) for those keyboards that have it as an alternative to RGB underglow. + +#### E-Paper Display (EPD) Driver + +[petejohanson] worked with [LOWPROKB](https://github.com/LOWPROKB) to add support for the E-Paper Displays (EPD) in [#895](https://github.com/zmkfirmware/zmk/pull/895) used in keyboards like the Corne-ish Zen. + +#### nRF VDDH Battery Sensing + +[joelspadin] added a new sensor driver to support battery charge calculation by sensing voltage on the VDDH pin on nRF52 chips in [#750](https://github.com/zmkfirmware/zmk/pull/750), which is particularly useful for designs +using "high voltage mode" with that SoC. + +### Miscellaneous + +#### Documentation + +[dxmh] and [caksoylar](https://github.com/caksoylar) have joined the ZMK organization to help with documentation, and have been doing an amazing job adding new docs, and leading reviewing docs related PRs to free other contributors up to focus on other areas. It's been an incredible addition to ZMK! + +#### NKRO Support + +[petejohanson]'s work on the HID foundation also included adding support for full NKRO HID in [#726](https://github.com/zmkfirmware/zmk/pull/726) that can be enabled by adding the following to your `.conf` file for your config: + +``` +CONFIG_ZMK_HID_REPORT_TYPE_NKRO=y +``` + +#### Power Profiler + +It's been live for a while, but [nicell] added an amazing [power profiler](/power-profiler) in [#312](https://github.com/zmkfirmware/zmk/pull/312) to allow users to estimate their battery life for various hardware configurations. + +#### Min/Max Underglow Brightness + +[malinges](https://github.com/malinges) added support for configuring min/max underglow brightness in [#944](https://github.com/zmkfirmware/zmk/pull/944) by setting the values in your `.conf` file as percentages of full: + +``` +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=20 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 +``` + +This can be useful to be sure that lowering brightness doesn't set the brightness to zero, and raising the brightness doesn't consume too much power. + +#### Zephyr 3.0 + +[petejohanson] helped prepare and test the upgrade of ZMK to Zephyr 3.0 in [#1143](https://github.com/zmkfirmware/zmk/pull/1143). The updated Zephyr release brings with it some key BLE stability fixes, as well as various other core improvements that improve ZMK. This was a huge undertaking! + +## New Shields + +- Contra in [#633](https://github.com/zmkfirmware/zmk/pull/633) - [iangus](https://github.com/iangus) +- Naked60 in [#681](https://github.com/zmkfirmware/zmk/pull/681) - [xiushak](https://github.com/xiushak) +- Murphpad in [#806](https://github.com/zmkfirmware/zmk/pull/806) - [kylemccreery](https://github.com/kylemccreery) +- A. Dux in [#951](https://github.com/zmkfirmware/zmk/pull/951) - [dxmh] +- Bat43 in [#956](https://github.com/zmkfirmware/zmk/pull/956) - [dnaq](https://github.com/dnaq) +- Zodiark in [#959](https://github.com/zmkfirmware/zmk/pull/959) - [Aleblazer](https://github.com/Aleblazer) +- Osprette in [#974](https://github.com/zmkfirmware/zmk/pull/974) - [smores56](https://github.com/smores56) +- Knob Goblin in [#990](https://github.com/zmkfirmware/zmk/pull/990) - [lucasuyezu](https://github.com/lucasuyezu) +- Redox in [#1002](https://github.com/zmkfirmware/zmk/pull/1002) - [toddmok](https://github.com/toddmok) +- Elephant42 in [#1009](https://github.com/zmkfirmware/zmk/pull/1009) - [filoxo](https://github.com/filoxo) +- Chalice in [#1022](https://github.com/zmkfirmware/zmk/pull/1022) - [joshajohnson](https://github.com/joshajohnson) +- Boardsource 5x12 in [#1027](https://github.com/zmkfirmware/zmk/pull/1027) - [fsargent](https://github.com/fsargent) +- Jiran in [#1048](https://github.com/zmkfirmware/zmk/pull/1048) - [krikun98](https://github.com/krikun98) +- keeb.io Fourier in [#1056](https://github.com/zmkfirmware/zmk/pull/1056) - [TheButlah](https://github.com/TheButlah) +- Lotus58 in [#1090](https://github.com/zmkfirmware/zmk/pull/1090) - [nettema](https://github.com/nettema) +- Clog in [#1092](https://github.com/zmkfirmware/zmk/pull/1092) - [smores56](https://github.com/smores56) +- Kyria rev2 in [#1112](https://github.com/zmkfirmware/zmk/pull/1112) - [petejohanson] +- Leeloo in [#1165](https://github.com/zmkfirmware/zmk/pull/1165) - [ClicketySplit](https://github.com/ClicketySplit) +- 2% Milk in [#1135](https://github.com/zmkfirmware/zmk/pull/1135) - [kurtis-lew] + +## New Boards + +- Ferris rev02 in [#642](https://github.com/zmkfirmware/zmk/pull/642) - [petejohanson] +- nice!60 in [#810](https://github.com/zmkfirmware/zmk/pull/810) - [nicell] +- nice!nano v2 in [#867](https://github.com/zmkfirmware/zmk/pull/867) - [nicell] +- Mikoto 520 in [#985](https://github.com/zmkfirmware/zmk/pull/985) - [mrninhvn](https://github.com/mrninhvn) +- S40NC in [#1021](https://github.com/zmkfirmware/zmk/pull/1021) - [kylemccreery](https://github.com/kylemccreery) +- BT60 in [#1029](https://github.com/zmkfirmware/zmk/pull/1029) - [ReFil](https://github.com/ReFil) +- Seeeduino XIAO BLE (as part of the Zephyr 3.0 work) in [#1143](https://github.com/zmkfirmware/zmk/pull/1143) - [petejohanson] + +## Board/Shield Metadata + +[nicell] and [petejohanson] worked together in [#883](https://github.com/zmkfirmware/zmk/pull/883) to settle on a [metadata format](/docs/development/hardware-metadata-files) that is used to document every board and shield. This now drives automatic generation of our [supported hardware](/docs/hardware) page and our +more nuanced GH Actions automation for testing changes to ZMK. + +## Coming Soon! + +Some items listed in the last coming soon section are still under active development. + +- RP2040 support +- Peripheral rotary encoder support +- Caps/Scroll/Num Lock LED support +- Mouse Keys +- Wired split support +- More modular approach to external boards/shields, custom code, user keymaps, etc. +- More shields and boards + +## Statistics + +Some statistics of interest for ZMK: + +- GitHub (lifetime stats) + - 105 Contributors + - 791 Closed PRs + - 849 Stars + - 832 Forks +- Discord Chat + - 3430 total registered +- Website (last 30 days) + - 35.9K page views + - 3.29K new users + +## Thanks! + +As we approach the two year birthday for ZMK, I am reminded of how far we have come in such a short time, in large part thanks to the _amazing_ community that has grown around it. I am so grateful to have so many contributors, testers, and user believing in the project and helping make it a joy to work on. + +[okke-formsma]: https://github.com/okke-formsma +[mcrosson]: https://github.com/mcrosson +[nicell]: https://github.com/Nicell +[petejohanson]: https://github.com/petejohanson +[kurtis-lew]: https://github.com/kurtis-lew +[joelspadin]: https://github.com/joelspadin +[bcat]: https://github.com/bcat +[dxmh]: https://github.com/dxmh From 1dccb7fe50a349cda94603042b5e81ae7c606c2a Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 7 Apr 2022 16:24:25 +0000 Subject: [PATCH 048/494] fix(hid): Use a full valid range for consumer page * Switch to a logical max for the consumer page that avoid signed issue, and still allows full range of documented consumer page values. --- app/include/zmk/hid.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 61c5fa80..f507b56a 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -78,9 +78,9 @@ static const uint8_t zmk_hid_report_desc[] = { HID_REPORT_SIZE(0x08), #elif IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL) HID_LOGICAL_MIN8(0x00), - HID_LOGICAL_MAX16(0xFF, 0xFF), + HID_LOGICAL_MAX16(0xFF, 0x0F), HID_USAGE_MIN8(0x00), - HID_USAGE_MAX16(0xFF, 0xFF), + HID_USAGE_MAX16(0xFF, 0x0F), HID_REPORT_SIZE(0x10), #else #error "A proper consumer HID report usage range must be selected" From 789fd03f8b6b15317a1b86a1d9b15024bc308295 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 12 Apr 2022 10:43:18 -0400 Subject: [PATCH 049/494] fix: Properly use zmkfirmware Zephyr version. --- app/west.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/west.yml b/app/west.yml index 964d54c8..14c494c0 100644 --- a/app/west.yml +++ b/app/west.yml @@ -4,13 +4,9 @@ manifest: url-base: https://github.com/zephyrproject-rtos - name: zmkfirmware url-base: https://github.com/zmkfirmware - - name: petejohanson - url-base: https://github.com/petejohanson - - name: microsoft - url-base: https://github.com/microsoft projects: - name: zephyr - remote: petejohanson + remote: zmkfirmware revision: v3.0.0+zmk-fixes clone-depth: 1 import: From 40cd8da743b10aee61e0396138354d062cd0e23e Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 13 Apr 2022 03:20:35 +0000 Subject: [PATCH 050/494] fix(usb): Split HID from core USB, logging fix. * Split core USB init from USB HID init. * Tweak logging to avoid "log loop" causing spurious buffer messages on startup. --- app/CMakeLists.txt | 1 + app/Kconfig | 7 +++++ app/include/zmk/usb.h | 4 --- app/include/zmk/usb_hid.h | 9 ++++++ app/src/endpoints.c | 2 +- app/src/usb.c | 48 ----------------------------- app/src/usb_hid.c | 64 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 82 insertions(+), 53 deletions(-) create mode 100644 app/include/zmk/usb_hid.h create mode 100644 app/src/usb_hid.c diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b760389f..1492be16 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -78,6 +78,7 @@ if (CONFIG_ZMK_SPLIT_BLE AND CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL) target_sources(app PRIVATE src/split/bluetooth/central.c) endif() target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c) +target_sources_ifdef(CONFIG_ZMK_USB app PRIVATE src/usb_hid.c) target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/hog.c) target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/backlight.c) diff --git a/app/Kconfig b/app/Kconfig index 5551ed31..8b13d524 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -477,6 +477,10 @@ if ZMK_USB_LOGGING config ZMK_LOG_LEVEL default 4 +# We do this to avoid log loop where logging to USB generates more log messages. +config USB_CDC_ACM_LOG_LEVEL + default 1 + config USB_CDC_ACM_RINGBUF_SIZE default 1024 @@ -486,6 +490,9 @@ config LOG_BUFFER_SIZE config LOG_STRDUP_BUF_COUNT default 16 +config LOG_PROCESS_THREAD_STARTUP_DELAY_MS + default 1000 + #ZMK_USB_LOGGING endif diff --git a/app/include/zmk/usb.h b/app/include/zmk/usb.h index 62a7e3cb..786d9c73 100644 --- a/app/include/zmk/usb.h +++ b/app/include/zmk/usb.h @@ -23,7 +23,3 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state(); static inline bool zmk_usb_is_powered() { return zmk_usb_get_conn_state() != ZMK_USB_CONN_NONE; } static inline bool zmk_usb_is_hid_ready() { return zmk_usb_get_conn_state() == ZMK_USB_CONN_HID; } - -#ifdef CONFIG_ZMK_USB -int zmk_usb_hid_send_report(const uint8_t *report, size_t len); -#endif /* CONFIG_ZMK_USB */ \ No newline at end of file diff --git a/app/include/zmk/usb_hid.h b/app/include/zmk/usb_hid.h new file mode 100644 index 00000000..1748835e --- /dev/null +++ b/app/include/zmk/usb_hid.h @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +int zmk_usb_hid_send_report(const uint8_t *report, size_t len); \ No newline at end of file diff --git a/app/src/endpoints.c b/app/src/endpoints.c index ebbb9fbc..33760010 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/app/src/usb.c b/app/src/usb.c index 2f0fa439..8d2b62f1 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -26,41 +26,6 @@ static void raise_usb_status_changed_event(struct k_work *_work) { K_WORK_DEFINE(usb_status_notifier_work, raise_usb_status_changed_event); -#ifdef CONFIG_ZMK_USB - -static const struct device *hid_dev; - -static K_SEM_DEFINE(hid_sem, 1, 1); - -static void in_ready_cb(const struct device *dev) { k_sem_give(&hid_sem); } - -static const struct hid_ops ops = { - .int_in_ready = in_ready_cb, -}; - -int zmk_usb_hid_send_report(const uint8_t *report, size_t len) { - switch (usb_status) { - case USB_DC_SUSPEND: - return usb_wakeup_request(); - case USB_DC_ERROR: - case USB_DC_RESET: - case USB_DC_DISCONNECTED: - case USB_DC_UNKNOWN: - return -ENODEV; - default: - k_sem_take(&hid_sem, K_MSEC(30)); - int err = hid_int_ep_write(hid_dev, report, len, NULL); - - if (err) { - k_sem_give(&hid_sem); - } - - return err; - } -} - -#endif /* CONFIG_ZMK_USB */ - enum usb_dc_status_code zmk_usb_get_status() { return usb_status; } enum zmk_usb_conn_state zmk_usb_get_conn_state() { @@ -87,19 +52,6 @@ void usb_status_cb(enum usb_dc_status_code status, const uint8_t *params) { static int zmk_usb_init(const struct device *_arg) { int usb_enable_ret; -#ifdef CONFIG_ZMK_USB - hid_dev = device_get_binding("HID_0"); - if (hid_dev == NULL) { - LOG_ERR("Unable to locate HID device"); - return -EINVAL; - } - - usb_hid_register_device(hid_dev, zmk_hid_report_desc, sizeof(zmk_hid_report_desc), &ops); - - usb_hid_init(hid_dev); - -#endif /* CONFIG_ZMK_USB */ - usb_enable_ret = usb_enable(usb_status_cb); if (usb_enable_ret != 0) { diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c new file mode 100644 index 00000000..4b90cf96 --- /dev/null +++ b/app/src/usb_hid.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +#include +#include + +#include +#include +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +static const struct device *hid_dev; + +static K_SEM_DEFINE(hid_sem, 1, 1); + +static void in_ready_cb(const struct device *dev) { k_sem_give(&hid_sem); } + +static const struct hid_ops ops = { + .int_in_ready = in_ready_cb, +}; + +int zmk_usb_hid_send_report(const uint8_t *report, size_t len) { + switch (zmk_usb_get_status()) { + case USB_DC_SUSPEND: + return usb_wakeup_request(); + case USB_DC_ERROR: + case USB_DC_RESET: + case USB_DC_DISCONNECTED: + case USB_DC_UNKNOWN: + return -ENODEV; + default: + k_sem_take(&hid_sem, K_MSEC(30)); + int err = hid_int_ep_write(hid_dev, report, len, NULL); + + if (err) { + k_sem_give(&hid_sem); + } + + return err; + } +} + +static int zmk_usb_hid_init(const struct device *_arg) { + hid_dev = device_get_binding("HID_0"); + if (hid_dev == NULL) { + LOG_ERR("Unable to locate HID device"); + return -EINVAL; + } + + usb_hid_register_device(hid_dev, zmk_hid_report_desc, sizeof(zmk_hid_report_desc), &ops); + usb_hid_init(hid_dev); + + return 0; +} + +SYS_INIT(zmk_usb_hid_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); From 0e54603ec66dc63b5a8d9c8f565df31cc745fe3c Mon Sep 17 00:00:00 2001 From: DoctorNefario <5243039+DoctorNefario@users.noreply.github.com> Date: Thu, 14 Apr 2022 23:55:04 +1000 Subject: [PATCH 051/494] fix(docs): Clarify backlight & underglow use cases This should help reduce confusion for newcomers. --- docs/docs/features/backlight.md | 6 +++++- docs/docs/features/underglow.md | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/docs/features/backlight.md b/docs/docs/features/backlight.md index ef1c0521..6632a0f0 100644 --- a/docs/docs/features/backlight.md +++ b/docs/docs/features/backlight.md @@ -6,7 +6,11 @@ sidebar_label: Backlight import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Backlight is a feature used to control array of LEDs, usually placed through or under switches. Unlike [RGB Underglow](underglow.md), backlight currently allows only one color per LED, also LEDs are not addressable, so you can't control individual LEDs. +Backlight is a feature used to control an array of LEDs, usually placed through or under switches. + +:::info +Unlike [RGB Underglow](underglow.md), backlight can only control single color LEDs. Additionally, because backlight LEDs all receive the same power, it's not possible to dim individual LEDs. +::: ## Enabling Backlight diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index ac865826..58b3ef45 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -5,6 +5,10 @@ sidebar_label: RGB Underglow RGB underglow is a feature used to control "strips" of RGB LEDs. Most of the time this is called underglow and creates a glow underneath the board using a ring of LEDs around the edge, hence the name. However, this can be extended to be used to control anything from a single LED to a long string of LEDs anywhere on the keyboard. +:::info +RGB underglow can also be used for under-key lighting. If you have RGB LEDs on your keyboard, this is what you want. For PWM/single color LEDs, see [Backlight](backlight.md). +::: + ZMK supports all the RGB LEDs supported by Zephyr. Here's the current list supported: - WS2812-ish (WS2812B, WS2813, SK6812, or compatible) From ebc6275a72b8d9140a80ccd50332298da1299eed Mon Sep 17 00:00:00 2001 From: Herald Date: Thu, 14 Apr 2022 16:13:33 +0100 Subject: [PATCH 052/494] fix(docs): Document `ignore-modifiers` and `quick-release` for sticky keys (#1228) --- docs/docs/behaviors/sticky-key.md | 39 ++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/docs/behaviors/sticky-key.md b/docs/docs/behaviors/sticky-key.md index e7085763..12541ed8 100644 --- a/docs/docs/behaviors/sticky-key.md +++ b/docs/docs/behaviors/sticky-key.md @@ -7,8 +7,6 @@ sidebar_label: Sticky Key A sticky key stays pressed until another key is pressed. It is often used for 'sticky shift'. By using a sticky shift, you don't have to hold the shift key to write a capital. -By default, sticky keys stay pressed for a second if you don't press any other key. You can configure this with the `release-after-ms` setting (see below). - ### Behavior Binding - Reference: `&sk` @@ -28,11 +26,25 @@ You can use any keycode that works for `&kp` as parameter to `&sk`: ### Configuration -You can configure a different `release-after-ms` in your keymap: +#### `release-after-ms` + +By default, sticky keys stay pressed for a second if you don't press any other key. You can configure this with the `release-after-ms` setting. + +#### `quick-release` + +Some typists may find that using a sticky shift key interspersed with rapid typing results in two or more capitalized letters instead of one. This happens as the sticky key is active until the next key is released, under which other keys may be pressed and will receive the modifier. You can enable the `quick-release` setting to instead deactivate the sticky key on the next key being pressed, as opposed to released. + +#### `ignore-modifiers` + +This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. + +#### Example ``` &sk { release-after-ms = <2000>; + quick-release; + /delete-property/ ignore-modifiers; }; / { @@ -42,6 +54,27 @@ You can configure a different `release-after-ms` in your keymap: }; ``` +This configuration would apply to all sticky keys. This may not be appropriate if using `quick-release` as you'll lose the ability to chain sticky key modifiers. A better approach for this use case would be to create a new behavior: + +``` +/ { + behaviors { + skq: sticky_key_quick_release { + compatible = "zmk,behavior-sticky-key"; + label = "STICKY_KEY_QUICK_RELEASE"; + #binding-cells = <1>; + bindings = <&kp>; + release-after-ms = <1000>; + quick-release; + }; + }; + + keymap { + ... + }; +}; +``` + ### Advanced usage Sticky keys can be combined; if you tap `&sk LCTRL` and then `&sk LSHIFT` and then `&kp A`, the output will be ctrl+shift+a. From c7a6836735d0a77d8327d4377ebacd0e25c5bb9e Mon Sep 17 00:00:00 2001 From: DoctorNefario <5243039+DoctorNefario@users.noreply.github.com> Date: Fri, 15 Apr 2022 02:29:09 +1000 Subject: [PATCH 053/494] fix(docs): Add `#include` to Underglow upgrade notes --- docs/blog/2022-04-02-zephyr-3-0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/2022-04-02-zephyr-3-0.md b/docs/blog/2022-04-02-zephyr-3-0.md index 44a4fa72..103573c6 100644 --- a/docs/blog/2022-04-02-zephyr-3-0.md +++ b/docs/blog/2022-04-02-zephyr-3-0.md @@ -74,7 +74,7 @@ The following changes have [already been completed](https://github.com/zmkfirmwa ### RGB Underglow -Zephyr's WS2812 `led_strip` driver added a new required property. When adding [underglow](/docs/features/underglow#adding-rgb-underglow-to-a-board) to a board, you now must also add a `color-mapping` property, like: +Zephyr's WS2812 `led_strip` driver added a new required property. When adding [underglow](/docs/features/underglow#adding-rgb-underglow-to-a-board) to a board, you now must also add the additional include `#include ` at the top of your devicetree file, and add a `color-mapping` property like: ``` led_strip: ws2812@0 { From d08463e483a57ab83ff8be5bdc2f324e4184c331 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Fri, 15 Apr 2022 11:10:59 -0500 Subject: [PATCH 054/494] fix(ble): Restore manual connection params --- app/src/ble.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/ble.c b/app/src/ble.c index d9121583..ed823178 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -398,6 +398,11 @@ static void connected(struct bt_conn *conn, uint8_t err) { LOG_DBG("Connected %s", log_strdup(addr)); + err = bt_conn_le_param_update(conn, BT_LE_CONN_PARAM(0x0006, 0x000c, 30, 400)); + if (err) { + LOG_WRN("Failed to update LE parameters (err %d)", err); + } + #if IS_SPLIT_PERIPHERAL bt_conn_le_phy_update(conn, BT_CONN_LE_PHY_PARAM_2M); #endif From 388e345c28907dcf3a7e04b844e582e2dbc0c261 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 17 Jul 2021 17:49:37 -0500 Subject: [PATCH 055/494] feat(battery)!: Add chosen node for battery battery.c now uses the zmk,battery chosen node to select a battery sensor. Using the node labeled "BATTERY" is maintained for backwards compatibility but is now deprecated. Custom boards should switch to using the chosen node. # Conflicts: # app/boards/arm/bluemicro840/bluemicro840_v1.dts # app/boards/arm/nice60/nice60.dts # app/boards/arm/nrfmicro/nrfmicro_13.dts # Conflicts: # app/boards/arm/bluemicro840/bluemicro840_v1.dts --- .../arm/bluemicro840/bluemicro840_v1.dts | 3 ++- app/boards/arm/bt60/bt60.dtsi | 3 ++- app/boards/arm/mikoto/mikoto_520.dts | 3 ++- app/boards/arm/nice60/nice60.dts | 3 ++- app/boards/arm/nice_nano/nice_nano.dts | 6 +++++- app/boards/arm/nice_nano/nice_nano_v2.dts | 6 +++++- app/boards/arm/nrfmicro/nrfmicro_13.dts | 3 ++- app/boards/arm/s40nc/s40nc.dts | 3 ++- app/boards/seeeduino_xiao_ble.overlay | 3 ++- app/src/battery.c | 19 ++++++++++++++++--- 10 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index 7f2db85b..29bf0f8d 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -17,6 +17,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { @@ -34,7 +35,7 @@ control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 7>; diff --git a/app/boards/arm/bt60/bt60.dtsi b/app/boards/arm/bt60/bt60.dtsi index e684bc1d..3858ba46 100644 --- a/app/boards/arm/bt60/bt60.dtsi +++ b/app/boards/arm/bt60/bt60.dtsi @@ -17,6 +17,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -46,7 +47,7 @@ }; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 2>; diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 5ce17640..44321e79 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -17,6 +17,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { @@ -34,7 +35,7 @@ init-delay-ms = <50>; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 2>; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index ee38c9a5..bb058da8 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -19,6 +19,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; zmk,underglow = &led_strip; @@ -81,7 +82,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 2>; diff --git a/app/boards/arm/nice_nano/nice_nano.dts b/app/boards/arm/nice_nano/nice_nano.dts index cce3dba6..e29df205 100644 --- a/app/boards/arm/nice_nano/nice_nano.dts +++ b/app/boards/arm/nice_nano/nice_nano.dts @@ -8,13 +8,17 @@ #include "nice_nano.dtsi" / { + chosen { + zmk,battery = &vbatt; + }; + ext-power { compatible = "zmk,ext-power-generic"; label = "EXT_POWER"; control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 2>; diff --git a/app/boards/arm/nice_nano/nice_nano_v2.dts b/app/boards/arm/nice_nano/nice_nano_v2.dts index 8f72aad6..ed2b35f4 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2.dts +++ b/app/boards/arm/nice_nano/nice_nano_v2.dts @@ -8,6 +8,10 @@ #include "nice_nano.dtsi" / { + chosen { + zmk,battery = &vbatt; + }; + ext-power { compatible = "zmk,ext-power-generic"; label = "EXT_POWER"; @@ -15,7 +19,7 @@ init-delay-ms = <50>; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-nrf-vddh"; label = "BATTERY"; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index d60417fd..a0f74170 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -17,6 +17,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { @@ -33,7 +34,7 @@ control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 2>; diff --git a/app/boards/arm/s40nc/s40nc.dts b/app/boards/arm/s40nc/s40nc.dts index 67a3c293..5b588b45 100644 --- a/app/boards/arm/s40nc/s40nc.dts +++ b/app/boards/arm/s40nc/s40nc.dts @@ -17,6 +17,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; @@ -69,7 +70,7 @@ }; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 2>; diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay index 7e0d4ff9..0f5df999 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -8,9 +8,10 @@ / { chosen { zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; - vbatt { + vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; label = "BATTERY"; io-channels = <&adc 7>; diff --git a/app/src/battery.c b/app/src/battery.c index c63008e6..4292dafe 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -18,12 +19,16 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -const struct device *battery; - static uint8_t last_state_of_charge = 0; uint8_t zmk_battery_state_of_charge() { return last_state_of_charge; } +#if DT_HAS_CHOSEN(zmk_battery) +static const struct device *const battery = DEVICE_DT_GET(DT_CHOSEN(zmk_battery)); +#else +static const struct device *battery; +#endif + static int zmk_battery_update(const struct device *battery) { struct sensor_value state_of_charge; @@ -75,10 +80,18 @@ static void zmk_battery_timer(struct k_timer *timer) { k_work_submit(&battery_wo K_TIMER_DEFINE(battery_timer, zmk_battery_timer, NULL); static int zmk_battery_init(const struct device *_arg) { +#if !DT_HAS_CHOSEN(zmk_battery) battery = device_get_binding("BATTERY"); if (battery == NULL) { - LOG_DBG("No battery device labelled BATTERY found."); + return -ENODEV; + } + + LOG_WRN("Finding battery device labeled BATTERY is deprecated. Use zmk,battery chosen node."); +#endif + + if (!device_is_ready(battery)) { + LOG_ERR("Battery device \"%s\" is not ready", battery->name); return -ENODEV; } From f91472fbe5e2577ac672231f4490db289b68dbce Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 15 Apr 2022 22:09:35 -0500 Subject: [PATCH 056/494] fix(battery): Warn if using deprecated battery label --- app/src/battery.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/battery.c b/app/src/battery.c index 4292dafe..51f96c12 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -26,6 +26,8 @@ uint8_t zmk_battery_state_of_charge() { return last_state_of_charge; } #if DT_HAS_CHOSEN(zmk_battery) static const struct device *const battery = DEVICE_DT_GET(DT_CHOSEN(zmk_battery)); #else +#warning \ + "Using a node labeled BATTERY for the battery sensor is deprecated. Set a zmk,battery chosen node instead. (Ignore this if you don't have a battery sensor.)" static const struct device *battery; #endif From b7b026f20c1c01758b1780a5928efc085e0c0ab9 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 15 Apr 2022 23:17:38 -0500 Subject: [PATCH 057/494] feat(docs): Add battery sensor documentation --- docs/docs/features/battery.md | 38 +++++++++++++++++++++++++++++++++++ docs/sidebars.js | 1 + 2 files changed, 39 insertions(+) create mode 100644 docs/docs/features/battery.md diff --git a/docs/docs/features/battery.md b/docs/docs/features/battery.md new file mode 100644 index 00000000..0b4172c2 --- /dev/null +++ b/docs/docs/features/battery.md @@ -0,0 +1,38 @@ +--- +title: Battery Level +sidebar_label: Battery Level +--- + +If your keyboard has a battery sensor, ZMK will report its battery level to the connected bluetooth host and show it on the keyboard's display, if it has one. + +For split keyboards, only the battery level of the central (usually left) side is reported over bluetooth. + +:::note + +Windows may not properly ask the keyboard to notify it of changes in battery level, so the level shown may be out of date. + +::: + +## Adding a Battery Sensor to a Board + +To enable a battery sensor on a new board, add the driver for the sensor to your board's `.dts` file. ZMK provides two drivers for estimating the battery level using its voltage: + +- `zmk,battery-voltage-divider`: Reads the voltage on an analog input pin. +- `zmk,battery-nrf-vddh`: Reads the power supply voltage on a Nordic nRF52's VDDH pin. + +Zephyr also provides some drivers for fuel gauge ICs such as the TI bq274xx series and Maxim MAX17xxx series. If you use a battery sensor that does not have an existing driver, you will need to write a new driver that supports the `SENSOR_CHAN_GAUGE_STATE_OF_CHARGE` sensor channel and contribute it to Zephyr or ZMK. + +Once you have the sensor driver defined, add a `zmk,battery` property to the `chosen` node and set it to reference the sensor node. For example: + +``` +/ { + chosen { + zmk,battery = &vbatt; + }; + + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + label = "VBATT"; + }; +} +``` diff --git a/docs/sidebars.js b/docs/sidebars.js index cbeceef7..ea66439b 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -17,6 +17,7 @@ module.exports = { "features/encoders", "features/underglow", "features/backlight", + "features/battery", "features/beta-testing", ], Behaviors: [ From 3e294375b63d5ec288ffc05d85c6b2e376500a73 Mon Sep 17 00:00:00 2001 From: Dom H Date: Mon, 18 Apr 2022 14:40:35 +0100 Subject: [PATCH 058/494] feat(docs): Provide current status of Displays --- docs/docs/features/displays.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/docs/features/displays.md b/docs/docs/features/displays.md index 2b3d001d..f18b3acd 100644 --- a/docs/docs/features/displays.md +++ b/docs/docs/features/displays.md @@ -1,6 +1,10 @@ --- -title: OLED Displays -sidebar_label: OLED Displays +title: Displays +sidebar_label: Displays --- -TODO: Documentation on OLED displays. +Displays in ZMK are currently a proof of concept and official support is coming soon. + +:::info +Although ZMK-powered keyboards _are_ capable of utilizing OLED and ePaper displays, the Displays feature is not yet considered production-ready due to an issue where the display remains blank after resuming from [external power cutoff](../behaviors/power#external-power-control). This issue can be tracked on GitHub at [zmkfirmware/zmk #674](https://github.com/zmkfirmware/zmk/issues/674). +::: From d0176f368585c5bbb0a6a5f69465eb083349eff0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 19 Apr 2022 01:28:22 +0000 Subject: [PATCH 059/494] fix(boards): Enable battery driver for XIAO BLE. --- app/boards/seeeduino_xiao_ble.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/app/boards/seeeduino_xiao_ble.conf b/app/boards/seeeduino_xiao_ble.conf index 92367028..22e6a9b5 100644 --- a/app/boards/seeeduino_xiao_ble.conf +++ b/app/boards/seeeduino_xiao_ble.conf @@ -3,6 +3,7 @@ CONFIG_CONSOLE=n CONFIG_SERIAL=n CONFIG_UART_CONSOLE=n CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_BATTERY_VOLTAGE_DIVIDER=y CONFIG_ZMK_USB=y CONFIG_ZMK_BLE=y From bbaa6af81b0f70e117264a087a04935b0268d047 Mon Sep 17 00:00:00 2001 From: elagil Date: Sun, 3 Apr 2022 18:53:37 +0200 Subject: [PATCH 060/494] feat(ci): introduce reusable user-config workflow --- .github/workflows/build-user-config.yml | 96 +++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/build-user-config.yml diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml new file mode 100644 index 00000000..ea889db0 --- /dev/null +++ b/.github/workflows/build-user-config.yml @@ -0,0 +1,96 @@ +name: Reusable user config build + +on: + workflow_call: + +jobs: + matrix: + runs-on: ubuntu-latest + name: Fetch Build Keyboards + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Install yaml2json + run: python3 -m pip install remarshal + - id: set-matrix + name: Fetch Build Matrix + run: | + matrix=$(yaml2json build.yaml | jq -c .) + yaml2json build.yaml + echo "::set-output name=matrix::${matrix}" + build: + runs-on: ubuntu-latest + container: + image: zmkfirmware/zmk-build-arm:stable + needs: matrix + name: Build + strategy: + fail-fast: false + matrix: ${{fromJson(needs.matrix.outputs.matrix)}} + steps: + - name: Prepare variables + id: variables + run: | + if [ -n "${{ matrix.shield }}" ]; then + EXTRA_CMAKE_ARGS="-DSHIELD=${{ matrix.shield }}" + ARTIFACT_NAME="${{ matrix.shield }}-${{ matrix.board }}-zmk" + DISPLAY_NAME="${{ matrix.shield }} - ${{ matrix.board }}" + else + EXTRA_CMAKE_ARGS= + DISPLAY_NAME="${{ matrix.board }}" + ARTIFACT_NAME="${{ matrix.board }}-zmk" + fi + echo ::set-output name=extra-cmake-args::${EXTRA_CMAKE_ARGS} + echo ::set-output name=artifact-name::${ARTIFACT_NAME} + echo ::set-output name=display-name::${DISPLAY_NAME} + - name: Checkout + uses: actions/checkout@v2 + - name: Cache west modules + uses: actions/cache@v2 + env: + cache-name: cache-zephyr-modules + with: + path: | + modules/ + tools/ + zephyr/ + bootloader/ + zmk/ + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('manifest-dir/west.yml') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: West Init + run: west init -l config + - name: West Update + run: west update + - name: West Zephyr export + run: west zephyr-export + - name: West Build (${{ steps.variables.outputs.display-name }}) + run: | + west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/config ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.dts.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.dts.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + - name: ${{ steps.variables.outputs.display-name }} Kconfig file + run: cat build/zephyr/.config | grep -v "^#" | grep -v "^$" + - name: Rename artifacts + run: | + mkdir build/artifacts + if [ -f build/zephyr/zmk.uf2 ] + then + cp build/zephyr/zmk.uf2 "build/artifacts/${{ steps.variables.outputs.artifact-name }}.uf2" + elif [ -f build/zephyr/zmk.hex ] + then + cp build/zephyr/zmk.hex "build/artifacts/${{ steps.variables.outputs.artifact-name }}.hex" + fi + - name: Archive (${{ steps.variables.outputs.display-name }}) + uses: actions/upload-artifact@v2 + with: + name: firmware + path: build/artifacts From b1687eec2a1a8a4e3110e89fdfb553fbc5895fa9 Mon Sep 17 00:00:00 2001 From: Adrian Date: Sun, 3 Apr 2022 18:53:37 +0200 Subject: [PATCH 061/494] fix(ci): path to custom west.yml Co-authored-by: Joel Spadin --- .github/workflows/build-user-config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index ea889db0..de35ffb4 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -58,7 +58,7 @@ jobs: zephyr/ bootloader/ zmk/ - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('manifest-dir/west.yml') }} + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('config/west.yml') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- From 2c4ca7390b5904b0dbd5f88d321ba5bdccddf607 Mon Sep 17 00:00:00 2001 From: elagil Date: Sun, 3 Apr 2022 18:53:37 +0200 Subject: [PATCH 062/494] feat(ci): Use input variables for configuring user build --- .github/workflows/build-user-config.yml | 28 +++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index de35ffb4..7da9a546 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -2,6 +2,22 @@ name: Reusable user config build on: workflow_call: + inputs: + build_matrix_path: + description: 'Path to the build matrix file' + default: 'build.yaml' + required: false + type: string + config_path: + description: 'Path to the config directory' + default: 'config' + required: false + type: string + fallback_binary: + description: 'Fallback binary format, if no *.uf2 file was built' + default: 'bin' + required: false + type: string jobs: matrix: @@ -17,8 +33,8 @@ jobs: - id: set-matrix name: Fetch Build Matrix run: | - matrix=$(yaml2json build.yaml | jq -c .) - yaml2json build.yaml + matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .) + yaml2json ${{ inputs.build_matrix_path }} echo "::set-output name=matrix::${matrix}" build: runs-on: ubuntu-latest @@ -64,14 +80,14 @@ jobs: ${{ runner.os }}-build- ${{ runner.os }}- - name: West Init - run: west init -l config + run: west init -l ${{ inputs.config_path }} - name: West Update run: west update - name: West Zephyr export run: west zephyr-export - name: West Build (${{ steps.variables.outputs.display-name }}) run: | - west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/config ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} + west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} - name: ${{ steps.variables.outputs.display-name }} DTS File if: ${{ always() }} run: | @@ -85,9 +101,9 @@ jobs: if [ -f build/zephyr/zmk.uf2 ] then cp build/zephyr/zmk.uf2 "build/artifacts/${{ steps.variables.outputs.artifact-name }}.uf2" - elif [ -f build/zephyr/zmk.hex ] + elif [ -f build/zephyr/zmk.${{ inputs.fallback_binary }} ] then - cp build/zephyr/zmk.hex "build/artifacts/${{ steps.variables.outputs.artifact-name }}.hex" + cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ steps.variables.outputs.artifact-name }}.${{ inputs.fallback_binary }}" fi - name: Archive (${{ steps.variables.outputs.display-name }}) uses: actions/upload-artifact@v2 From 0f70f4005497381062e7edd5fc9f09e3b2e1fb0b Mon Sep 17 00:00:00 2001 From: elagil Date: Sun, 3 Apr 2022 18:53:37 +0200 Subject: [PATCH 063/494] style(ci): add empty lines for readability --- .github/workflows/build-user-config.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 7da9a546..3b9912f9 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -28,14 +28,17 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + - name: Install yaml2json run: python3 -m pip install remarshal + - id: set-matrix name: Fetch Build Matrix run: | matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .) yaml2json ${{ inputs.build_matrix_path }} echo "::set-output name=matrix::${matrix}" + build: runs-on: ubuntu-latest container: @@ -61,8 +64,10 @@ jobs: echo ::set-output name=extra-cmake-args::${EXTRA_CMAKE_ARGS} echo ::set-output name=artifact-name::${ARTIFACT_NAME} echo ::set-output name=display-name::${DISPLAY_NAME} + - name: Checkout uses: actions/checkout@v2 + - name: Cache west modules uses: actions/cache@v2 env: @@ -79,12 +84,16 @@ jobs: ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- ${{ runner.os }}- + - name: West Init run: west init -l ${{ inputs.config_path }} + - name: West Update run: west update + - name: West Zephyr export run: west zephyr-export + - name: West Build (${{ steps.variables.outputs.display-name }}) run: | west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} @@ -93,8 +102,10 @@ jobs: run: | if [ -f "build/zephyr/${{ matrix.board }}.dts.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.dts.pre.tmp; fi if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + - name: ${{ steps.variables.outputs.display-name }} Kconfig file run: cat build/zephyr/.config | grep -v "^#" | grep -v "^$" + - name: Rename artifacts run: | mkdir build/artifacts @@ -105,6 +116,7 @@ jobs: then cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ steps.variables.outputs.artifact-name }}.${{ inputs.fallback_binary }}" fi + - name: Archive (${{ steps.variables.outputs.display-name }}) uses: actions/upload-artifact@v2 with: From e676c79929a50c1c51bb7a7dc1c2b11043a49c17 Mon Sep 17 00:00:00 2001 From: elagil Date: Sun, 3 Apr 2022 18:53:37 +0200 Subject: [PATCH 064/494] fix(ci): generalize path to west.yml --- .github/workflows/build-user-config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 3b9912f9..78d324ed 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -79,7 +79,7 @@ jobs: zephyr/ bootloader/ zmk/ - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('config/west.yml') }} + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('${{ inputs.config_path }}/west.yml') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- From b7771fbdd299e9dbfa606c8c3b1551c5acd401e6 Mon Sep 17 00:00:00 2001 From: elagil Date: Sun, 3 Apr 2022 18:57:35 +0200 Subject: [PATCH 065/494] ci: updated for Zephyr 3.0, cache invalidation --- .github/workflows/build-user-config.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 78d324ed..0f22bd99 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -64,14 +64,15 @@ jobs: echo ::set-output name=extra-cmake-args::${EXTRA_CMAKE_ARGS} echo ::set-output name=artifact-name::${ARTIFACT_NAME} echo ::set-output name=display-name::${DISPLAY_NAME} + echo ::set-output name=zephyr-version::${ZEPHYR_VERSION} - name: Checkout uses: actions/checkout@v2 - name: Cache west modules - uses: actions/cache@v2 + uses: actions/cache@v3.0.1 env: - cache-name: cache-zephyr-modules + cache-name: cache-zephyr-${{ steps.variables.outputs.zephyr-version }}-modules with: path: | modules/ @@ -97,12 +98,7 @@ jobs: - name: West Build (${{ steps.variables.outputs.display-name }}) run: | west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} - - name: ${{ steps.variables.outputs.display-name }} DTS File - if: ${{ always() }} - run: | - if [ -f "build/zephyr/${{ matrix.board }}.dts.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.dts.pre.tmp; fi - if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi - + - name: ${{ steps.variables.outputs.display-name }} Kconfig file run: cat build/zephyr/.config | grep -v "^#" | grep -v "^$" From 142d5187342e37b524b969f3e87b131478f1ac2b Mon Sep 17 00:00:00 2001 From: Adrian Date: Tue, 5 Apr 2022 08:28:45 +0200 Subject: [PATCH 066/494] ci: make cache hash independent of input parameter --- .github/workflows/build-user-config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 0f22bd99..226a53c1 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -80,7 +80,7 @@ jobs: zephyr/ bootloader/ zmk/ - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('${{ inputs.config_path }}/west.yml') }} + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/west.yml', '**/build.yaml') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- From 3ff8014cf299d682f7e76296c0c7e8e53c041a87 Mon Sep 17 00:00:00 2001 From: Adrian Date: Fri, 8 Apr 2022 18:44:12 +0200 Subject: [PATCH 067/494] ci: sort build configuration output Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com> --- .github/workflows/build-user-config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 226a53c1..cb462b1a 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -100,7 +100,7 @@ jobs: west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} - name: ${{ steps.variables.outputs.display-name }} Kconfig file - run: cat build/zephyr/.config | grep -v "^#" | grep -v "^$" + run: cat build/zephyr/.config | grep -v "^#" | grep -v "^$" | sort - name: Rename artifacts run: | From 6308ab942661656e9ca06787ebb0918df6ffd268 Mon Sep 17 00:00:00 2001 From: Dom H Date: Mon, 18 Apr 2022 17:44:43 +0100 Subject: [PATCH 068/494] fix(docs): Ensure relative links always resolve Linking to the document _file path_ rather than the document _URL_ ensures that the link resolves regardless of trailing slash config. More information is at https://docusaurus.io/docs/docs-markdown-features --- docs/docs/features/displays.md | 2 +- docs/docs/intro.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/features/displays.md b/docs/docs/features/displays.md index f18b3acd..283bf880 100644 --- a/docs/docs/features/displays.md +++ b/docs/docs/features/displays.md @@ -6,5 +6,5 @@ sidebar_label: Displays Displays in ZMK are currently a proof of concept and official support is coming soon. :::info -Although ZMK-powered keyboards _are_ capable of utilizing OLED and ePaper displays, the Displays feature is not yet considered production-ready due to an issue where the display remains blank after resuming from [external power cutoff](../behaviors/power#external-power-control). This issue can be tracked on GitHub at [zmkfirmware/zmk #674](https://github.com/zmkfirmware/zmk/issues/674). +Although ZMK-powered keyboards _are_ capable of utilizing OLED and ePaper displays, the Displays feature is not yet considered production-ready due to an issue where the display remains blank after resuming from [external power cutoff](../behaviors/power.md#external-power-control). This issue can be tracked on GitHub at [zmkfirmware/zmk #674](https://github.com/zmkfirmware/zmk/issues/674). ::: diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 91b4e21b..142dcafc 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -32,7 +32,7 @@ ZMK is currently missing some features found in other popular firmware. This tab | [Backlight](features/backlight.md) | ✅ | ✅ | ✅ | | One Shot Keys | ✅ | ✅ | ✅ | | [Combo Keys](features/combos.md) | ✅ | | ✅ | -| [Macros](behaviors/macros) | ✅ | ✅ | ✅ | +| [Macros](behaviors/macros.md) | ✅ | ✅ | ✅ | | Mouse Keys | 🚧 | ✅ | ✅ | | Low Active Power Usage | ✅ | | | | Low Power Sleep States | ✅ | ✅ | | From 56d5f4153c22213dd032452ad846272a5ed12246 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 03:35:40 +0000 Subject: [PATCH 069/494] chore(deps): bump async from 2.6.3 to 2.6.4 in /docs Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4. - [Release notes](https://github.com/caolan/async/releases) - [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md) - [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4) --- updated-dependencies: - dependency-name: async dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c72f901b..18a272ca 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -5858,9 +5858,9 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "requires": { "lodash": "^4.17.14" } From e13ea3fbfb46c41a188185faaa8451b9f430fe8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Apr 2022 05:09:13 +0000 Subject: [PATCH 070/494] chore(deps): bump @fortawesome/react-fontawesome in /docs Bumps [@fortawesome/react-fontawesome](https://github.com/FortAwesome/react-fontawesome) from 0.1.16 to 0.1.18. - [Release notes](https://github.com/FortAwesome/react-fontawesome/releases) - [Changelog](https://github.com/FortAwesome/react-fontawesome/blob/master/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/react-fontawesome/compare/0.1.16...0.1.18) --- updated-dependencies: - dependency-name: "@fortawesome/react-fontawesome" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 20 ++++++++++++++++---- docs/package.json | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 18a272ca..c87e0aba 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -4825,11 +4825,23 @@ } }, "@fortawesome/react-fontawesome": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.16.tgz", - "integrity": "sha512-aLmzDwC9rEOAJv2UJdMns89VZR5Ry4IHu5dQQh24Z/lWKEm44lfQr1UNalZlkUaQN8d155tNh+CS7ntntj1VMA==", + "version": "0.1.18", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.18.tgz", + "integrity": "sha512-RwLIB4TZw0M9gvy5u+TusAA0afbwM4JQIimNH/j3ygd6aIvYPQLqXMhC9ErY26J23rDPyDZldIfPq/HpTTJ/tQ==", "requires": { - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" + }, + "dependencies": { + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + } } }, "@hapi/hoek": { diff --git a/docs/package.json b/docs/package.json index 755482b6..978795a8 100644 --- a/docs/package.json +++ b/docs/package.json @@ -19,7 +19,7 @@ "@docusaurus/preset-classic": "^2.0.0-beta.18", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.16", + "@fortawesome/react-fontawesome": "^0.1.18", "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", "js-yaml": "^4.1.0", From 158ac2720724123b91e6534c95710804cc49243e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Apr 2022 10:03:28 +0000 Subject: [PATCH 071/494] chore(deps-dev): bump eslint-plugin-mdx from 1.13.0 to 1.17.0 in /docs Bumps [eslint-plugin-mdx](https://github.com/mdx-js/eslint-mdx) from 1.13.0 to 1.17.0. - [Release notes](https://github.com/mdx-js/eslint-mdx/releases) - [Changelog](https://github.com/mdx-js/eslint-mdx/blob/master/CHANGELOG.md) - [Commits](https://github.com/mdx-js/eslint-mdx/compare/v1.13.0...v1.17.0) --- updated-dependencies: - dependency-name: eslint-plugin-mdx dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 96 +++++++++++++++++------------------------- docs/package.json | 2 +- 2 files changed, 40 insertions(+), 58 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c87e0aba..d09c5888 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -7581,21 +7581,29 @@ "dev": true }, "eslint-mdx": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.13.0.tgz", - "integrity": "sha512-Yqc5mnh2JMEm9yTp6NUnfOg1wXGLibCqQTjvb5+EQH4LtQEmWG0DtqWUXWHRy0gmy/3lBdN9Zkc5KGwAizaTrQ==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.17.0.tgz", + "integrity": "sha512-O8+JRfwCzpoR2P6zUI1GDAAM/bsuzcoBS1ArvpQrgQO/E2Km0vBmM15ukiJxZ+YUh5d+qDlrqha0fZB50MojJQ==", "dev": true, "requires": { + "cosmiconfig": "^7.0.1", "remark-mdx": "^1.6.22", "remark-parse": "^8.0.3", - "tslib": "^2.2.0", - "unified": "^9.2.1" + "remark-stringify": "^8.1.1", + "tslib": "^2.3.1", + "unified": "^9.2.2" }, "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, "unified": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", - "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "dev": true, "requires": { "bail": "^1.0.0", @@ -7609,58 +7617,32 @@ } }, "eslint-plugin-markdown": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.0.tgz", - "integrity": "sha512-Ctuc7aP1tU92qnFwVO1wDLEzf1jqMxwRkcSTw7gjbvnEqfh5CKUcTXM0sxg8CB2KDXrqpTuMZPgJ1XE9Olr7KA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", + "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", "dev": true, "requires": { "mdast-util-from-markdown": "^0.8.5" } }, "eslint-plugin-mdx": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.13.0.tgz", - "integrity": "sha512-oZ/R9OmSx1gZs52CO58HTHlJXRKoZtF6ZMaWP+sOcSGMFxoddoPr9PDgpP52ab5TWu5yVl5guR9D+GMfzkR2Uw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.17.0.tgz", + "integrity": "sha512-Kicizy+fbfsB2UxTDXP92qTtFqITApu4v4DRQUfXMoPwBHeQRvZnaEtXu2S9aia51GYRYsMSqUvoPPih/5oB+g==", "dev": true, "requires": { - "cosmiconfig": "^7.0.0", - "eslint-mdx": "^1.13.0", - "eslint-plugin-markdown": "^2.1.0", - "remark-mdx": "^1.6.22", - "remark-parse": "^8.0.3", - "remark-stringify": "^8.1.1", - "synckit": "^0.1.5", - "tslib": "^2.2.0", - "unified": "^9.2.1", + "eslint-mdx": "^1.17.0", + "eslint-plugin-markdown": "^2.2.1", + "synckit": "^0.4.1", + "tslib": "^2.3.1", "vfile": "^4.2.1" }, "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "unified": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz", - "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==", - "dev": true, - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true } } }, @@ -12827,19 +12809,19 @@ } }, "synckit": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.1.5.tgz", - "integrity": "sha512-s9rDbMJAF5SDEwBGH/DvbN/fb5N1Xu1boL4Uv66idbCbtosNX3ikUsFvGhROmPXsvlMYMcT5ksmkU5RSnkFi9Q==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.4.1.tgz", + "integrity": "sha512-ngUh0+s+DOqEc0sGnrLaeNjbXp0CWHjSGFBqPlQmQ+oN/OfoDoYDBXPh+b4qs1M5QTk5nuQ3AmVz9+2xiY/ldw==", "dev": true, "requires": { - "tslib": "^2.2.0", + "tslib": "^2.3.1", "uuid": "^8.3.2" }, "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } diff --git a/docs/package.json b/docs/package.json index 978795a8..f8ef6dfe 100644 --- a/docs/package.json +++ b/docs/package.json @@ -52,7 +52,7 @@ "@types/react-router-dom": "^5.1.7", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", - "eslint-plugin-mdx": "^1.13.0", + "eslint-plugin-mdx": "^1.17.0", "eslint-plugin-react": "^7.28.0", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", From c8c273d83b6806e53116748b8e5a216ed52ca1a1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 17 Apr 2022 14:30:22 +0000 Subject: [PATCH 072/494] feat(docs): Add TOC to supported hardware page. --- docs/docs/hardware.mdx | 42 +++++++- docs/src/components/hardware-list.tsx | 133 ++++++++------------------ docs/src/components/hardware-utils.ts | 70 ++++++++++++++ docs/tsconfig.json | 2 +- 4 files changed, 151 insertions(+), 96 deletions(-) create mode 100644 docs/src/components/hardware-utils.ts diff --git a/docs/docs/hardware.mdx b/docs/docs/hardware.mdx index 76a0a3cb..d2b6aa9d 100644 --- a/docs/docs/hardware.mdx +++ b/docs/docs/hardware.mdx @@ -6,12 +6,48 @@ sidebar_label: Supported Hardware import HardwareList from "@site/src/components/hardware-list"; import Metadata from "@site/src/data/hardware-metadata.json"; +import Heading from "@theme/Heading"; + +import { groupedMetadata } from "@site/src/components/hardware-utils"; + +export const toc = [ + { + value: "Onboard Controller Keyboards", + id: "onboard", + level: 2, + }, + { + value: "Composite Keyboards", + id: "composite", + level: 2, + }, + ...Object.values(groupedMetadata(Metadata).interconnects).map( + ({ interconnect }) => ({ + value: `${interconnect.name} Interconnect`, + id: interconnect.id, + level: 3, + }) + ), + { + value: "Other Hardware", + id: "other-hardware", + level: 2, + }, + { + value: "Contributing", + id: "contributing", + level: 2, + }, +]; + With the solid technical foundation of Zephyr™ RTOS, ZMK can support a wide diversity of hardware targets. That being said, there are currently only a few specific [boards](/docs/faq#what-is-a-board)/[shields](faq.md#what-is-a-shield) that have been implemented and tested by the ZMK contributors. -## Other Hardware + + Other Hardware + In addition to the basic keyboard functionality, there is some initial support for additional keyboard hardware: @@ -22,6 +58,8 @@ In addition to the basic keyboard functionality, there is some initial support f Until detailed documentation is available, feel free to ask questions about how these are supported in the [Discord server](https://zmk.dev/community/discord/invite). -## Contributing + + Contributing + If you'd like to add support for a new keyboard shield, head over to the [New Keyboard Shield](development/new-shield.md) documentation. diff --git a/docs/src/components/hardware-list.tsx b/docs/src/components/hardware-list.tsx index e611f5cf..54034ada 100644 --- a/docs/src/components/hardware-list.tsx +++ b/docs/src/components/hardware-list.tsx @@ -1,11 +1,9 @@ import React from "react"; -import { - Board, - HardwareMetadata, - Interconnect, - Shield, -} from "../hardware-metadata"; +import Heading from "@theme/Heading"; + +import { HardwareMetadata } from "../hardware-metadata"; +import { groupedMetadata, InterconnectDetails } from "./hardware-utils"; interface HardwareListProps { items: HardwareMetadata[]; @@ -53,12 +51,6 @@ function HardwareLineItem({ item }: { item: HardwareMetadata }) { ); } -interface InterconnectDetails { - interconnect?: Interconnect; - boards: Board[]; - shields: Shield[]; -} - function mapInterconnect({ interconnect, boards, @@ -70,15 +62,17 @@ function mapInterconnect({ return ( )} From 18b8b9b3a57226ef84064b1382d846c634dcfd2e Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Fri, 14 Oct 2022 11:39:47 -0500 Subject: [PATCH 211/494] fix(shields): Disable idle blanking on nice!view --- app/boards/shields/nice_view/nice_view.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index 368e848a..2c1d6c71 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -2,3 +2,4 @@ CONFIG_ZMK_DISPLAY=y CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_26=y CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n From ef2e6e9156806760d9e91c0d635cd809058c3ee7 Mon Sep 17 00:00:00 2001 From: Robert U <978080+urob@users.noreply.github.com> Date: Fri, 14 Oct 2022 21:40:28 -0400 Subject: [PATCH 212/494] feat(behaviors): Add mod-morph `keep-mods` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update docs for mod-morph * Add unit tests for mod-morph * Add keep-mods to DT binding Co-authored-by: Martin Aumüller Co-authored-by: Cem Aksoylar --- .../behaviors/zmk,behavior-mod-morph.yaml | 3 ++ app/include/zmk/hid.h | 2 + app/src/behaviors/behavior_mod_morph.c | 9 +++- app/src/hid.c | 24 ++++++++-- .../mod-morph/1-no-morph/events.patterns | 8 ++++ .../1-no-morph/keycode_events.snapshot | 5 ++ .../1-no-morph/native_posix_64.keymap | 11 +++++ .../mod-morph/2a-masked-morph/events.patterns | 8 ++++ .../2a-masked-morph/keycode_events.snapshot | 12 +++++ .../2a-masked-morph/native_posix_64.keymap | 13 +++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 12 +++++ .../native_posix_64.keymap | 37 +++++++++++++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 18 +++++++ .../native_posix_64.keymap | 15 ++++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 12 +++++ .../native_posix_64.keymap | 45 ++++++++++++++++++ .../events.patterns | 8 ++++ .../keycode_events.snapshot | 12 +++++ .../native_posix_64.keymap | 47 +++++++++++++++++++ .../3-unmasked-morph/events.patterns | 8 ++++ .../3-unmasked-morph/keycode_events.snapshot | 12 +++++ .../3-unmasked-morph/native_posix_64.keymap | 37 +++++++++++++++ app/tests/mod-morph/behavior_keymap.dtsi | 23 +++++++++ .../keycode_events.snapshot | 2 +- docs/docs/behaviors/mod-morph.md | 29 +++++++++--- 28 files changed, 425 insertions(+), 11 deletions(-) create mode 100644 app/tests/mod-morph/1-no-morph/events.patterns create mode 100644 app/tests/mod-morph/1-no-morph/keycode_events.snapshot create mode 100644 app/tests/mod-morph/1-no-morph/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2a-masked-morph/events.patterns create mode 100644 app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns create mode 100644 app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns create mode 100644 app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns create mode 100644 app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap create mode 100644 app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns create mode 100644 app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot create mode 100644 app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap create mode 100644 app/tests/mod-morph/3-unmasked-morph/events.patterns create mode 100644 app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot create mode 100644 app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap create mode 100644 app/tests/mod-morph/behavior_keymap.dtsi diff --git a/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml b/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml index ed40f936..20235d04 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-mod-morph.yaml @@ -14,3 +14,6 @@ properties: mods: type: int required: true + keep-mods: + type: int + required: false diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 902b76d1..0f9cfe2e 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -135,6 +135,8 @@ int zmk_hid_register_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_unregister_mods(zmk_mod_flags_t explicit_modifiers); int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers); int zmk_hid_implicit_modifiers_release(); +int zmk_hid_masked_modifiers_set(zmk_mod_flags_t masked_modifiers); +int zmk_hid_masked_modifiers_clear(); int zmk_hid_keyboard_press(zmk_key_t key); int zmk_hid_keyboard_release(zmk_key_t key); diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index a40bd365..effbe4ac 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -27,6 +27,7 @@ struct behavior_mod_morph_config { struct zmk_behavior_binding normal_binding; struct zmk_behavior_binding morph_binding; zmk_mod_flags_t mods; + zmk_mod_flags_t masked_mods; }; struct behavior_mod_morph_data { @@ -45,6 +46,7 @@ static int on_mod_morph_binding_pressed(struct zmk_behavior_binding *binding, } if (zmk_hid_get_explicit_mods() & cfg->mods) { + zmk_hid_masked_modifiers_set(cfg->masked_mods); data->pressed_binding = (struct zmk_behavior_binding *)&cfg->morph_binding; } else { data->pressed_binding = (struct zmk_behavior_binding *)&cfg->normal_binding; @@ -64,7 +66,10 @@ static int on_mod_morph_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding *pressed_binding = data->pressed_binding; data->pressed_binding = NULL; - return behavior_keymap_binding_released(pressed_binding, event); + int err; + err = behavior_keymap_binding_released(pressed_binding, event); + zmk_hid_masked_modifiers_clear(); + return err; } static const struct behavior_driver_api behavior_mod_morph_driver_api = { @@ -88,6 +93,8 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; } .normal_binding = _TRANSFORM_ENTRY(0, n), \ .morph_binding = _TRANSFORM_ENTRY(1, n), \ .mods = DT_INST_PROP(n, mods), \ + .masked_mods = COND_CODE_0(DT_INST_NODE_HAS_PROP(n, keep_mods), (DT_INST_PROP(n, mods)), \ + (DT_INST_PROP(n, mods) & ~DT_INST_PROP(n, keep_mods))), \ }; \ static struct behavior_mod_morph_data behavior_mod_morph_data_##n = {}; \ DEVICE_DT_INST_DEFINE(n, behavior_mod_morph_init, NULL, &behavior_mod_morph_data_##n, \ diff --git a/app/src/hid.c b/app/src/hid.c index c3462dde..b66a910d 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -20,10 +20,12 @@ static struct zmk_hid_consumer_report consumer_report = {.report_id = 2, .body = // Only release the modifier if the count is 0. static int explicit_modifier_counts[8] = {0, 0, 0, 0, 0, 0, 0, 0}; static zmk_mod_flags_t explicit_modifiers = 0; +static zmk_mod_flags_t implicit_modifiers = 0; +static zmk_mod_flags_t masked_modifiers = 0; #define SET_MODIFIERS(mods) \ { \ - keyboard_report.body.modifiers = mods; \ + keyboard_report.body.modifiers = (mods & ~masked_modifiers) | implicit_modifiers; \ LOG_DBG("Modifiers set to 0x%02X", keyboard_report.body.modifiers); \ } @@ -158,13 +160,29 @@ static inline int check_keyboard_usage(zmk_key_t usage) { } \ } -int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t implicit_modifiers) { +int zmk_hid_implicit_modifiers_press(zmk_mod_flags_t new_implicit_modifiers) { + implicit_modifiers = new_implicit_modifiers; zmk_mod_flags_t current = GET_MODIFIERS; - SET_MODIFIERS(explicit_modifiers | implicit_modifiers); + SET_MODIFIERS(explicit_modifiers); return current == GET_MODIFIERS ? 0 : 1; } int zmk_hid_implicit_modifiers_release() { + implicit_modifiers = 0; + zmk_mod_flags_t current = GET_MODIFIERS; + SET_MODIFIERS(explicit_modifiers); + return current == GET_MODIFIERS ? 0 : 1; +} + +int zmk_hid_masked_modifiers_set(zmk_mod_flags_t new_masked_modifiers) { + masked_modifiers = new_masked_modifiers; + zmk_mod_flags_t current = GET_MODIFIERS; + SET_MODIFIERS(explicit_modifiers); + return current == GET_MODIFIERS ? 0 : 1; +} + +int zmk_hid_masked_modifiers_clear() { + masked_modifiers = 0; zmk_mod_flags_t current = GET_MODIFIERS; SET_MODIFIERS(explicit_modifiers); return current == GET_MODIFIERS ? 0 : 1; diff --git a/app/tests/mod-morph/1-no-morph/events.patterns b/app/tests/mod-morph/1-no-morph/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/1-no-morph/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/1-no-morph/keycode_events.snapshot b/app/tests/mod-morph/1-no-morph/keycode_events.snapshot new file mode 100644 index 00000000..3a2d70fe --- /dev/null +++ b/app/tests/mod-morph/1-no-morph/keycode_events.snapshot @@ -0,0 +1,5 @@ +pressed: keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap new file mode 100644 index 00000000..fb939de5 --- /dev/null +++ b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap @@ -0,0 +1,11 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/mod-morph/2a-masked-morph/events.patterns b/app/tests/mod-morph/2a-masked-morph/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2a-masked-morph/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot b/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot new file mode 100644 index 00000000..dcf2aae6 --- /dev/null +++ b/app/tests/mod-morph/2a-masked-morph/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap new file mode 100644 index 00000000..9ad50202 --- /dev/null +++ b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap @@ -0,0 +1,13 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot new file mode 100644 index 00000000..ce85f25d --- /dev/null +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 +reg implicit: Modifiers set to 0x02 +released: keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap new file mode 100644 index 00000000..74de8588 --- /dev/null +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap @@ -0,0 +1,37 @@ +#include +#include +#include + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, <&kp LS(B)>; // implict mod overwrite + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; + diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot new file mode 100644 index 00000000..561f88a9 --- /dev/null +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/keycode_events.snapshot @@ -0,0 +1,18 @@ +pressed: keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x04 +reg implicit: Modifiers set to 0x04 +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x06 +reg implicit: Modifiers set to 0x06 +mask mods: Modifiers set to 0x04 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x04 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x04 +unmask mods: Modifiers set to 0x06 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x04 +unreg implicit: Modifiers set to 0x04 +released: keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap new file mode 100644 index 00000000..d5406e19 --- /dev/null +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap @@ -0,0 +1,15 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot new file mode 100644 index 00000000..dcf2aae6 --- /dev/null +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap new file mode 100644 index 00000000..7071e8cd --- /dev/null +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap @@ -0,0 +1,45 @@ +#include +#include +#include + +&kscan { + events = < + /* Shift + tap &mod_morph --> expect B (but get Shift + B) */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, << 1 B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; + + second_layer { + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; +}; diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot new file mode 100644 index 00000000..ba70ee98 --- /dev/null +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x00 +pressed: keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x00 +released: keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x00 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap new file mode 100644 index 00000000..96c2f270 --- /dev/null +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap @@ -0,0 +1,47 @@ +#include +#include +#include + +&kscan { + events = < + /* Shift + hold &mod_morph --> expect and get D (no shift) */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, << 1 B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; + + second_layer { + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; +}; diff --git a/app/tests/mod-morph/3-unmasked-morph/events.patterns b/app/tests/mod-morph/3-unmasked-morph/events.patterns new file mode 100644 index 00000000..f1a41fcf --- /dev/null +++ b/app/tests/mod-morph/3-unmasked-morph/events.patterns @@ -0,0 +1,8 @@ +s/.*hid_listener_keycode_pressed.*keycode/pressed: keycode/p +s/.*hid_listener_keycode_released.*keycode/released: keycode/p +s/.*hid_register_mod.*Modifiers set to /reg explicit: Modifiers set to /p +s/.*hid_unregister_mod.*Modifiers set to /unreg explicit: Modifiers set to /p +s/.*hid_implicit_modifiers_press.*Modifiers set to /reg implicit: Modifiers set to /p +s/.*hid_implicit_modifiers_release.*Modifiers set to /unreg implicit: Modifiers set to /p +s/.*hid_masked_modifiers_set.*Modifiers set to /mask mods: Modifiers set to /p +s/.*hid_masked_modifiers_clear.*Modifiers set to /unmask mods: Modifiers set to /p diff --git a/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot b/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot new file mode 100644 index 00000000..424242d5 --- /dev/null +++ b/app/tests/mod-morph/3-unmasked-morph/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +reg explicit: Modifiers set to 0x02 +reg implicit: Modifiers set to 0x02 +mask mods: Modifiers set to 0x02 +pressed: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +reg implicit: Modifiers set to 0x02 +released: keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +unreg implicit: Modifiers set to 0x02 +unmask mods: Modifiers set to 0x02 +released: keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +unreg explicit: Modifiers set to 0x00 +unreg implicit: Modifiers set to 0x00 diff --git a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap new file mode 100644 index 00000000..a82d3ea7 --- /dev/null +++ b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap @@ -0,0 +1,37 @@ +#include +#include +#include + +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, <&kp B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + keep-mods = <(MOD_LSFT|MOD_RSFT)>; // no masking + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; +}; + +&kscan { + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; diff --git a/app/tests/mod-morph/behavior_keymap.dtsi b/app/tests/mod-morph/behavior_keymap.dtsi new file mode 100644 index 00000000..09720d8d --- /dev/null +++ b/app/tests/mod-morph/behavior_keymap.dtsi @@ -0,0 +1,23 @@ +/ { + behaviors { + mod_morph: mod_morph { + compatible = "zmk,behavior-mod-morph"; + label = "MOD_MORPH_TEST"; + #binding-cells = <0>; + bindings = <&kp A>, <&kp B>; + mods = <(MOD_LSFT|MOD_RSFT)>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; +}; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot index 43edb961..45719679 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/keycode_events.snapshot @@ -7,7 +7,7 @@ mods: Modifiers set to 0x03 released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 unreg: Modifier 0 count: 0 unreg: Modifier 0 released -unreg: Modifiers set to 0x00 +unreg: Modifiers set to 0x02 mods: Modifiers set to 0x00 released: usage_page 0x07 keycode 0x05 implicit_mods 0x02 explicit_mods 0x00 mods: Modifiers set to 0x00 diff --git a/docs/docs/behaviors/mod-morph.md b/docs/docs/behaviors/mod-morph.md index 2606aaf8..33d18e33 100644 --- a/docs/docs/behaviors/mod-morph.md +++ b/docs/docs/behaviors/mod-morph.md @@ -14,8 +14,6 @@ The Mod-Morph behavior sends a different keypress, depending on whether a specif The Mod-Morph behavior acts as one of two keycodes, depending on if the required modifier is being held during the keypress. -When the modifier is being held it is sent along with the morphed keycode. This can cause problems when the morphed keycode and modifier have an existing relationship (such as `shift-delete` or `ctrl-v` on many operating systems). - ### Configuration An example of how to implement the mod-morph "Grave Escape": @@ -31,10 +29,6 @@ An example of how to implement the mod-morph "Grave Escape": mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; }; }; - - keymap { - ... - }; }; ``` @@ -71,3 +65,26 @@ Example: ``` mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; ``` + +### Advanced configuration + +`keep-mods` + +When a modifier specified in `mods` is being held, it won't be sent along with the morphed keycode unless it is also specified in `keep-mods`. By default `keep-mods` equals `0`, which means no modifier specified in `mods` will be sent along with the morphed keycode. + +For example, the following configuration morphs `LEFT_SHIFT` + `BACKSPACE` into `DELETE`, and morphs `RIGHT_SHIFT` + `BACKSPACE` into `RIGHT_SHIFT` + `DELETE`. + +``` +/ { + behaviors { + bspc_del: backspace_delete { + compatible = "zmk,behavior-mod-morph"; + label = "BACKSPACE_DELETE"; + #binding-cells = <0>; + bindings = <&kp BACKSPACE>, <&kp DELETE>; + mods = <(MOD_LSFT|MOD_RSFT)>; + keep-mods = <(MOD_RSFT)>; + }; + }; +}; +``` From 3f00f14e36d3fda905d7b7be0ecadce23d5c9b97 Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:00:09 -0400 Subject: [PATCH 213/494] feat(docs): Added a Spelling Error Caution Notice --- docs/docs/codes/index.mdx | 2 ++ docs/src/components/codes/SpellingCaution.jsx | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 docs/src/components/codes/SpellingCaution.jsx diff --git a/docs/docs/codes/index.mdx b/docs/docs/codes/index.mdx index 6a2fbdc8..a701b4ce 100644 --- a/docs/docs/codes/index.mdx +++ b/docs/docs/codes/index.mdx @@ -5,6 +5,7 @@ hide_title: true slug: ./ --- +import SpellingCaution from "@site/src/components/codes/SpellingCaution"; import OsLegend from "@site/src/components/codes/OsLegend"; import ToastyContainer from "@site/src/components/codes/ToastyContainer"; import Key, { toc as keyToc } from "./_keyboard-keypad.mdx"; @@ -23,6 +24,7 @@ export const toc = [ ...powerToc, ]; + diff --git a/docs/src/components/codes/SpellingCaution.jsx b/docs/src/components/codes/SpellingCaution.jsx new file mode 100644 index 00000000..15ba9488 --- /dev/null +++ b/docs/src/components/codes/SpellingCaution.jsx @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: CC-BY-NC-SA-4.0 + */ + +import React from "react"; +import Admonition from "@theme/Admonition"; + +export default function SpellingCaution() { + return ( + +

+ Take extra notice of the spelling of the keycodes, especially the + shorthand spelling. Otherwise, it will result in an elusive parsing + error! +

+
+ ); +} + +SpellingCaution.propTypes = {}; From c9eb63199a2853af2395162ee574f2ed167f0aa0 Mon Sep 17 00:00:00 2001 From: ebastler Date: Tue, 18 Oct 2022 03:48:19 +0200 Subject: [PATCH 214/494] feat(keymaps): add NUHS/NUBS alias for Non-US-Backslash/Non-US-Hash --- app/include/dt-bindings/zmk/keys.h | 2 ++ docs/src/data/hid.js | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/include/dt-bindings/zmk/keys.h b/app/include/dt-bindings/zmk/keys.h index d144ebb3..3e67c402 100644 --- a/app/include/dt-bindings/zmk/keys.h +++ b/app/include/dt-bindings/zmk/keys.h @@ -263,6 +263,7 @@ /* Keyboard Non-US # and ~ (Non-US Hash/Number and Tilde) */ #define NON_US_HASH (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE)) +#define NUHS (NON_US_HASH) /* Keyboard ~ (Tilde) */ #define TILDE2 (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_HASH_AND_TILDE))) @@ -499,6 +500,7 @@ #define NON_US_BACKSLASH \ (ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE)) #define NON_US_BSLH (NON_US_BACKSLASH) +#define NUBS (NON_US_BACKSLASH) /* Keyboard Pipe */ #define PIPE2 (LS(ZMK_HID_USAGE(HID_USAGE_KEY, HID_USAGE_KEY_KEYBOARD_NON_US_BACKSLASH_AND_PIPE))) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index dde8bae4..00d48f3f 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -1356,7 +1356,7 @@ export default [ footnotes: {}, }, { - names: ["NON_US_HASH"], + names: ["NON_US_HASH", "NUHS"], description: "Non-US # [Hash/Pound] and ~ [Tilde]", context: "Keyboard", clarify: false, @@ -2606,7 +2606,7 @@ export default [ footnotes: {}, }, { - names: ["NON_US_BACKSLASH", "NON_US_BSLH"], + names: ["NON_US_BACKSLASH", "NON_US_BSLH", "NUBS"], description: "Non-US \\ [Backslash] and | [Pipe]", context: "Keyboard", clarify: false, From d3d5b8eb8a070bab19a0d053bcd94902b447df34 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Fri, 21 Oct 2022 22:10:55 -0500 Subject: [PATCH 215/494] fix(displays): Adjust alignment and spacing * Adjust alignment and spacing * Fix char array lengths --- app/src/display/status_screen.c | 2 +- app/src/display/widgets/battery_status.c | 5 +++-- app/src/display/widgets/layer_status.c | 8 ++++---- app/src/display/widgets/output_status.c | 16 ++++++++-------- app/src/display/widgets/wpm_status.c | 3 ++- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 6ace1925..0fe7212d 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -68,7 +68,7 @@ lv_obj_t *zmk_display_status_screen() { #if IS_ENABLED(CONFIG_ZMK_WIDGET_WPM_STATUS) zmk_widget_wpm_status_init(&wpm_status_widget, screen); - lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -12, + lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); #endif return screen; diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 3dfcdb47..9179b0d0 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -27,13 +27,13 @@ struct battery_status_state { }; static void set_battery_symbol(lv_obj_t *label, struct battery_status_state state) { - char text[2] = " "; + char text[8] = {}; uint8_t level = state.level; #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) if (state.usb_present) { - strcpy(text, LV_SYMBOL_CHARGE); + strcpy(text, LV_SYMBOL_CHARGE " "); } #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ @@ -49,6 +49,7 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat strcat(text, LV_SYMBOL_BATTERY_EMPTY); } lv_label_set_text(label, text); + lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } void battery_status_update_cb(struct battery_status_state state) { diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index 32bdb828..a4a7be58 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -24,15 +24,15 @@ struct layer_status_state { static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) { if (state.label == NULL) { - char text[6] = {}; + char text[7] = {}; - sprintf(text, LV_SYMBOL_KEYBOARD "%i", state.index); + sprintf(text, LV_SYMBOL_KEYBOARD " %i", state.index); lv_label_set_text(label, text); } else { - char text[12] = {}; + char text[13] = {}; - snprintf(text, 12, LV_SYMBOL_KEYBOARD "%s", state.label); + snprintf(text, sizeof(text), LV_SYMBOL_KEYBOARD " %s", state.label); lv_label_set_text(label, text); } diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index fe99ac96..8bbe1a7e 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -39,24 +39,24 @@ static struct output_status_state get_state(const zmk_event_t *_eh) { } static void set_status_symbol(lv_obj_t *label, struct output_status_state state) { - char text[9] = {}; + char text[10] = {}; switch (state.selected_endpoint) { case ZMK_ENDPOINT_USB: - strcat(text, LV_SYMBOL_USB " "); + strcat(text, LV_SYMBOL_USB); break; case ZMK_ENDPOINT_BLE: if (state.active_profile_bonded) { if (state.active_profile_connected) { - snprintf(text, sizeof(text), LV_SYMBOL_WIFI "%i " LV_SYMBOL_OK, - state.active_profile_index); + snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_OK, + state.active_profile_index + 1); } else { - snprintf(text, sizeof(text), LV_SYMBOL_WIFI "%i " LV_SYMBOL_CLOSE, - state.active_profile_index); + snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_CLOSE, + state.active_profile_index + 1); } } else { - snprintf(text, sizeof(text), LV_SYMBOL_WIFI "%i " LV_SYMBOL_SETTINGS, - state.active_profile_index); + snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_SETTINGS, + state.active_profile_index + 1); } break; } diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index 7ed047c3..a2c6a287 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -28,9 +28,10 @@ void set_wpm_symbol(lv_obj_t *label, struct wpm_status_state state) { char text[4] = {}; LOG_DBG("WPM changed to %i", state.wpm); - snprintf(text, sizeof(text), "%i ", state.wpm); + snprintf(text, sizeof(text), "%i", state.wpm); lv_label_set_text(label, text); + lv_obj_align(label, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); } void wpm_status_update_cb(struct wpm_status_state state) { From b90e3ae03d9f48a33f7327e9c478aa6fe215d0c6 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Sat, 22 Oct 2022 12:50:44 +0800 Subject: [PATCH 216/494] fix(ci): Replace workflow set-output with environment variables * Needed for deprecation: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ --- .github/workflows/build-user-config.yml | 67 +++++++++++-------------- 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 215ccb63..759dd72a 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -18,8 +18,8 @@ on: default: "bin" required: false type: string - artifact_name: - description: 'Artifact output file name' + archive_name: + description: 'Archive output file name' default: 'firmware' required: false type: string @@ -29,21 +29,18 @@ jobs: runs-on: ubuntu-latest name: Fetch Build Keyboards outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} + build_matrix: ${{ env.build_matrix }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3.1.0 - name: Install yaml2json run: python3 -m pip install remarshal - name: Fetch Build Matrix - id: set-matrix run: | - set -x - matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .) - yaml2json ${{ inputs.build_matrix_path }} - echo "::set-output name=matrix::${matrix}" + echo "build_matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .)" >> $GITHUB_ENV + yaml2json ${{ inputs.build_matrix_path }} | jq build: runs-on: ubuntu-latest @@ -53,35 +50,31 @@ jobs: name: Build strategy: fail-fast: false - matrix: ${{fromJson(needs.matrix.outputs.matrix)}} + matrix: ${{ fromJson(needs.matrix.outputs.build_matrix) }} steps: - name: Prepare variables - id: variables + shell: sh -x {0} run: | - set -x if [ -n "${{ matrix.shield }}" ] then - EXTRA_CMAKE_ARGS="-DSHIELD=\"${{ matrix.shield }}\"" - ARTIFACT_NAME="${{ matrix.shield }}-${{ matrix.board }}-zmk" - DISPLAY_NAME="${{ matrix.shield }} - ${{ matrix.board }}" + echo "extra_cmake_args=-DSHIELD=\"${{ matrix.shield }}\"" >> $GITHUB_ENV + echo "artifact_name=${{ matrix.shield }}-${{ matrix.board }}-zmk" >> $GITHUB_ENV + echo "display_name=${{ matrix.shield }} - ${{ matrix.board }}" >> $GITHUB_ENV else - EXTRA_CMAKE_ARGS= - DISPLAY_NAME="${{ matrix.board }}" - ARTIFACT_NAME="${{ matrix.board }}-zmk" + echo "extra_cmake_args=" >> $GITHUB_ENV + echo "artifact_name=${{ matrix.board }}-zmk" >> $GITHUB_ENV + echo "display_name=${{ matrix.board }}" >> $GITHUB_ENV fi - echo ::set-output name=extra-cmake-args::${EXTRA_CMAKE_ARGS} - echo ::set-output name=artifact-name::${ARTIFACT_NAME} - echo ::set-output name=display-name::${DISPLAY_NAME} - echo ::set-output name=zephyr-version::${ZEPHYR_VERSION} + echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3.1.0 - name: Cache west modules - uses: actions/cache@v3.0.2 + uses: actions/cache@v3.0.11 continue-on-error: true env: - cache-name: cache-zephyr-${{ steps.variables.outputs.zephyr-version }}-modules + cache_name: cache-zephyr-${{ env.zephyr_version }}-modules with: path: | modules/ @@ -89,9 +82,9 @@ jobs: zephyr/ bootloader/ zmk/ - key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/west.yml', '**/build.yaml') }} + key: ${{ runner.os }}-build-${{ env.cache_name }}-${{ hashFiles('**/west.yml', '**/build.yaml') }} restore-keys: | - ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build-${{ env.cache_name }}- ${{ runner.os }}-build- ${{ runner.os }}- @@ -104,28 +97,28 @@ jobs: - name: West Zephyr export run: west zephyr-export - - name: West Build (${{ steps.variables.outputs.display-name }}) + - name: West Build (${{ env.display_name }}) + shell: sh -x {0} run: | - set -x - west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ steps.variables.outputs.extra-cmake-args }} ${{ matrix.cmake-args }} + west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - - name: ${{ steps.variables.outputs.display-name }} Kconfig file + - name: ${{ env.display_name }} Kconfig file run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort - name: Rename artifacts + shell: sh -x {0} run: | - set -x mkdir build/artifacts if [ -f build/zephyr/zmk.uf2 ] then - cp build/zephyr/zmk.uf2 "build/artifacts/${{ steps.variables.outputs.artifact-name }}.uf2" + cp build/zephyr/zmk.uf2 "build/artifacts/${{ env.artifact_name }}.uf2" elif [ -f build/zephyr/zmk.${{ inputs.fallback_binary }} ] then - cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ steps.variables.outputs.artifact-name }}.${{ inputs.fallback_binary }}" + cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" fi - - name: Archive (${{ steps.variables.outputs.display-name }}) - uses: actions/upload-artifact@v2 + - name: Archive (${{ env.display_name }}) + uses: actions/upload-artifact@v3 with: - name: ${{ inputs.artifact_name }} + name: ${{ inputs.archive_name }} path: build/artifacts From f59da74a3e714825448b5dcde7794e175dea975a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Oct 2022 04:51:29 +0000 Subject: [PATCH 217/494] chore(deps): bump actions/checkout from 2 to 3.1.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.1.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3.1.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-user-config.yml | 4 ++-- .github/workflows/build.yml | 8 ++++---- .github/workflows/clang-format-lint.yml | 2 +- .github/workflows/doc-checks.yml | 6 +++--- .github/workflows/hardware-metadata-validation.yml | 6 +++--- .github/workflows/test.yml | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 759dd72a..3833abe8 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -32,7 +32,7 @@ jobs: build_matrix: ${{ env.build_matrix }} steps: - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3 - name: Install yaml2json run: python3 -m pip install remarshal @@ -68,7 +68,7 @@ jobs: echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v3.1.0 + uses: actions/checkout@v3 - name: Cache west modules uses: actions/cache@v3.0.11 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16373673..92df03c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,7 @@ jobs: include: ${{ fromJSON(needs.compile-matrix.outputs.include-list) }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Cache west modules uses: actions/cache@v3.0.2 env: @@ -151,7 +151,7 @@ jobs: core-include: ${{ steps.core-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: @@ -180,7 +180,7 @@ jobs: boards-include: ${{ steps.boards-list.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: @@ -307,7 +307,7 @@ jobs: organized-metadata: ${{ steps.organize-metadata.outputs.result }} steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: diff --git a/.github/workflows/clang-format-lint.yml b/.github/workflows/clang-format-lint.yml index 375bcd4e..8c2cfbcf 100644 --- a/.github/workflows/clang-format-lint.yml +++ b/.github/workflows/clang-format-lint.yml @@ -22,7 +22,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: DoozyX/clang-format-lint-action@v0.13 with: source: "./app" diff --git a/.github/workflows/doc-checks.yml b/.github/workflows/doc-checks.yml index a9b2d5ae..d048a03e 100644 --- a/.github/workflows/doc-checks.yml +++ b/.github/workflows/doc-checks.yml @@ -14,7 +14,7 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs @@ -24,7 +24,7 @@ jobs: prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs @@ -34,7 +34,7 @@ jobs: typecheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: docs diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 7b5ec927..c6566feb 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -18,8 +18,8 @@ jobs: check-metadata-format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - uses: bahmutov/npm-install@v1 with: working-directory: app @@ -31,7 +31,7 @@ jobs: container: image: docker.io/zmkfirmware/zmk-dev-arm:3.0 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Install dependencies run: pip install -r app/scripts/requirements.txt - name: West init diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3393d0c4..38c61eea 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Find test directories id: test-dirs run: | @@ -36,7 +36,7 @@ jobs: image: docker.io/zmkfirmware/zmk-build-arm:3.0 steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Cache west modules uses: actions/cache@v3.0.2 env: From 41fdd07315fbd683eba9a9d7f3475bf55ce9dcdb Mon Sep 17 00:00:00 2001 From: Jay Greco Date: Mon, 23 May 2022 08:00:01 +0000 Subject: [PATCH 218/494] feat(boards): Add nullbits SNAP shield --- app/boards/shields/snap/Kconfig.defconfig | 49 +++++++++++ app/boards/shields/snap/Kconfig.shield | 8 ++ .../shields/snap/boards/nice_nano.overlay | 37 ++++++++ .../shields/snap/boards/nice_nano_v2.overlay | 37 ++++++++ app/boards/shields/snap/snap.conf | 17 ++++ app/boards/shields/snap/snap.dtsi | 86 +++++++++++++++++++ app/boards/shields/snap/snap.keymap | 47 ++++++++++ app/boards/shields/snap/snap.zmk.yml | 15 ++++ app/boards/shields/snap/snap_left.overlay | 34 ++++++++ app/boards/shields/snap/snap_right.overlay | 51 +++++++++++ 10 files changed, 381 insertions(+) create mode 100644 app/boards/shields/snap/Kconfig.defconfig create mode 100644 app/boards/shields/snap/Kconfig.shield create mode 100644 app/boards/shields/snap/boards/nice_nano.overlay create mode 100644 app/boards/shields/snap/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/snap/snap.conf create mode 100644 app/boards/shields/snap/snap.dtsi create mode 100644 app/boards/shields/snap/snap.keymap create mode 100644 app/boards/shields/snap/snap.zmk.yml create mode 100644 app/boards/shields/snap/snap_left.overlay create mode 100644 app/boards/shields/snap/snap_right.overlay diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig new file mode 100644 index 00000000..24a8e5cc --- /dev/null +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -0,0 +1,49 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SNAP_LEFT + +config ZMK_KEYBOARD_NAME + default "SNAP" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + +if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT + +config ZMK_SPLIT + default y + +if ZMK_DISPLAY + +config I2C + default y + +config SSD1306 + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif diff --git a/app/boards/shields/snap/Kconfig.shield b/app/boards/shields/snap/Kconfig.shield new file mode 100644 index 00000000..eb02c45f --- /dev/null +++ b/app/boards/shields/snap/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SNAP_LEFT + def_bool $(shields_list_contains,snap_left) + +config SHIELD_SNAP_RIGHT + def_bool $(shields_list_contains,snap_right) diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay new file mode 100644 index 00000000..f869db5d --- /dev/null +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <10>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..f869db5d --- /dev/null +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <10>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/snap.conf b/app/boards/shields/snap/snap.conf new file mode 100644 index 00000000..e76bccb4 --- /dev/null +++ b/app/boards/shields/snap/snap.conf @@ -0,0 +1,17 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment these two lines to add support for encoders to your firmware +# and enable the encoders +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable the RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y +# CONFIG_ZMK_RGB_UNDERGLOW_HUE_STEP=5 +# CONFIG_ZMK_RGB_UNDERGLOW_SPD_START=1 \ No newline at end of file diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi new file mode 100644 index 00000000..0b7f32e5 --- /dev/null +++ b/app/boards/shields/snap/snap.dtsi @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan_composite; + zmk,matrix_transform = &default_transform; + }; + + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; + + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <17>; + rows = <6>; + +// | R0C06L | R0C05L | R0C04L | R0C03L | R0C02L | R0C01L | R0C00L | | R0C15R | R0C14R | R0C13R | R0C12R | R0C11R | R0C10R | R0C09R | R0C08R | +// R1C07L | R1C06L | R1C05L | R1C04L | R1C03L | R1C02L | R1C01L | R1C00L | | R1C15R | R1C14R | R1C13R | R1C12R | R1C11R | R1C10R | R1C09R | R1C08R | R2C0XR | +// R2C07L | R2C06L | R2C05L | R2C04L | R2C03L | R2C02L | R2C00L | | R2C15R | R2C14R | R2C13R | R2C12R | R2C11R | R2C10R | R2C09R | R3C08R | R2C08R | +// R3C07L | R3C06L | R3C05L | R3C04L | R3C03L | R3C02L | R3C00L | | R3C15R | R3C14R | R3C13R | R3C12R | R3C11R | R3C10R | R3C09R | R4C08R | +// R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | +// R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | + + map = < + RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) +RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) +RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,0) RC(2,15) RC(2,14) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(3,8) RC(2,8) +RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,0) RC(3,15) RC(3,14) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(4,8) +RC(4,7) RC(4,6) RC(4,5) RC(4,4) RC(4,3) RC(4,2) RC(4,1) RC(4,0) RC(4,15) RC(4,14) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(5,8) +RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) RC(5,14) RC(5,13) RC(5,12) RC(5,11) RC(5,10) RC(5,9) + >; + }; + + kscan_composite: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <6>; + columns = <17>; + + demux { + kscan = <&kscan_demux>; + }; + }; + + kscan_demux: kscan_demux { + compatible = "zmk,kscan-gpio-demux"; + label = "DEMUX"; + polling-interval-msec = <25>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap new file mode 100644 index 00000000..db44eb69 --- /dev/null +++ b/app/boards/shields/snap/snap.keymap @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = "Default"; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp KP_NUM &kp PAUSE_BREAK +&kp C_MUTE &kp TILDE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME +&kp F13 &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END +&kp F14 &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP +&kp F15 &kp LSHFT &kp NUHS &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN +&kp F16 &kp LCTRL &kp LGUI &kp LALT &mo 1 &kp SPACE &kp BSPC &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; + + function_layer { + label = "Function"; + sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; + bindings = < + &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader +&kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI + >; + }; + }; +}; diff --git a/app/boards/shields/snap/snap.zmk.yml b/app/boards/shields/snap/snap.zmk.yml new file mode 100644 index 00000000..718c7ba2 --- /dev/null +++ b/app/boards/shields/snap/snap.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: snap +name: SNAP +type: shield +url: https://nullbits.co/snap +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - snap_left + - snap_right diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay new file mode 100644 index 00000000..90fd66d1 --- /dev/null +++ b/app/boards/shields/snap/snap_left.overlay @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "snap.dtsi" + +&kscan_demux { + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; +}; + +&oled { + segment-remap; + com-invdir; +}; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay new file mode 100644 index 00000000..4243f518 --- /dev/null +++ b/app/boards/shields/snap/snap_right.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "snap.dtsi" + +/ { +kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + label = "DIRECT"; + input-gpios + = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; +}; + +&default_transform { + col-offset = <8>; +}; + +&kscan_composite { + direct { + kscan = <&kscan_direct>; + row-offset = <1>; + column-offset = <8>; + }; +}; + +&kscan_demux { + input-gpios + = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; +}; From 2d7c8f6073c065da695f4974bd8a892bb362f185 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 26 Oct 2022 05:28:18 +0000 Subject: [PATCH 219/494] chore(docs): Bump docusaurus and run audit fix. --- docs/package-lock.json | 15369 +++++++++++++++++++++------------------ docs/package.json | 12 +- 2 files changed, 8427 insertions(+), 6954 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 4297f7ac..61af445c 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,8 +8,8 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^2.0.0-beta.21", - "@docusaurus/preset-classic": "^2.0.0-beta.21", + "@docusaurus/core": "^2.1.0", + "@docusaurus/preset-classic": "^2.1.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -24,16 +24,16 @@ "web-tree-sitter": "^0.19.4" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.0.0-beta.21", - "@docusaurus/types": "^2.0.0-beta.21", + "@docusaurus/module-type-aliases": "^2.1.0", + "@docusaurus/types": "^2.1.0", "@tsconfig/docusaurus": "^1.0.5", "@types/js-yaml": "^4.0.5", "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^7.32.0", + "eslint": "^8.0.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-mdx": "^1.17.0", + "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.30.0", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", @@ -46,87 +46,99 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz", - "integrity": "sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", + "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", "dependencies": { - "@algolia/autocomplete-shared": "1.6.3" + "@algolia/autocomplete-shared": "1.7.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", + "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "dependencies": { + "@algolia/autocomplete-shared": "1.7.2" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz", - "integrity": "sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg==" + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", + "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz", - "integrity": "sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", + "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", "dependencies": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "node_modules/@algolia/cache-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.1.tgz", - "integrity": "sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", + "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz", - "integrity": "sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", + "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", "dependencies": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "node_modules/@algolia/client-account": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.1.tgz", - "integrity": "sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", + "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-analytics": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.1.tgz", - "integrity": "sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", + "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.1.tgz", - "integrity": "sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", + "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", "dependencies": { - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-personalization": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.1.tgz", - "integrity": "sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", + "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/client-search": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.1.tgz", - "integrity": "sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", + "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", "dependencies": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/@algolia/events": { @@ -135,127 +147,107 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.1.tgz", - "integrity": "sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", + "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" }, "node_modules/@algolia/logger-console": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.1.tgz", - "integrity": "sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", + "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", "dependencies": { - "@algolia/logger-common": "4.13.1" + "@algolia/logger-common": "4.14.2" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz", - "integrity": "sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", + "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", "dependencies": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "node_modules/@algolia/requester-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.1.tgz", - "integrity": "sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", + "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz", - "integrity": "sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", + "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", "dependencies": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "node_modules/@algolia/transporter": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.1.tgz", - "integrity": "sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", + "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", "dependencies": { - "@algolia/cache-common": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/requester-common": "4.13.1" + "@algolia/cache-common": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/requester-common": "4.14.2" } }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "dev": true, "dependencies": { "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "js-yaml": "^4.1.0" } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "dependencies": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -279,49 +271,62 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "dependencies": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.19.4", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dependencies": { - "@babel/types": "^7.16.7" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "engines": { @@ -340,17 +345,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", - "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -360,12 +365,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", - "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" }, "engines": { "node": ">=6.9.0" @@ -375,14 +380,12 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dependencies": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -392,14 +395,6 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -409,213 +404,228 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" - }, + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", - "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "dependencies": { - "@babel/types": "^7.18.2" + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "dependencies": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -658,20 +668,39 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -680,11 +709,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", - "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -693,22 +722,14 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", - "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -717,21 +738,14 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", - "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -741,21 +755,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -764,21 +770,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", - "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -788,20 +786,12 @@ "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-proposal-class-static-block/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -811,20 +801,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", - "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -834,20 +816,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", - "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -857,20 +831,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", - "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -880,20 +846,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", - "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -903,20 +861,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -926,33 +876,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "dependencies": { + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -962,21 +909,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", - "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -986,21 +925,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1009,22 +940,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", - "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1034,21 +957,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", - "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=4" @@ -1057,14 +972,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -1087,14 +994,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", @@ -1109,14 +1008,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -1140,11 +1031,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", - "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1153,14 +1044,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1173,11 +1056,14 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -1263,14 +1149,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", @@ -1285,20 +1163,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1307,20 +1177,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", - "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1329,22 +1191,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", - "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1353,20 +1207,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1375,20 +1221,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", - "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1397,26 +1235,19 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", - "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-replace-supers": "^7.18.2", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "engines": { @@ -1426,20 +1257,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", - "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1448,20 +1271,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", - "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1470,21 +1285,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1493,20 +1300,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", - "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1515,21 +1314,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1538,20 +1329,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", - "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1560,22 +1343,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dependencies": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1584,20 +1359,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", - "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1606,20 +1373,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1628,22 +1387,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", - "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1652,23 +1402,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", - "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.18.2", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -1677,24 +1418,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", - "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", "dependencies": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { "node": ">=6.9.0" @@ -1703,21 +1435,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", - "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1726,21 +1450,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", - "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1749,20 +1465,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", - "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1771,21 +1479,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1794,20 +1494,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", - "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1816,20 +1508,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1838,20 +1522,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -1860,20 +1536,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-constant-elements/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1882,24 +1550,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", - "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-jsx": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -1909,33 +1569,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", - "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/plugin-transform-react-jsx": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1945,12 +1583,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1959,20 +1597,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", - "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" }, "engines": { @@ -1982,20 +1612,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", - "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2004,24 +1626,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", - "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "engines": { @@ -2031,14 +1645,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2048,11 +1654,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2061,21 +1667,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", - "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2084,20 +1682,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2106,20 +1696,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", - "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2128,20 +1710,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", - "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2150,22 +1724,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", - "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", + "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-typescript": "^7.17.12" + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2174,20 +1740,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2196,21 +1754,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2219,46 +1769,38 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex/node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/preset-env": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", - "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-async-generator-functions": "^7.17.12", - "@babel/plugin-proposal-class-properties": "^7.17.12", - "@babel/plugin-proposal-class-static-block": "^7.18.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.17.12", - "@babel/plugin-proposal-json-strings": "^7.17.12", - "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.18.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-private-methods": "^7.17.12", - "@babel/plugin-proposal-private-property-in-object": "^7.17.12", - "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2268,44 +1810,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.17.12", - "@babel/plugin-transform-async-to-generator": "^7.17.12", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.17.12", - "@babel/plugin-transform-classes": "^7.17.12", - "@babel/plugin-transform-computed-properties": "^7.17.12", - "@babel/plugin-transform-destructuring": "^7.18.0", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.17.12", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.18.1", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.17.12", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-modules-systemjs": "^7.18.0", - "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", - "@babel/plugin-transform-new-target": "^7.17.12", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.17.12", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.18.0", - "@babel/plugin-transform-reserved-words": "^7.17.12", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.17.12", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.18.2", - "@babel/plugin-transform-typeof-symbol": "^7.17.12", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.19.4", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.2", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.19.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "engines": { @@ -2315,32 +1857,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", - "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", - "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.17.12" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2365,16 +1881,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", - "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2383,22 +1899,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-react/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/preset-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", - "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2407,18 +1915,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript/node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/runtime": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", - "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -2427,11 +1927,11 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz", - "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", + "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", "dependencies": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" }, "engines": { @@ -2439,31 +1939,31 @@ } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2472,11 +1972,12 @@ } }, "node_modules/@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2493,48 +1994,60 @@ } }, "node_modules/@docsearch/css": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.0.tgz", - "integrity": "sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", + "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" }, "node_modules/@docsearch/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.0.tgz", - "integrity": "sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", + "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", "dependencies": { - "@algolia/autocomplete-core": "1.6.3", - "@docsearch/css": "3.1.0", + "@algolia/autocomplete-core": "1.7.2", + "@algolia/autocomplete-preset-algolia": "1.7.2", + "@docsearch/css": "3.3.0", "algoliasearch": "^4.0.0" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", "react": ">= 16.8.0 < 19.0.0", "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, "node_modules/@docusaurus/core": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.21.tgz", - "integrity": "sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", "dependencies": { - "@babel/core": "^7.18.2", - "@babel/generator": "^7.18.2", + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.2", - "@babel/preset-env": "^7.18.2", - "@babel/preset-react": "^7.17.12", - "@babel/preset-typescript": "^7.17.12", - "@babel/runtime": "^7.18.3", - "@babel/runtime-corejs3": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/cssnano-preset": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "@slorber/static-site-generator-webpack-plugin": "^4.0.4", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", "babel-loader": "^8.2.5", @@ -2547,10 +2060,10 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.7", + "core-js": "^3.23.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.9", + "cssnano": "^5.1.12", "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", @@ -2563,7 +2076,7 @@ "import-fresh": "^3.3.0", "leven": "^3.1.0", "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.0", + "mini-css-extract-plugin": "^2.6.1", "postcss": "^8.4.14", "postcss-loader": "^7.0.0", "prompts": "^2.4.2", @@ -2574,19 +2087,18 @@ "react-router": "^5.3.3", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.3", - "remark-admonitions": "^1.2.1", "rtl-detect": "^1.0.4", "semver": "^7.3.7", "serve-handler": "^6.1.3", "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.1", + "terser-webpack-plugin": "^5.3.3", "tslib": "^2.4.0", "update-notifier": "^5.1.0", "url-loader": "^4.1.1", "wait-on": "^6.0.1", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.8.0", "webpackbar": "^5.0.2" }, @@ -2601,26 +2113,12 @@ "react-dom": "^16.8.4 || ^17.0.0" } }, - "node_modules/@docusaurus/core/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz", - "integrity": "sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", "dependencies": { - "cssnano-preset-advanced": "^5.3.5", + "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", "postcss-sort-media-queries": "^4.2.1", "tslib": "^2.4.0" @@ -2630,9 +2128,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz", - "integrity": "sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.4.0" @@ -2642,14 +2140,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz", - "integrity": "sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", "dependencies": { - "@babel/parser": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2659,9 +2157,10 @@ "remark-emoji": "^2.2.0", "stringify-object": "^3.3.0", "tslib": "^2.4.0", + "unified": "^9.2.2", "unist-util-visit": "^2.0.3", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2672,15 +2171,18 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.21.tgz", - "integrity": "sha512-gRkWICgQZiqSJgrwRKWjXm5gAB+9IcfYdUbCG0PRPP/G8sNs9zBIOY4uT4Z5ox2CWFEm44U3RTTxj7BiLVMBXw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", "dependencies": { - "@docusaurus/types": "2.0.0-beta.21", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.1.0", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*" + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" }, "peerDependencies": { "react": "*", @@ -2688,26 +2190,26 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.21.tgz", - "integrity": "sha512-IP21yJViP3oBmgsWBU5LhrG1MZXV4mYCQSoCAboimESmy1Z11RCNP2tXaqizE3iTmXOwZZL+SNBk06ajKCEzWg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "cheerio": "^1.0.0-rc.11", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "reading-time": "^1.5.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "unist-util-visit": "^2.0.3", "utility-types": "^3.10.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2717,126 +2219,27 @@ "react-dom": "^16.8.4 || ^17.0.0" } }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/cheerio": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", - "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/@docusaurus/plugin-content-blog/node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dependencies": { - "entities": "^4.3.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.21.tgz", - "integrity": "sha512-aa4vrzJy4xRy81wNskyhE3wzRf3AgcESZ1nfKh8xgHUkT7fDTZ1UWlg50Jb3LBCQFFyQG2XQB9N6llskI/KUnw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2847,18 +2250,18 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.21.tgz", - "integrity": "sha512-DmXOXjqNI+7X5hISzCvt54QIK6XBugu2MOxjxzuqI7q92Lk/EVdraEj5mthlH8IaEH/VlpWYJ1O9TzLqX5vH2g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" @@ -2869,12 +2272,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.21.tgz", - "integrity": "sha512-P54J4q4ecsyWW0Jy4zbimSIHna999AfbxpXGmF1IjyHrjoA3PtuakV1Ai51XrGEAaIq9q6qMQkEhbUd3CffGAw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2888,12 +2292,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz", - "integrity": "sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2905,12 +2310,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.21.tgz", - "integrity": "sha512-4zxKZOnf0rfh6myXLG7a6YZfQcxYDMBsWqANEjCX77H5gPdK+GHZuDrxK6sjFvRBv4liYCrNjo7HJ4DpPoT0zA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" }, "engines": { @@ -2922,15 +2328,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.21.tgz", - "integrity": "sha512-/ynWbcXZXcYZ6sT2X6vAJbnfqcPxwdGEybd0rcRZi4gBHq6adMofYI25AqELmnbBDxt0If+vlAeUHFRG5ueP7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2944,21 +2351,22 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-KvBnIUu7y69pNTJ9UhX6SdNlK6prR//J3L4rhN897tb8xx04xHHILlPXko2Il+C3Xzgh3OCgyvkoz9K6YlFTDw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/plugin-debug": "2.0.0-beta.21", - "@docusaurus/plugin-google-analytics": "2.0.0-beta.21", - "@docusaurus/plugin-google-gtag": "2.0.0-beta.21", - "@docusaurus/plugin-sitemap": "2.0.0-beta.21", - "@docusaurus/theme-classic": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-search-algolia": "2.0.0-beta.21" + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" }, "engines": { "node": ">=16.14" @@ -2981,31 +2389,35 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-Ge0WNdTefD0VDQfaIMRRWa8tWMG9+8/OlBRd5MK88/TZfqdBq7b/gnCSaalQlvZwwkj6notkKhHx72+MKwWUJA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", "dependencies": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@mdx-js/react": "^1.6.22", - "clsx": "^1.1.1", + "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.39", + "infima": "0.2.0-alpha.42", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "prismjs": "^1.28.0", "react-router-dom": "^5.3.3", "rtlcss": "^3.5.0", - "tslib": "^2.4.0" + "tslib": "^2.4.0", + "utility-types": "^3.10.0" }, "engines": { "node": ">=16.14" @@ -3016,17 +2428,22 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.21.tgz", - "integrity": "sha512-fTKoTLRfjuFG6c3iwnVjIIOensxWMgdBKLfyE5iih3Lq7tQgkE7NyTGG9BKLrnTJ7cAD2UXdXM9xbB7tBf1qzg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", "dependencies": { - "@docusaurus/module-type-aliases": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "clsx": "^1.1.1", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", "utility-types": "^3.10.0" }, @@ -3039,21 +2456,21 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.21.tgz", - "integrity": "sha512-T1jKT8MVSSfnztSqeebUOpWHPoHKtwDXtKYE0xC99JWoZ+mMfv8AFhVSoSddn54jLJjV36mxg841eHQIySMCpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", "dependencies": { - "@docsearch/react": "^3.1.0", - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.8.2", - "clsx": "^1.1.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", "eta": "^1.12.3", "fs-extra": "^10.1.0", "lodash": "^4.17.21", @@ -3069,9 +2486,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.21.tgz", - "integrity": "sha512-dLVT9OIIBs6MpzMb1bAy+C0DPJK3e3DNctG+ES0EP45gzEqQxzs4IsghpT+QDaOsuhNnAlosgJpFWX3rqxF9xA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", "dependencies": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" @@ -3081,16 +2498,17 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.21.tgz", - "integrity": "sha512-/GH6Npmq81eQfMC/ikS00QSv9jNyO1RXEpNSx5GLA3sFX8Iib26g2YI2zqNplM8nyxzZ2jVBuvUoeODTIbTchQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", "commander": "^5.1.0", - "history": "^4.9.0", "joi": "^17.6.0", "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-merge": "^5.8.0" }, "peerDependencies": { @@ -3099,11 +2517,11 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz", - "integrity": "sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", "dependencies": { - "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", "@svgr/webpack": "^6.2.1", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", @@ -3117,30 +2535,46 @@ "shelljs": "^0.8.5", "tslib": "^2.4.0", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" }, "engines": { "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, "node_modules/@docusaurus/utils-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz", - "integrity": "sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", "dependencies": { "tslib": "^2.4.0" }, "engines": { "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz", - "integrity": "sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", "dependencies": { - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -3150,38 +2584,32 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "devOptional": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -3193,56 +2621,55 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "devOptional": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=10" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==", + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", - "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.18.tgz", - "integrity": "sha512-RwLIB4TZw0M9gvy5u+TusAA0afbwM4JQIimNH/j3ygd6aIvYPQLqXMhC9ErY26J23rDPyDZldIfPq/HpTTJ/tQ==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", "dependencies": { "prop-types": "^15.8.1" }, @@ -3251,20 +2678,10 @@ "react": ">=16.x" } }, - "node_modules/@fortawesome/react-fontawesome/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "node_modules/@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "node_modules/@hapi/topo": { "version": "5.1.0", @@ -3275,12 +2692,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "devOptional": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -3288,37 +2705,76 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "devOptional": true }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dependencies": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { "node": ">=6.0.0" } @@ -3332,18 +2788,31 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@jsdevtools/ono": { @@ -3417,6 +2886,17 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@mdx-js/mdx/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3425,6 +2905,59 @@ "semver": "bin/semver" } }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/@mdx-js/react": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", @@ -3478,6 +3011,26 @@ "node": ">= 8" } }, + "node_modules/@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -3501,6 +3054,11 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, "node_modules/@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -3510,37 +3068,22 @@ } }, "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz", - "integrity": "sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", "dependencies": { - "bluebird": "^3.7.1", - "cheerio": "^0.22.0", "eval": "^0.1.8", - "webpack-sources": "^1.4.3" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@slorber/static-site-generator-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "node": ">=14" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg==", "engines": { "node": ">=10" }, @@ -3553,9 +3096,9 @@ } }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", "engines": { "node": ">=10" }, @@ -3568,9 +3111,9 @@ } }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", "engines": { "node": ">=10" }, @@ -3583,9 +3126,9 @@ } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz", + "integrity": "sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA==", "engines": { "node": ">=10" }, @@ -3598,9 +3141,9 @@ } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz", + "integrity": "sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw==", "engines": { "node": ">=10" }, @@ -3613,9 +3156,9 @@ } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz", + "integrity": "sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg==", "engines": { "node": ">=10" }, @@ -3628,9 +3171,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz", + "integrity": "sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw==", "engines": { "node": ">=10" }, @@ -3643,9 +3186,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz", + "integrity": "sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig==", "engines": { "node": ">=12" }, @@ -3658,18 +3201,18 @@ } }, "node_modules/@svgr/babel-preset": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", - "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.0.tgz", + "integrity": "sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg==", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", - "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.5.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.0", + "@svgr/babel-plugin-transform-svg-component": "^6.5.0" }, "engines": { "node": ">=10" @@ -3683,11 +3226,13 @@ } }, "node_modules/@svgr/core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", - "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.0.tgz", + "integrity": "sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w==", "dependencies": { - "@svgr/plugin-jsx": "^6.2.1", + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.1" }, @@ -3700,12 +3245,12 @@ } }, "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", - "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz", + "integrity": "sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA==", "dependencies": { - "@babel/types": "^7.15.6", - "entities": "^3.0.1" + "@babel/types": "^7.18.4", + "entities": "^4.3.0" }, "engines": { "node": ">=10" @@ -3715,26 +3260,15 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/@svgr/plugin-jsx": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", - "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz", + "integrity": "sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw==", "dependencies": { - "@babel/core": "^7.15.5", - "@svgr/babel-preset": "^6.2.0", - "@svgr/hast-util-to-babel-ast": "^6.2.1", - "svg-parser": "^2.0.2" + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/hast-util-to-babel-ast": "^6.5.0", + "svg-parser": "^2.0.4" }, "engines": { "node": ">=10" @@ -3748,13 +3282,13 @@ } }, "node_modules/@svgr/plugin-svgo": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", - "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz", + "integrity": "sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw==", "dependencies": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", - "svgo": "^2.5.0" + "svgo": "^2.8.0" }, "engines": { "node": ">=10" @@ -3768,18 +3302,18 @@ } }, "node_modules/@svgr/webpack": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", - "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.0.tgz", + "integrity": "sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ==", "dependencies": { - "@babel/core": "^7.15.5", - "@babel/plugin-transform-react-constant-elements": "^7.14.5", - "@babel/preset-env": "^7.15.6", - "@babel/preset-react": "^7.14.5", - "@babel/preset-typescript": "^7.15.0", - "@svgr/core": "^6.2.1", - "@svgr/plugin-jsx": "^6.2.1", - "@svgr/plugin-svgo": "^6.2.0" + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", + "@svgr/plugin-svgo": "^6.5.0" }, "engines": { "node": ">=10" @@ -3809,11 +3343,20 @@ } }, "node_modules/@tsconfig/docusaurus": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.5.tgz", - "integrity": "sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", + "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", "dev": true }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -3848,33 +3391,51 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } }, "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -3883,9 +3444,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3893,9 +3454,9 @@ } }, "node_modules/@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", + "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -3911,9 +3472,9 @@ } }, "node_modules/@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", @@ -3928,6 +3489,27 @@ "@types/node": "*" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", @@ -3935,39 +3517,45 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", "dev": true }, "node_modules/@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, "node_modules/@types/node": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", - "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==" + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3980,15 +3568,15 @@ "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, "node_modules/@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/qs": { "version": "6.9.7", @@ -4001,9 +3589,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "version": "17.0.51", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", + "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4020,11 +3608,11 @@ } }, "node_modules/@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*" } }, @@ -4038,17 +3626,12 @@ "@types/react-router": "*" } }, - "node_modules/@types/react-router-config/node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, "node_modules/@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "dependencies": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } @@ -4067,9 +3650,9 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/serve-index": { "version": "1.9.1", @@ -4080,11 +3663,11 @@ } }, "node_modules/@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "dependencies": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, @@ -4097,9 +3680,9 @@ } }, "node_modules/@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "node_modules/@types/ws": { "version": "8.5.3", @@ -4109,6 +3692,19 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -4262,10 +3858,29 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "bin": { "acorn": "bin/acorn" }, @@ -4299,11 +3914,11 @@ } }, "node_modules/address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", "engines": { - "node": ">= 0.12.0" + "node": ">= 10.0.0" } }, "node_modules/aggregate-error": { @@ -4378,35 +3993,35 @@ } }, "node_modules/algoliasearch": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.1.tgz", - "integrity": "sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", + "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", "dependencies": { - "@algolia/cache-browser-local-storage": "4.13.1", - "@algolia/cache-common": "4.13.1", - "@algolia/cache-in-memory": "4.13.1", - "@algolia/client-account": "4.13.1", - "@algolia/client-analytics": "4.13.1", - "@algolia/client-common": "4.13.1", - "@algolia/client-personalization": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/logger-console": "4.13.1", - "@algolia/requester-browser-xhr": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/requester-node-http": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/cache-browser-local-storage": "4.14.2", + "@algolia/cache-common": "4.14.2", + "@algolia/cache-in-memory": "4.14.2", + "@algolia/client-account": "4.14.2", + "@algolia/client-analytics": "4.14.2", + "@algolia/client-common": "4.14.2", + "@algolia/client-personalization": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/logger-console": "4.14.2", + "@algolia/requester-browser-xhr": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/requester-node-http": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "node_modules/algoliasearch-helper": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz", - "integrity": "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", "dependencies": { "@algolia/events": "^4.0.1" }, "peerDependencies": { - "algoliasearch": ">= 3.1 < 5" + "algoliasearch": ">= 3.1 < 6" } }, "node_modules/ansi-align": { @@ -4417,13 +4032,22 @@ "string-width": "^4.1.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "devOptional": true, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/ansi-html-community": { @@ -4462,7 +4086,7 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, "node_modules/anymatch": { @@ -4478,9 +4102,9 @@ } }, "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -4511,22 +4135,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-includes/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4558,15 +4166,6 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -4576,9 +4175,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "funding": [ { "type": "opencollective", @@ -4590,8 +4189,8 @@ } ], "dependencies": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4633,23 +4232,6 @@ "webpack": ">=2" } }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/babel-plugin-apply-mdx-type-prop": { "version": "1.6.22", "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", @@ -4666,6 +4248,11 @@ "@babel/core": "^7.11.6" } }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "node_modules/babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -4686,13 +4273,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dependencies": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "peerDependencies": { @@ -4708,23 +4300,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.3.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -4770,15 +4362,10 @@ "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -4788,7 +4375,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -4820,20 +4407,20 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", - "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" + "multicast-dns": "^7.2.5" } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/boxen": { "version": "6.2.1", @@ -4856,58 +4443,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz", - "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4929,9 +4464,9 @@ } }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "funding": [ { "type": "opencollective", @@ -4943,11 +4478,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" }, "bin": { "browserslist": "cli.js" @@ -4957,14 +4491,14 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } @@ -5031,7 +4565,7 @@ "node_modules/call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", "dev": true }, "node_modules/callsites": { @@ -5082,9 +4616,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001346", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", - "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==", + "version": "1.0.30001425", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", + "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", "funding": [ { "type": "opencollective", @@ -5120,17 +4654,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/character-entities": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", @@ -5141,9 +4664,9 @@ } }, "node_modules/character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, "funding": { "type": "github", @@ -5169,29 +4692,23 @@ } }, "node_modules/cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dependencies": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, "node_modules/cheerio-select": { @@ -5210,127 +4727,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dependencies": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "node_modules/cheerio/node_modules/css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", - "engines": { - "node": "*" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dependencies": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "node_modules/cheerio/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/cheerio/node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dependencies": { - "boolbase": "~1.0.0" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -5358,35 +4754,27 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dependencies": { - "tslib": "^1.9.0" - }, + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "engines": { "node": ">=6.0" } }, - "node_modules/chrome-trace-event/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" }, "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "node_modules/clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", "dependencies": { "source-map": "~0.6.0" }, @@ -5394,14 +4782,6 @@ "node": ">= 10.0" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -5422,32 +4802,25 @@ } }, "node_modules/cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", "dev": true, "dependencies": { - "ansi-regex": "^2.1.1", "d": "^1.0.1", - "es5-ext": "^0.10.51", + "es5-ext": "^0.10.61", "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", + "memoizee": "^0.4.15", "timers-ext": "^0.1.7" - } - }, - "node_modules/cli-color/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, "node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dependencies": { "string-width": "^4.2.0" }, @@ -5458,6 +4831,24 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -5472,17 +4863,20 @@ } }, "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "engines": { "node": ">=6" } @@ -5513,14 +4907,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "node_modules/combine-promises": { "version": "1.1.0", @@ -5563,6 +4957,14 @@ "node": ">= 0.6" } }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", @@ -5593,10 +4995,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/configstore": { "version": "5.0.1", @@ -5615,9 +5022,9 @@ } }, "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "engines": { "node": ">=0.8" } @@ -5630,7 +5037,7 @@ "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "engines": { "node": ">= 0.6" } @@ -5644,12 +5051,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { "version": "0.5.0", @@ -5676,9 +5080,9 @@ } }, "node_modules/copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", + "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", "dependencies": { "toggle-selection": "^1.0.6" } @@ -5744,9 +5148,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", - "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -5761,14 +5165,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } - }, "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -5804,9 +5200,9 @@ } }, "node_modules/core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5814,30 +5210,21 @@ } }, "node_modules/core-js-compat": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", - "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", "dependencies": { - "browserslist": "^4.20.3", - "semver": "7.0.0" + "browserslist": "^4.21.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/core-js-pure": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz", - "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5894,9 +5281,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "engines": { "node": "^10 || ^12 || >=14" }, @@ -5930,13 +5317,13 @@ } }, "node_modules/css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "dependencies": { "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" @@ -5955,6 +5342,9 @@ "@parcel/css": { "optional": true }, + "@swc/css": { + "optional": true + }, "clean-css": { "optional": true }, @@ -5963,6 +5353,9 @@ }, "esbuild": { "optional": true + }, + "lightningcss": { + "optional": true } } }, @@ -6015,23 +5408,15 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -6050,14 +5435,6 @@ "node": ">=8.0.0" } }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", @@ -6081,11 +5458,11 @@ } }, "node_modules/cssnano": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", - "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", "dependencies": { - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, @@ -6101,12 +5478,12 @@ } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.6.tgz", - "integrity": "sha512-OZHsytu16eStRVrIY3wmPQqhJMaI0+O3raU4JHoKV3uuQYEeQek/FJVUIvYXD55hWR6OjCMyKYNRDw+k3/xgUw==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", + "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", "dependencies": { "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -6120,11 +5497,11 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", - "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", "dependencies": { - "css-declaration-sorter": "^6.2.2", + "css-declaration-sorter": "^6.3.0", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", @@ -6133,7 +5510,7 @@ "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.5", + "postcss-merge-longhand": "^5.1.6", "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", @@ -6141,14 +5518,14 @@ "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.0", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", + "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.0", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", @@ -6184,9 +5561,9 @@ } }, "node_modules/csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "node_modules/d": { "version": "1.0.1", @@ -6199,9 +5576,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6214,10 +5591,33 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decode-named-character-reference/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -6234,9 +5634,9 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "devOptional": true }, "node_modules/deepmerge": { @@ -6272,14 +5672,18 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dependencies": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/del": { @@ -6311,6 +5715,15 @@ "node": ">= 0.8" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -6338,19 +5751,16 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dependencies": { "address": "^1.0.1", - "debug": "^2.6.0" + "debug": "4" }, "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" } }, "node_modules/detect-port-alt": { @@ -6382,19 +5792,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/detect-port/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" } }, - "node_modules/detect-port/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6412,9 +5818,9 @@ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "node_modules/dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -6443,13 +5849,13 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -6467,11 +5873,11 @@ ] }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -6481,13 +5887,13 @@ } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -6527,9 +5933,9 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "node_modules/eastasianwidth": { "version": "0.2.0", @@ -6542,9 +5948,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.144", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.144.tgz", - "integrity": "sha512-R3RV3rU1xWwFJlSClVWDvARaOk6VUO/FubHLodIASDB3Mc2dzuWvNdfOgH9bwHUTqT79u92qw60NWfwUdzAqdg==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6584,22 +5990,25 @@ "once": "^1.4.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "devOptional": true, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dependencies": { - "ansi-colors": "^4.1.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=8.6" + "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -6613,31 +6022,32 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -6649,18 +6059,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-abstract/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -6693,20 +6091,24 @@ } }, "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "dev": true, + "hasInstallScript": true, "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, "dependencies": { "d": "1", @@ -6755,7 +6157,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -6769,57 +6171,56 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "devOptional": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6838,41 +6239,232 @@ } }, "node_modules/eslint-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.17.0.tgz", - "integrity": "sha512-O8+JRfwCzpoR2P6zUI1GDAAM/bsuzcoBS1ArvpQrgQO/E2Km0vBmM15ukiJxZ+YUh5d+qDlrqha0fZB50MojJQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-2.0.5.tgz", + "integrity": "sha512-1ZzcJwJNfladtuK+uuG/MdC0idc1e3d1vCI2STOq/pLcJBGuao2biWh90vEh2M93zDiNoHJGUIU7UAxupiiHFw==", "dev": true, "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "cosmiconfig": "^7.0.1", - "remark-mdx": "^1.6.22", - "remark-parse": "^8.0.3", - "remark-stringify": "^8.1.1", - "tslib": "^2.3.1", - "unified": "^9.2.2" + "espree": "^9.4.0", + "estree-util-visit": "^1.2.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "synckit": "^0.8.4", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "uvu": "^0.5.6", + "vfile": "^5.3.4" }, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { - "eslint": ">=5.0.0" + "eslint": ">=8.0.0" + } + }, + "node_modules/eslint-mdx/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-mdx/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-mdx/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/eslint-mdx/node_modules/remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/eslint-mdx/node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "dev": true, "dependencies": { - "bail": "^1.0.0", + "@types/unist": "^2.0.0", + "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-mdx/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" }, "funding": { "type": "opencollective", @@ -6880,47 +6472,212 @@ } }, "node_modules/eslint-plugin-markdown": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", - "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", + "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", "dev": true, "dependencies": { "mdast-util-from-markdown": "^0.8.5" }, "engines": { - "node": "^8.10.0 || ^10.12.0 || >= 12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=6.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/eslint-plugin-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.17.0.tgz", - "integrity": "sha512-Kicizy+fbfsB2UxTDXP92qTtFqITApu4v4DRQUfXMoPwBHeQRvZnaEtXu2S9aia51GYRYsMSqUvoPPih/5oB+g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-2.0.5.tgz", + "integrity": "sha512-j2xN97jSlc5IoH94rJTHqYMztl46+hHzyC8Zqjx+OI1Rvv33isyf8xSSBHN6f0z8IJmgPgGsb/fH90JbvKplXg==", "dev": true, "dependencies": { - "eslint-mdx": "^1.17.0", - "eslint-plugin-markdown": "^2.2.1", - "synckit": "^0.4.1", - "tslib": "^2.3.1", - "vfile": "^4.2.1" + "eslint-mdx": "^2.0.5", + "eslint-plugin-markdown": "^3.0.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "vfile": "^5.3.4" }, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { - "eslint": ">=5.0.0" + "eslint": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "dependencies": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/eslint-plugin-mdx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/eslint-plugin-react": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", - "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "dependencies": { "array-includes": "^3.1.5", @@ -6957,46 +6714,18 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-react/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7012,42 +6741,37 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "devOptional": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "devOptional": true, "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "devOptional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", @@ -7056,28 +6780,31 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "devOptional": true, - "dependencies": { - "@babel/highlight": "^7.10.4" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "devOptional": true, "dependencies": { - "sprintf-js": "~1.0.2" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -7089,52 +6816,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "devOptional": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "engines": { + "node": ">=10" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "devOptional": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "devOptional": true, - "engines": { - "node": ">=4" + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -7161,15 +6869,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "devOptional": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7181,20 +6880,36 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "engines": { "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" + "node_modules/estree-util-is-identifier-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz", + "integrity": "sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.0.tgz", + "integrity": "sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/esutils": { @@ -7239,7 +6954,7 @@ "node_modules/event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dev": true, "dependencies": { "d": "1", @@ -7293,13 +7008,13 @@ } }, "node_modules/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -7318,7 +7033,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -7375,38 +7090,19 @@ "node": ">= 0.6" } }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, "dependencies": { - "type": "^2.0.0" + "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true }, "node_modules/extend": { @@ -7431,9 +7127,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7453,13 +7149,13 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "devOptional": true }, "node_modules/fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "dependencies": { "punycode": "^1.3.2" } @@ -7552,6 +7248,23 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -7618,15 +7331,18 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -7643,9 +7359,9 @@ } }, "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "devOptional": true }, "node_modules/flux": { @@ -7661,9 +7377,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -7820,7 +7536,20 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.1", @@ -7845,12 +7574,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "devOptional": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -7869,13 +7592,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7926,19 +7649,19 @@ } }, "node_modules/github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -8045,6 +7768,12 @@ "node": ">=4" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -8064,13 +7793,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "engines": { - "node": ">= 4" - } + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true }, "node_modules/got": { "version": "9.6.0", @@ -8094,9 +7821,15 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "devOptional": true }, "node_modules/gray-matter": { "version": "4.0.3", @@ -8183,7 +7916,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -8192,9 +7924,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -8260,6 +7992,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-from-parse5/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", @@ -8290,6 +8050,39 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-raw/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-parse5": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", @@ -8381,6 +8174,11 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8465,73 +8263,23 @@ } }, "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] - }, - "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/htmlparser2/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + ], "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -8558,9 +8306,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "node_modules/http-proxy": { "version": "1.18.1", @@ -8640,18 +8388,17 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "devOptional": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "engines": { "node": ">= 4" } }, "node_modules/image-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz", - "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", "dependencies": { "queue": "6.0.2" }, @@ -8659,13 +8406,13 @@ "image-size": "bin/image-size.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/immer": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", - "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==", + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -8689,7 +8436,7 @@ "node_modules/import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", "engines": { "node": ">=4" } @@ -8697,7 +8444,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } @@ -8711,9 +8458,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.39", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz", - "integrity": "sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw==", + "version": "0.2.0-alpha.42", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", + "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", "engines": { "node": ">=12" } @@ -8721,7 +8468,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8789,15 +8536,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", @@ -8814,7 +8552,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -8878,9 +8616,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" @@ -8900,10 +8638,15 @@ "is-ci": "bin.js" } }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { "has": "^1.0.3" }, @@ -8960,7 +8703,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } @@ -9191,7 +8934,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-weakref": { "version": "1.0.2", @@ -9242,32 +8985,49 @@ "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { "node": ">=0.10.0" } }, + "node_modules/jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "dependencies": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "dependencies": { "@types/node": "*", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { @@ -9285,9 +9045,9 @@ } }, "node_modules/joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.6.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz", + "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==", "dependencies": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", @@ -9296,6 +9056,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "devOptional": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9326,7 +9092,7 @@ "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -9334,12 +9100,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "dev": true, "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.7" + "@apidevtools/json-schema-ref-parser": "9.0.9" }, "engines": { "node": ">=10" @@ -9374,18 +9140,6 @@ "node": ">=10.0.0" } }, - "node_modules/json-schema-to-typescript/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9394,13 +9148,13 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/json5": { @@ -9426,13 +9180,13 @@ } }, "node_modules/jsx-ast-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz", - "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "object.assign": "^4.1.2" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" }, "engines": { "node": ">=4.0" @@ -9503,30 +9257,30 @@ } }, "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -9537,14 +9291,17 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -9552,22 +9309,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "node_modules/lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "devOptional": true - }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", @@ -9576,38 +9317,13 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, - "node_modules/lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -9616,32 +9332,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "node_modules/lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, - "node_modules/lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "devOptional": true }, "node_modules/lodash.uniq": { @@ -9650,9 +9341,9 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "node_modules/longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", + "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", "dev": true, "funding": { "type": "github", @@ -9700,7 +9391,7 @@ "node_modules/lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "dev": true, "dependencies": { "es5-ext": "~0.10.2" @@ -9737,19 +9428,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "dependencies": { - "repeat-string": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/mdast-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", @@ -9762,19 +9440,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dev": true, - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", @@ -9804,6 +9469,411 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-mdx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz", + "integrity": "sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==", + "dev": true, + "dependencies": { + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.1.tgz", + "integrity": "sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/mdast-util-mdx-expression/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.0.tgz", + "integrity": "sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.0.tgz", + "integrity": "sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-remove-position": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz", + "integrity": "sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.0.tgz", + "integrity": "sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-hast": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", @@ -9823,6 +9893,84 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/zwitch": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", + "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", @@ -9851,11 +9999,11 @@ } }, "node_modules/memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" @@ -9877,12 +10025,6 @@ "timers-ext": "^0.1.7" } }, - "node_modules/memoizee/node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -9929,6 +10071,578 @@ "parse-entities": "^2.0.0" } }, + "node_modules/micromark-core-commonmark": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", + "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz", + "integrity": "sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz", + "integrity": "sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==", + "dev": true, + "dependencies": { + "@types/acorn": "^4.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz", + "integrity": "sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==", + "dev": true, + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz", + "integrity": "sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==", + "dev": true, + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz", + "integrity": "sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==", + "dev": true, + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz", + "integrity": "sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz", + "integrity": "sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-location": "^4.0.0", + "vfile-message": "^3.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", + "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", + "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -9953,19 +10667,19 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "~1.33.0" }, "engines": { "node": ">= 0.6" @@ -9987,23 +10701,10 @@ "node": ">=4" } }, - "node_modules/mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "dependencies": { "schema-utils": "^4.0.0" }, @@ -10073,9 +10774,9 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10084,14 +10785,38 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/mrmime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", - "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "engines": { "node": ">=10" } @@ -10147,7 +10872,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "devOptional": true }, "node_modules/negotiator": { @@ -10164,9 +10889,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "node_modules/no-case": { @@ -10214,9 +10939,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -10262,9 +10987,9 @@ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { "boolbase": "^1.0.0" }, @@ -10292,18 +11017,36 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10317,13 +11060,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -10377,22 +11120,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", @@ -10437,7 +11164,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -10506,28 +11233,31 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -10646,9 +11376,15 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", @@ -10662,42 +11398,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dependencies": { - "entities": "^4.3.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10726,7 +11426,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } @@ -10734,7 +11434,7 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "node_modules/path-key": { "version": "3.1.1", @@ -10792,6 +11492,54 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pkg-up": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", @@ -10826,6 +11574,20 @@ "node": ">=6" } }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -10846,9 +11608,9 @@ } }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "funding": [ { "type": "opencollective", @@ -10971,9 +11733,9 @@ } }, "node_modules/postcss-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", - "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", @@ -10991,20 +11753,6 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/postcss-merge-idents": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", @@ -11021,9 +11769,9 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", - "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" @@ -11193,9 +11941,9 @@ } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11207,9 +11955,9 @@ } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -11293,9 +12041,9 @@ } }, "node_modules/postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -11363,17 +12111,17 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", - "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", "dependencies": { - "sort-css-media-queries": "2.0.4" + "sort-css-media-queries": "2.1.0" }, "engines": { "node": ">=10.0.0" }, "peerDependencies": { - "postcss": "^8.4.4" + "postcss": "^8.4.16" } }, "node_modules/postcss-svgo": { @@ -11447,7 +12195,7 @@ "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "engines": { "node": ">=4" } @@ -11482,17 +12230,17 @@ } }, "node_modules/prism-react-renderer": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz", - "integrity": "sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", "peerDependencies": { "react": ">=0.14.9" } }, "node_modules/prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "engines": { "node": ">=6" } @@ -11502,15 +12250,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "devOptional": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -11532,13 +12271,13 @@ } }, "node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "node_modules/property-information": { @@ -11585,7 +12324,7 @@ "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/pupa": { "version": "2.1.1", @@ -11604,9 +12343,9 @@ "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" }, "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -11655,7 +12394,7 @@ "node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "engines": { "node": ">= 0.6" } @@ -11699,7 +12438,7 @@ "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { "node": ">=0.10.0" } @@ -11727,7 +12466,7 @@ "node_modules/react-base16-styling": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "dependencies": { "base16": "^1.0.0", "lodash.curry": "^4.0.1", @@ -11736,15 +12475,15 @@ } }, "node_modules/react-copy-to-clipboard": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz", - "integrity": "sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", "dependencies": { - "copy-to-clipboard": "^3", - "prop-types": "^15.5.8" + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" }, "peerDependencies": { - "react": "^15.3.0 || ^16.0.0 || ^17.0.0" + "react": "^15.3.0 || 16 || 17 || 18" } }, "node_modules/react-dev-utils": { @@ -11781,21 +12520,6 @@ "node": ">=14" } }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dev-utils/node_modules/loader-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", @@ -11804,48 +12528,6 @@ "node": ">= 12.13.0" } }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -11918,6 +12600,9 @@ "dependencies": { "@types/react": "*", "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" } }, "node_modules/react-loadable-ssr-addon-v5-slorber": { @@ -11936,15 +12621,14 @@ } }, "node_modules/react-router": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", - "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -11968,15 +12652,15 @@ } }, "node_modules/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.3.3", + "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" }, @@ -12044,7 +12728,7 @@ "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dependencies": { "resolve": "^1.1.6" }, @@ -12053,14 +12737,14 @@ } }, "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dependencies": { - "minimatch": "3.0.4" + "minimatch": "^3.0.5" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/regenerate": { @@ -12069,9 +12753,9 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dependencies": { "regenerate": "^1.4.2" }, @@ -12080,9 +12764,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -12122,14 +12806,14 @@ } }, "node_modules/regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" }, @@ -12138,11 +12822,11 @@ } }, "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "dependencies": { - "rc": "^1.2.8" + "rc": "1.2.8" }, "engines": { "node": ">=6.0.0" @@ -12160,14 +12844,14 @@ } }, "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" }, "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dependencies": { "jsesc": "~0.5.0" }, @@ -12178,95 +12862,19 @@ "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "bin": { "jsesc": "bin/jsesc" } }, - "node_modules/rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", - "dependencies": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", - "dependencies": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", - "dependencies": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "engines": { "node": ">= 0.10" } }, - "node_modules/remark-admonitions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", - "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", - "dependencies": { - "rehype-parse": "^6.0.2", - "unified": "^8.4.2", - "unist-util-visit": "^2.0.1" - } - }, - "node_modules/remark-admonitions/node_modules/unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-emoji": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", @@ -12335,6 +12943,35 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/remark-mdx/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -12343,6 +12980,59 @@ "semver": "bin/semver" } }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", @@ -12383,25 +13073,65 @@ } }, "node_modules/remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", + "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", "dev": true, "dependencies": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-stringify/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remark-stringify/node_modules/trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-stringify/node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" }, "funding": { "type": "opencollective", @@ -12420,6 +13150,69 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -12441,7 +13234,7 @@ "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "engines": { "node": ">=0.10" } @@ -12457,7 +13250,7 @@ "node_modules/require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", "engines": { "node": "*" } @@ -12465,15 +13258,19 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12495,7 +13292,7 @@ "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dependencies": { "lowercase-keys": "^1.0.0" } @@ -12550,63 +13347,6 @@ "rtlcss": "bin/rtlcss.js" } }, - "node_modules/rtlcss/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12630,17 +13370,57 @@ } }, "node_modules/rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "dependencies": { "tslib": "^2.1.0" } }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -12662,16 +13442,16 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", @@ -12693,12 +13473,12 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "dependencies": { "node-forge": "^1" }, @@ -12707,9 +13487,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12811,23 +13591,15 @@ "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dependencies": { - "mime-db": "~1.33.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.6" + "node": "*" } }, "node_modules/serve-handler/node_modules/path-to-regexp": { @@ -12838,7 +13610,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -12900,7 +13672,7 @@ "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "engines": { "node": ">= 0.6" } @@ -12922,7 +13694,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -12965,9 +13737,12 @@ } }, "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/shelljs": { "version": "0.8.5", @@ -13039,6 +13814,11 @@ "npm": ">=5.6.0" } }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -13047,23 +13827,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "devOptional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -13075,22 +13838,17 @@ } }, "node_modules/sort-css-media-queries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", - "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", "engines": { "node": ">= 6.3.0" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } @@ -13104,22 +13862,14 @@ } }, "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/space-separated-tokens": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", @@ -13160,12 +13910,13 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, "node_modules/state-toggle": { "version": "1.0.3", @@ -13185,9 +13936,9 @@ } }, "node_modules/std-env": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", - "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.0.tgz", + "integrity": "sha512-cNNS+VYsXIs5gI6gJipO4qZ8YYT274JHvNnQ1/R/x8Q8mdP0qj0zoMchRXmBNPqp/0eOEhX+3g7g6Fgb7meLIQ==" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -13197,25 +13948,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/string-replace-loader": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-replace-loader/-/string-replace-loader-3.1.0.tgz", @@ -13229,23 +13961,64 @@ "webpack": "^5" } }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "node_modules/string-replace-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, "node_modules/string.prototype.matchall": { "version": "4.0.7", @@ -13266,18 +14039,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.matchall/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trimend": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", @@ -13292,22 +14053,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trimstart": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", @@ -13322,32 +14067,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart/node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "node_modules/stringify-entities/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, - "dependencies": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13380,7 +14118,7 @@ "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", "engines": { "node": ">=0.10.0" } @@ -13428,22 +14166,25 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/svg-parser": { @@ -13479,57 +14220,84 @@ "node": ">= 10" } }, - "node_modules/synckit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.4.1.tgz", - "integrity": "sha512-ngUh0+s+DOqEc0sGnrLaeNjbXp0CWHjSGFBqPlQmQ+oN/OfoDoYDBXPh+b4qs1M5QTk5nuQ3AmVz9+2xiY/ldw==", - "dev": true, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { - "tslib": "^2.3.1", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "devOptional": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "devOptional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "devOptional": true + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/synckit": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", + "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, "node_modules/tapable": { "version": "2.2.1", @@ -13540,9 +14308,9 @@ } }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -13557,15 +14325,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" }, "engines": { "node": ">= 10.13.0" @@ -13589,6 +14357,50 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -13597,7 +14409,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/thenify": { "version": "3.3.1", @@ -13611,7 +14423,7 @@ "node_modules/thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" @@ -13635,10 +14447,20 @@ "next-tick": "1" } }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "node_modules/tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "node_modules/tiny-warning": { "version": "1.0.3", @@ -13648,7 +14470,7 @@ "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } @@ -13675,7 +14497,7 @@ "node_modules/toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "node_modules/toidentifier": { "version": "1.0.1", @@ -13696,12 +14518,12 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, "node_modules/trim-trailing-lines": { "version": "1.1.4", @@ -13745,11 +14567,11 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13767,6 +14589,25 @@ "node": ">= 0.6" } }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -13776,9 +14617,9 @@ } }, "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13788,9 +14629,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", "funding": [ { "type": "opencollective", @@ -13820,18 +14661,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbox-primitive/node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unherit": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", @@ -13874,17 +14703,17 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "engines": { "node": ">=4" } }, "node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "dependencies": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -13898,6 +14727,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unified/node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -13945,6 +14802,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position-from-estree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz", + "integrity": "sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-remove": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", @@ -14019,11 +14889,36 @@ "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", @@ -14083,6 +14978,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/update-notifier/node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -14111,9 +15035,9 @@ } }, "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } @@ -14152,10 +15076,46 @@ } } }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dependencies": { "prepend-http": "^2.0.0" }, @@ -14203,12 +15163,12 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utility-types": { "version": "3.10.0", @@ -14221,7 +15181,7 @@ "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } @@ -14234,11 +15194,32 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "devOptional": true + "node_modules/uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uvu/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/value-equal": { "version": "1.0.1", @@ -14248,20 +15229,21 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.5.tgz", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", + "dev": true, "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" }, "funding": { "type": "opencollective", @@ -14278,12 +15260,39 @@ } }, "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, "dependencies": { "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0" }, "funding": { "type": "opencollective", @@ -14309,9 +15318,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14345,23 +15354,23 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -14374,7 +15383,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -14394,9 +15403,9 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "dependencies": { "acorn": "^8.0.4", "acorn-walk": "^8.0.0", @@ -14476,6 +15485,25 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack-dev-middleware/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -14503,14 +15531,15 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", @@ -14518,7 +15547,7 @@ "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", @@ -14529,7 +15558,7 @@ "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -14542,6 +15571,10 @@ "engines": { "node": ">= 12.13.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "peerDependencies": { "webpack": "^4.37.0 || ^5.0.0" }, @@ -14601,9 +15634,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "engines": { "node": ">=10.0.0" }, @@ -14645,16 +15678,60 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpackbar": { @@ -14698,7 +15775,7 @@ "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -14748,47 +15825,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -14831,9 +15867,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { "node": ">=12" }, @@ -14841,22 +15877,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", @@ -14874,7 +15894,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -14888,9 +15908,9 @@ } }, "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -14970,87 +15990,95 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz", - "integrity": "sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", + "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", "requires": { - "@algolia/autocomplete-shared": "1.6.3" + "@algolia/autocomplete-shared": "1.7.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", + "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "requires": { + "@algolia/autocomplete-shared": "1.7.2" } }, "@algolia/autocomplete-shared": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz", - "integrity": "sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg==" + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", + "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" }, "@algolia/cache-browser-local-storage": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz", - "integrity": "sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", + "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", "requires": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "@algolia/cache-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.13.1.tgz", - "integrity": "sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", + "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" }, "@algolia/cache-in-memory": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz", - "integrity": "sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", + "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", "requires": { - "@algolia/cache-common": "4.13.1" + "@algolia/cache-common": "4.14.2" } }, "@algolia/client-account": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.13.1.tgz", - "integrity": "sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", + "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-analytics": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.13.1.tgz", - "integrity": "sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", + "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.13.1.tgz", - "integrity": "sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", + "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", "requires": { - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-personalization": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.13.1.tgz", - "integrity": "sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", + "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/client-search": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.13.1.tgz", - "integrity": "sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", + "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", "requires": { - "@algolia/client-common": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "@algolia/events": { @@ -15059,117 +16087,98 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.13.1.tgz", - "integrity": "sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", + "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" }, "@algolia/logger-console": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.13.1.tgz", - "integrity": "sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", + "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", "requires": { - "@algolia/logger-common": "4.13.1" + "@algolia/logger-common": "4.14.2" } }, "@algolia/requester-browser-xhr": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz", - "integrity": "sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", + "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", "requires": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "@algolia/requester-common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.13.1.tgz", - "integrity": "sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", + "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" }, "@algolia/requester-node-http": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz", - "integrity": "sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", + "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", "requires": { - "@algolia/requester-common": "4.13.1" + "@algolia/requester-common": "4.14.2" } }, "@algolia/transporter": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.13.1.tgz", - "integrity": "sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", + "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", "requires": { - "@algolia/cache-common": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/requester-common": "4.13.1" + "@algolia/cache-common": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/requester-common": "4.14.2" } }, "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "requires": { - "@jridgewell/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@apidevtools/json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "dev": true, "requires": { "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } + "js-yaml": "^4.1.0" } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==" }, "@babel/core": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", - "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "requires": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helpers": "^7.18.2", - "@babel/parser": "^7.18.0", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -15185,40 +16194,52 @@ } }, "@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "requires": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.19.4", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", - "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-compilation-targets": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", - "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", + "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.20.2", + "@babel/compat-data": "^7.19.3", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", "semver": "^6.3.0" }, "dependencies": { @@ -15230,48 +16251,41 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", - "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", - "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "regexpu-core": "^5.0.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", "semver": "^6.1.2" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -15280,162 +16294,168 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", - "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-explode-assignable-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", - "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", - "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.9" } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", - "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.0", - "@babel/types": "^7.18.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" } }, "@babel/helper-optimise-call-expression": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", - "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", - "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-wrap-function": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-replace-supers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", - "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", "requires": { - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-member-expression-to-functions": "^7.17.7", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" } }, "@babel/helper-simple-access": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", - "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "requires": { - "@babel/types": "^7.18.2" + "@babel/types": "^7.19.4" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", - "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.9" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" }, "@babel/helper-wrap-function": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", - "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", "requires": { - "@babel/helper-function-name": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.8", - "@babel/types": "^7.16.8" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" } }, "@babel/helpers": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", - "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.18.2", - "@babel/types": "^7.18.2" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" } }, "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -15469,289 +16489,193 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==" + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz", - "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", - "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", - "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", - "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", - "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", - "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", - "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", - "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", - "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", - "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", - "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", + "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", - "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", - "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", - "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", - "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-create-class-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", - "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-async-generators": { @@ -15768,13 +16692,6 @@ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-syntax-class-static-block": { @@ -15783,13 +16700,6 @@ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-syntax-dynamic-import": { @@ -15809,18 +16719,11 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", - "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-json-strings": { @@ -15832,11 +16735,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -15893,13 +16796,6 @@ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-syntax-top-level-await": { @@ -15908,530 +16804,298 @@ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } } }, "@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", - "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", - "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-remap-async-to-generator": "^7.16.8" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", - "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz", - "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", + "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-classes": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz", - "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-optimise-call-expression": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-replace-supers": "^7.18.2", - "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", - "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", - "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", + "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", - "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", - "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", - "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { - "version": "7.18.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", - "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", - "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "requires": { - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-literals": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", - "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", - "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", - "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", - "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-simple-access": "^7.18.2", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz", - "integrity": "sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", "requires": { - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-identifier": "^7.16.7", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", - "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "requires": { - "@babel/helper-module-transforms": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", - "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.17.12", - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", - "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", - "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7", - "@babel/helper-replace-supers": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", - "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", - "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz", - "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==", + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", - "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz", - "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-jsx": "^7.17.12", - "@babel/types": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - }, - "@babel/plugin-syntax-jsx": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz", - "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==", - "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - } - } + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", - "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.16.7" + "@babel/plugin-transform-react-jsx": "^7.18.6" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", - "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", - "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } } }, "@babel/plugin-transform-reserved-words": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", - "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-runtime": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", - "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-plugin-utils": "^7.17.12", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", "semver": "^6.3.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -16440,161 +17104,105 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", - "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", - "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", - "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", - "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", - "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typescript": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz", - "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", + "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.0", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-typescript": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", - "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", - "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.7", - "@babel/helper-plugin-utils": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" - } + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/preset-env": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", - "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", + "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.18.2", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-async-generator-functions": "^7.17.12", - "@babel/plugin-proposal-class-properties": "^7.17.12", - "@babel/plugin-proposal-class-static-block": "^7.18.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.17.12", - "@babel/plugin-proposal-json-strings": "^7.17.12", - "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-object-rest-spread": "^7.18.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.17.12", - "@babel/plugin-proposal-private-methods": "^7.17.12", - "@babel/plugin-proposal-private-property-in-object": "^7.17.12", - "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/compat-data": "^7.19.4", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-import-assertions": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -16604,64 +17212,47 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.17.12", - "@babel/plugin-transform-async-to-generator": "^7.17.12", - "@babel/plugin-transform-block-scoped-functions": "^7.16.7", - "@babel/plugin-transform-block-scoping": "^7.17.12", - "@babel/plugin-transform-classes": "^7.17.12", - "@babel/plugin-transform-computed-properties": "^7.17.12", - "@babel/plugin-transform-destructuring": "^7.18.0", - "@babel/plugin-transform-dotall-regex": "^7.16.7", - "@babel/plugin-transform-duplicate-keys": "^7.17.12", - "@babel/plugin-transform-exponentiation-operator": "^7.16.7", - "@babel/plugin-transform-for-of": "^7.18.1", - "@babel/plugin-transform-function-name": "^7.16.7", - "@babel/plugin-transform-literals": "^7.17.12", - "@babel/plugin-transform-member-expression-literals": "^7.16.7", - "@babel/plugin-transform-modules-amd": "^7.18.0", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-modules-systemjs": "^7.18.0", - "@babel/plugin-transform-modules-umd": "^7.18.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", - "@babel/plugin-transform-new-target": "^7.17.12", - "@babel/plugin-transform-object-super": "^7.16.7", - "@babel/plugin-transform-parameters": "^7.17.12", - "@babel/plugin-transform-property-literals": "^7.16.7", - "@babel/plugin-transform-regenerator": "^7.18.0", - "@babel/plugin-transform-reserved-words": "^7.17.12", - "@babel/plugin-transform-shorthand-properties": "^7.16.7", - "@babel/plugin-transform-spread": "^7.17.12", - "@babel/plugin-transform-sticky-regex": "^7.16.7", - "@babel/plugin-transform-template-literals": "^7.18.2", - "@babel/plugin-transform-typeof-symbol": "^7.17.12", - "@babel/plugin-transform-unicode-escapes": "^7.16.7", - "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.19.4", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.2", - "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.5.0", - "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.22.1", + "@babel/types": "^7.19.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", "semver": "^6.3.0" }, "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", - "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", - "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.17.12" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -16682,92 +17273,79 @@ } }, "@babel/preset-react": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz", - "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-react-display-name": "^7.16.7", - "@babel/plugin-transform-react-jsx": "^7.17.12", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@babel/plugin-transform-react-pure-annotations": "^7.16.7" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" } }, "@babel/preset-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz", - "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", "requires": { - "@babel/helper-plugin-utils": "^7.17.12", - "@babel/helper-validator-option": "^7.16.7", - "@babel/plugin-transform-typescript": "^7.17.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==" - } + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" } }, "@babel/runtime": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", - "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", + "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/runtime-corejs3": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz", - "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", + "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", "requires": { - "core-js-pure": "^3.20.2", + "core-js-pure": "^3.25.1", "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", - "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.18.2", - "@babel/helper-environment-visitor": "^7.18.2", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.18.0", - "@babel/types": "^7.18.2", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz", - "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -16778,43 +17356,44 @@ "optional": true }, "@docsearch/css": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.1.0.tgz", - "integrity": "sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", + "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" }, "@docsearch/react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.1.0.tgz", - "integrity": "sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", + "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", "requires": { - "@algolia/autocomplete-core": "1.6.3", - "@docsearch/css": "3.1.0", + "@algolia/autocomplete-core": "1.7.2", + "@algolia/autocomplete-preset-algolia": "1.7.2", + "@docsearch/css": "3.3.0", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-beta.21.tgz", - "integrity": "sha512-qysDMVp1M5UozK3u/qOxsEZsHF7jeBvJDS+5ItMPYmNKvMbNKeYZGA0g6S7F9hRDwjIlEbvo7BaX0UMDcmTAWA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", "requires": { - "@babel/core": "^7.18.2", - "@babel/generator": "^7.18.2", + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.2", - "@babel/preset-env": "^7.18.2", - "@babel/preset-react": "^7.17.12", - "@babel/preset-typescript": "^7.17.12", - "@babel/runtime": "^7.18.3", - "@babel/runtime-corejs3": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/cssnano-preset": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "@slorber/static-site-generator-webpack-plugin": "^4.0.4", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", "babel-loader": "^8.2.5", @@ -16827,10 +17406,10 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.22.7", + "core-js": "^3.23.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.9", + "cssnano": "^5.1.12", "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", @@ -16843,7 +17422,7 @@ "import-fresh": "^3.3.0", "leven": "^3.1.0", "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.0", + "mini-css-extract-plugin": "^2.6.1", "postcss": "^8.4.14", "postcss-loader": "^7.0.0", "prompts": "^2.4.2", @@ -16854,62 +17433,51 @@ "react-router": "^5.3.3", "react-router-config": "^5.1.1", "react-router-dom": "^5.3.3", - "remark-admonitions": "^1.2.1", "rtl-detect": "^1.0.4", "semver": "^7.3.7", "serve-handler": "^6.1.3", "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.1", + "terser-webpack-plugin": "^5.3.3", "tslib": "^2.4.0", "update-notifier": "^5.1.0", "url-loader": "^4.1.1", "wait-on": "^6.0.1", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.0", + "webpack-dev-server": "^4.9.3", "webpack-merge": "^5.8.0", "webpackbar": "^5.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "@docusaurus/cssnano-preset": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.21.tgz", - "integrity": "sha512-fhTZrg1vc6zYYZIIMXpe1TnEVGEjqscBo0s1uomSwKjjtMgu7wkzc1KKJYY7BndsSA+fVVkZ+OmL/kAsmK7xxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", "requires": { - "cssnano-preset-advanced": "^5.3.5", + "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", "postcss-sort-media-queries": "^4.2.1", "tslib": "^2.4.0" } }, "@docusaurus/logger": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.0.0-beta.21.tgz", - "integrity": "sha512-HTFp8FsSMrAj7Uxl5p72U+P7rjYU/LRRBazEoJbs9RaqoKEdtZuhv8MYPOCh46K9TekaoquRYqag2o23Qt4ggA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", "requires": { "chalk": "^4.1.2", "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.21.tgz", - "integrity": "sha512-AI+4obJnpOaBOAYV6df2ux5Y1YJCBS+MhXFf0yhED12sVLJi2vffZgdamYd/d/FwvWDw6QLs/VD2jebd7P50yQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", "requires": { - "@babel/parser": "^7.18.3", - "@babel/traverse": "^7.18.2", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -16919,214 +17487,156 @@ "remark-emoji": "^2.2.0", "stringify-object": "^3.3.0", "tslib": "^2.4.0", + "unified": "^9.2.2", "unist-util-visit": "^2.0.3", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/module-type-aliases": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.21.tgz", - "integrity": "sha512-gRkWICgQZiqSJgrwRKWjXm5gAB+9IcfYdUbCG0PRPP/G8sNs9zBIOY4uT4Z5ox2CWFEm44U3RTTxj7BiLVMBXw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", "requires": { - "@docusaurus/types": "2.0.0-beta.21", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.1.0", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", "@types/react-router-dom": "*", - "react-helmet-async": "*" + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" } }, "@docusaurus/plugin-content-blog": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.21.tgz", - "integrity": "sha512-IP21yJViP3oBmgsWBU5LhrG1MZXV4mYCQSoCAboimESmy1Z11RCNP2tXaqizE3iTmXOwZZL+SNBk06ajKCEzWg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", - "cheerio": "^1.0.0-rc.11", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "reading-time": "^1.5.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "unist-util-visit": "^2.0.3", "utility-types": "^3.10.0", - "webpack": "^5.72.1" - }, - "dependencies": { - "cheerio": { - "version": "1.0.0-rc.11", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", - "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==", - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0", - "tslib": "^2.4.0" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" - }, - "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "requires": { - "entities": "^4.3.0" - } - } + "webpack": "^5.73.0" } }, "@docusaurus/plugin-content-docs": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.21.tgz", - "integrity": "sha512-aa4vrzJy4xRy81wNskyhE3wzRf3AgcESZ1nfKh8xgHUkT7fDTZ1UWlg50Jb3LBCQFFyQG2XQB9N6llskI/KUnw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "lodash": "^4.17.21", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/plugin-content-pages": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.21.tgz", - "integrity": "sha512-DmXOXjqNI+7X5hISzCvt54QIK6XBugu2MOxjxzuqI7q92Lk/EVdraEj5mthlH8IaEH/VlpWYJ1O9TzLqX5vH2g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/mdx-loader": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", - "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.21.tgz", - "integrity": "sha512-P54J4q4ecsyWW0Jy4zbimSIHna999AfbxpXGmF1IjyHrjoA3PtuakV1Ai51XrGEAaIq9q6qMQkEhbUd3CffGAw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.21.tgz", - "integrity": "sha512-+5MS0PeGaJRgPuNZlbd/WMdQSpOACaxEz7A81HAxm6kE+tIASTW3l8jgj1eWFy/PGPzaLnQrEjxI1McAfnYmQw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.21.tgz", - "integrity": "sha512-4zxKZOnf0rfh6myXLG7a6YZfQcxYDMBsWqANEjCX77H5gPdK+GHZuDrxK6sjFvRBv4liYCrNjo7HJ4DpPoT0zA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.21.tgz", - "integrity": "sha512-/ynWbcXZXcYZ6sT2X6vAJbnfqcPxwdGEybd0rcRZi4gBHq6adMofYI25AqELmnbBDxt0If+vlAeUHFRG5ueP7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-KvBnIUu7y69pNTJ9UhX6SdNlK6prR//J3L4rhN897tb8xx04xHHILlPXko2Il+C3Xzgh3OCgyvkoz9K6YlFTDw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/plugin-debug": "2.0.0-beta.21", - "@docusaurus/plugin-google-analytics": "2.0.0-beta.21", - "@docusaurus/plugin-google-gtag": "2.0.0-beta.21", - "@docusaurus/plugin-sitemap": "2.0.0-beta.21", - "@docusaurus/theme-classic": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-search-algolia": "2.0.0-beta.21" + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" } }, "@docusaurus/react-loadable": { @@ -17139,65 +17649,74 @@ } }, "@docusaurus/theme-classic": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.21.tgz", - "integrity": "sha512-Ge0WNdTefD0VDQfaIMRRWa8tWMG9+8/OlBRd5MK88/TZfqdBq7b/gnCSaalQlvZwwkj6notkKhHx72+MKwWUJA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", "requires": { - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-common": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "@mdx-js/react": "^1.6.22", - "clsx": "^1.1.1", + "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.39", + "infima": "0.2.0-alpha.42", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "prismjs": "^1.28.0", "react-router-dom": "^5.3.3", "rtlcss": "^3.5.0", - "tslib": "^2.4.0" + "tslib": "^2.4.0", + "utility-types": "^3.10.0" } }, "@docusaurus/theme-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-beta.21.tgz", - "integrity": "sha512-fTKoTLRfjuFG6c3iwnVjIIOensxWMgdBKLfyE5iih3Lq7tQgkE7NyTGG9BKLrnTJ7cAD2UXdXM9xbB7tBf1qzg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", "requires": { - "@docusaurus/module-type-aliases": "2.0.0-beta.21", - "@docusaurus/plugin-content-blog": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/plugin-content-pages": "2.0.0-beta.21", - "clsx": "^1.1.1", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.3", + "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", "utility-types": "^3.10.0" } }, "@docusaurus/theme-search-algolia": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.21.tgz", - "integrity": "sha512-T1jKT8MVSSfnztSqeebUOpWHPoHKtwDXtKYE0xC99JWoZ+mMfv8AFhVSoSddn54jLJjV36mxg841eHQIySMCpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", "requires": { - "@docsearch/react": "^3.1.0", - "@docusaurus/core": "2.0.0-beta.21", - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/plugin-content-docs": "2.0.0-beta.21", - "@docusaurus/theme-common": "2.0.0-beta.21", - "@docusaurus/theme-translations": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", - "@docusaurus/utils-validation": "2.0.0-beta.21", + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.8.2", - "clsx": "^1.1.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", "eta": "^1.12.3", "fs-extra": "^10.1.0", "lodash": "^4.17.21", @@ -17206,34 +17725,35 @@ } }, "@docusaurus/theme-translations": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.21.tgz", - "integrity": "sha512-dLVT9OIIBs6MpzMb1bAy+C0DPJK3e3DNctG+ES0EP45gzEqQxzs4IsghpT+QDaOsuhNnAlosgJpFWX3rqxF9xA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", "requires": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-beta.21.tgz", - "integrity": "sha512-/GH6Npmq81eQfMC/ikS00QSv9jNyO1RXEpNSx5GLA3sFX8Iib26g2YI2zqNplM8nyxzZ2jVBuvUoeODTIbTchQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", "commander": "^5.1.0", - "history": "^4.9.0", "joi": "^17.6.0", "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.72.1", + "webpack": "^5.73.0", "webpack-merge": "^5.8.0" } }, "@docusaurus/utils": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-beta.21.tgz", - "integrity": "sha512-M/BrVCDmmUPZLxtiStBgzpQ4I5hqkggcpnQmEN+LbvbohjbtVnnnZQ0vptIziv1w8jry/woY+ePsyOO7O/yeLQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", "requires": { - "@docusaurus/logger": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", "@svgr/webpack": "^6.2.1", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", @@ -17247,121 +17767,96 @@ "shelljs": "^0.8.5", "tslib": "^2.4.0", "url-loader": "^4.1.1", - "webpack": "^5.72.1" + "webpack": "^5.73.0" } }, "@docusaurus/utils-common": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.0.0-beta.21.tgz", - "integrity": "sha512-5w+6KQuJb6pUR2M8xyVuTMvO5NFQm/p8TOTDFTx60wt3p0P1rRX00v6FYsD4PK6pgmuoKjt2+Ls8dtSXc4qFpQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.21.tgz", - "integrity": "sha512-6NG1FHTRjv1MFzqW//292z7uCs77vntpWEbZBHk3n67aB1HoMn5SOwjLPtRDjbCgn6HCHFmdiJr6euCbjhYolg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", "requires": { - "@docusaurus/logger": "2.0.0-beta.21", - "@docusaurus/utils": "2.0.0-beta.21", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" } }, "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "devOptional": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "requires": { "type-fest": "^0.20.2" } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "devOptional": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true } } }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz", - "integrity": "sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==" + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.35.tgz", - "integrity": "sha512-uLEXifXIL7hnh2sNZQrIJWNol7cTVIzwI+4qcBIq9QWaZqUblm0IDrtSqbNg+3SQf8SMGHkiSigD++rHmCHjBg==", + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.3.tgz", - "integrity": "sha512-XPeeu1IlGYqz4VWGRAT5ukNMd4VHUEEJ7ysZ7pSSgaEtNvSo+FLurybGJVmiqkQdK50OkSja2bfZXOeyMGRD8Q==", + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.35" + "@fortawesome/fontawesome-common-types": "^0.2.36" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.18", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.18.tgz", - "integrity": "sha512-RwLIB4TZw0M9gvy5u+TusAA0afbwM4JQIimNH/j3ygd6aIvYPQLqXMhC9ErY26J23rDPyDZldIfPq/HpTTJ/tQ==", + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", + "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", "requires": { "prop-types": "^15.8.1" - }, - "dependencies": { - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - } } }, "@hapi/hoek": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", - "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "@hapi/topo": { "version": "5.1.0", @@ -17372,41 +17867,67 @@ } }, "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "devOptional": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "devOptional": true }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "devOptional": true + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.2.1.tgz", + "integrity": "sha512-O/QNDQODLnINEPAI0cl9U6zUIDXEWXt6IC1o2N2QENuos7hlGUIthlKyV4p6ki3TvXFX071blj8HUhgLGquPjw==", + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "requires": { "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { "version": "0.3.2", @@ -17415,20 +17936,32 @@ "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@jsdevtools/ono": { @@ -17491,10 +18024,56 @@ "source-map": "^0.5.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } } } }, @@ -17532,6 +18111,20 @@ "fastq": "^1.6.0" } }, + "@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + } + }, "@polka/url": { "version": "1.0.0-next.21", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", @@ -17555,161 +18148,144 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz", - "integrity": "sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", "requires": { - "bluebird": "^3.7.1", - "cheerio": "^0.22.0", "eval": "^0.1.8", - "webpack-sources": "^1.4.3" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" } }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg==", "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", - "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", - "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", - "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz", + "integrity": "sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA==", "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", - "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz", + "integrity": "sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw==", "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", - "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz", + "integrity": "sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg==", "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", - "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz", + "integrity": "sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw==", "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", - "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz", + "integrity": "sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig==", "requires": {} }, "@svgr/babel-preset": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", - "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.0.tgz", + "integrity": "sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg==", "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", - "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.5.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.5.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.0", + "@svgr/babel-plugin-transform-svg-component": "^6.5.0" } }, "@svgr/core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", - "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.0.tgz", + "integrity": "sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w==", "requires": { - "@svgr/plugin-jsx": "^6.2.1", + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.1" } }, "@svgr/hast-util-to-babel-ast": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", - "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz", + "integrity": "sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA==", "requires": { - "@babel/types": "^7.15.6", - "entities": "^3.0.1" - }, - "dependencies": { - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" - } + "@babel/types": "^7.18.4", + "entities": "^4.3.0" } }, "@svgr/plugin-jsx": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", - "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz", + "integrity": "sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw==", "requires": { - "@babel/core": "^7.15.5", - "@svgr/babel-preset": "^6.2.0", - "@svgr/hast-util-to-babel-ast": "^6.2.1", - "svg-parser": "^2.0.2" + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.5.0", + "@svgr/hast-util-to-babel-ast": "^6.5.0", + "svg-parser": "^2.0.4" } }, "@svgr/plugin-svgo": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", - "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz", + "integrity": "sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw==", "requires": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", - "svgo": "^2.5.0" + "svgo": "^2.8.0" } }, "@svgr/webpack": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", - "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.0.tgz", + "integrity": "sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ==", "requires": { - "@babel/core": "^7.15.5", - "@babel/plugin-transform-react-constant-elements": "^7.14.5", - "@babel/preset-env": "^7.15.6", - "@babel/preset-react": "^7.14.5", - "@babel/preset-typescript": "^7.15.0", - "@svgr/core": "^6.2.1", - "@svgr/plugin-jsx": "^6.2.1", - "@svgr/plugin-svgo": "^6.2.0" + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.5.0", + "@svgr/plugin-jsx": "^6.5.0", + "@svgr/plugin-svgo": "^6.5.0" } }, "@szmarczak/http-timer": { @@ -17726,11 +18302,20 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@tsconfig/docusaurus": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.5.tgz", - "integrity": "sha512-KM/TuJa9fugo67dTGx+ktIqf3fVc077J6jwHu845Hex4EQf7LABlNonP/mohDKT0cmncdtlYVHHF74xR/YpThg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", + "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", "dev": true }, + "@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -17765,33 +18350,51 @@ "@types/node": "*" } }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "version": "8.4.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", + "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", "requires": { "@types/estree": "*", "@types/json-schema": "*" } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "requires": { "@types/eslint": "*", "@types/estree": "*" } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + }, + "@types/estree-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", + "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } }, "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -17800,9 +18403,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "requires": { "@types/node": "*", "@types/qs": "*", @@ -17810,9 +18413,9 @@ } }, "@types/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", + "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -17828,9 +18431,9 @@ } }, "@types/history": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.8.tgz", - "integrity": "sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA==" + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "@types/html-minifier-terser": { "version": "6.1.0", @@ -17845,6 +18448,27 @@ "@types/node": "*" } }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, "@types/js-yaml": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", @@ -17852,39 +18476,45 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==", "dev": true }, "@types/mdast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz", - "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", "requires": { "@types/unist": "*" } }, "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", "dev": true }, "@types/node": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", - "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==" + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==" }, "@types/parse-json": { "version": "4.0.0", @@ -17897,15 +18527,15 @@ "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" }, "@types/prettier": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", - "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, "@types/prop-types": { - "version": "15.7.3", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/qs": { "version": "6.9.7", @@ -17918,9 +18548,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", - "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "version": "17.0.51", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", + "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -17937,11 +18567,11 @@ } }, "@types/react-router": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.13.tgz", - "integrity": "sha512-ZIuaO9Yrln54X6elg8q2Ivp6iK6p4syPsefEYAhRDAoqNh48C8VYUmB9RkXjKSQAJSJV0mbIFCX7I4vZDcHrjg==", + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", "requires": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*" } }, @@ -17953,21 +18583,14 @@ "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" - }, - "dependencies": { - "@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - } } }, "@types/react-router-dom": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.7.tgz", - "integrity": "sha512-D5mHD6TbdV/DNHYsnwBTv+y73ei+mMjrkGrla86HthE4/PVvL1J94Bu3qABU+COXzpL23T1EZapVVpwHuBXiUg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", "requires": { - "@types/history": "*", + "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router": "*" } @@ -17986,9 +18609,9 @@ } }, "@types/scheduler": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", - "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==" + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/serve-index": { "version": "1.9.1", @@ -17999,11 +18622,11 @@ } }, "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "requires": { - "@types/mime": "^1", + "@types/mime": "*", "@types/node": "*" } }, @@ -18016,9 +18639,9 @@ } }, "@types/unist": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", - "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" }, "@types/ws": { "version": "8.5.3", @@ -18028,6 +18651,19 @@ "@types/node": "*" } }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -18176,12 +18812,27 @@ "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } } }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-import-assertions": { "version": "1.8.0", @@ -18202,9 +18853,9 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==" }, "aggregate-error": { "version": "3.1.0", @@ -18259,30 +18910,30 @@ "requires": {} }, "algoliasearch": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.13.1.tgz", - "integrity": "sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA==", + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", + "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", "requires": { - "@algolia/cache-browser-local-storage": "4.13.1", - "@algolia/cache-common": "4.13.1", - "@algolia/cache-in-memory": "4.13.1", - "@algolia/client-account": "4.13.1", - "@algolia/client-analytics": "4.13.1", - "@algolia/client-common": "4.13.1", - "@algolia/client-personalization": "4.13.1", - "@algolia/client-search": "4.13.1", - "@algolia/logger-common": "4.13.1", - "@algolia/logger-console": "4.13.1", - "@algolia/requester-browser-xhr": "4.13.1", - "@algolia/requester-common": "4.13.1", - "@algolia/requester-node-http": "4.13.1", - "@algolia/transporter": "4.13.1" + "@algolia/cache-browser-local-storage": "4.14.2", + "@algolia/cache-common": "4.14.2", + "@algolia/cache-in-memory": "4.14.2", + "@algolia/client-account": "4.14.2", + "@algolia/client-analytics": "4.14.2", + "@algolia/client-common": "4.14.2", + "@algolia/client-personalization": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/logger-console": "4.14.2", + "@algolia/requester-browser-xhr": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/requester-node-http": "4.14.2", + "@algolia/transporter": "4.14.2" } }, "algoliasearch-helper": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz", - "integrity": "sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", "requires": { "@algolia/events": "^4.0.1" } @@ -18293,14 +18944,25 @@ "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { "string-width": "^4.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "devOptional": true - }, "ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -18322,7 +18984,7 @@ "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true }, "anymatch": { @@ -18335,9 +18997,9 @@ } }, "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "2.0.1", @@ -18360,18 +19022,6 @@ "es-abstract": "^1.19.5", "get-intrinsic": "^1.1.1", "is-string": "^1.0.7" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "array-union": { @@ -18396,24 +19046,18 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "devOptional": true - }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "requires": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -18437,18 +19081,6 @@ "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" - }, - "dependencies": { - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - } } }, "babel-plugin-apply-mdx-type-prop": { @@ -18458,6 +19090,13 @@ "requires": { "@babel/helper-plugin-utils": "7.10.4", "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "babel-plugin-dynamic-import-node": { @@ -18474,15 +19113,22 @@ "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", "requires": { "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", "semver": "^6.1.1" }, "dependencies": { @@ -18494,20 +19140,20 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", - "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1" + "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "bail": { @@ -18540,15 +19186,10 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -18558,7 +19199,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.10.3", + "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -18585,20 +19226,20 @@ } }, "bonjour-service": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.12.tgz", - "integrity": "sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw==", + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", "requires": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.4" + "multicast-dns": "^7.2.5" } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "boxen": { "version": "6.2.1", @@ -18613,36 +19254,6 @@ "type-fest": "^2.5.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "type-fest": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.12.2.tgz", - "integrity": "sha512-qt6ylCGpLjZ7AaODxbpyBZSs9fCI9SkL3Z9q2oxMBQhs/uyY+VD8jHA8ULCGmWQJlBgqvO3EJeAngOHD8zQCrQ==" - } } }, "brace-expansion": { @@ -18663,26 +19274,25 @@ } }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, "cacheable-request": { "version": "6.1.0", @@ -18730,7 +19340,7 @@ "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", "dev": true }, "callsites": { @@ -18769,9 +19379,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001346", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz", - "integrity": "sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ==" + "version": "1.0.30001425", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", + "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==" }, "ccount": { "version": "1.1.0", @@ -18785,16 +19395,6 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } } }, "character-entities": { @@ -18803,9 +19403,9 @@ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" }, "character-entities-html4": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", - "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true }, "character-entities-legacy": { @@ -18819,80 +19419,17 @@ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" }, "cheerio": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", - "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - } + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" } }, "cheerio-select": { @@ -18906,53 +19443,6 @@ "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" - } } }, "chokidar": { @@ -18971,43 +19461,26 @@ } }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==" }, "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" }, "clean-css": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", - "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", "requires": { "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "clean-stack": { @@ -19021,34 +19494,42 @@ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" }, "cli-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz", - "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.3.tgz", + "integrity": "sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==", "dev": true, "requires": { - "ansi-regex": "^2.1.1", "d": "^1.0.1", - "es5-ext": "^0.10.51", + "es5-ext": "^0.10.61", "es6-iterator": "^2.0.3", - "memoizee": "^0.4.14", + "memoizee": "^0.4.15", "timers-ext": "^0.1.7" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } } }, "cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "requires": { "@colors/colors": "1.5.0", "string-width": "^4.2.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } } }, "clone-deep": { @@ -19062,17 +19543,17 @@ } }, "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "requires": { "mimic-response": "^1.0.0" } }, "clsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", - "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" }, "collapse-white-space": { "version": "1.0.6", @@ -19093,14 +19574,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==" + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "combine-promises": { "version": "1.1.0", @@ -19128,6 +19609,13 @@ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + } } }, "compression": { @@ -19156,13 +19644,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "configstore": { "version": "5.0.1", @@ -19178,9 +19671,9 @@ } }, "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" }, "consola": { "version": "2.15.3", @@ -19190,7 +19683,7 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" }, "content-type": { "version": "1.0.4", @@ -19198,12 +19691,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "cookie": { "version": "0.5.0", @@ -19221,9 +19711,9 @@ "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" }, "copy-to-clipboard": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", - "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.2.tgz", + "integrity": "sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==", "requires": { "toggle-selection": "^1.0.6" } @@ -19269,9 +19759,9 @@ } }, "globby": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", - "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -19280,11 +19770,6 @@ "slash": "^4.0.0" } }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -19309,30 +19794,22 @@ } }, "core-js": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", - "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==" + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", + "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==" }, "core-js-compat": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz", - "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", + "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", "requires": { - "browserslist": "^4.20.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" - } + "browserslist": "^4.21.4" } }, "core-js-pure": { - "version": "3.22.8", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz", - "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==" + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==" }, "core-util-is": { "version": "1.0.3", @@ -19375,9 +19852,9 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, "css-declaration-sorter": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", - "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", "requires": {} }, "css-loader": { @@ -19396,13 +19873,13 @@ } }, "css-minimizer-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", "requires": { "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" @@ -19442,23 +19919,18 @@ "ajv-formats": "^2.1.1", "ajv-keywords": "^5.0.0" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "requires": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, @@ -19469,13 +19941,6 @@ "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "css-what": { @@ -19489,22 +19954,22 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.10.tgz", - "integrity": "sha512-ACpnRgDg4m6CZD/+8SgnLcGCgy6DDGdkMbOawwdvVxNietTNLe/MtWcenp6qT0PRt5wzhGl6/cjMWCdhKXC9QA==", + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", "requires": { - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-advanced": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.6.tgz", - "integrity": "sha512-OZHsytu16eStRVrIY3wmPQqhJMaI0+O3raU4JHoKV3uuQYEeQek/FJVUIvYXD55hWR6OjCMyKYNRDw+k3/xgUw==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", + "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", "requires": { "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.10", + "cssnano-preset-default": "^5.2.12", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -19512,11 +19977,11 @@ } }, "cssnano-preset-default": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.10.tgz", - "integrity": "sha512-H8TJRhTjBKVOPltp9vr9El9I+IfYsOMhmXdK0LwdvwJcxYX9oWkY7ctacWusgPWAgQq1vt/WO8v+uqpfLnM7QA==", + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", "requires": { - "css-declaration-sorter": "^6.2.2", + "css-declaration-sorter": "^6.3.0", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", @@ -19525,7 +19990,7 @@ "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.5", + "postcss-merge-longhand": "^5.1.6", "postcss-merge-rules": "^5.1.2", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", @@ -19533,14 +19998,14 @@ "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.0", - "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.0", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.1", + "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.0", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", @@ -19562,9 +20027,9 @@ } }, "csstype": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz", - "integrity": "sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, "d": { "version": "1.0.1", @@ -19577,17 +20042,34 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, + "decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dev": true, + "requires": { + "character-entities": "^2.0.0" + }, + "dependencies": { + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true + } + } + }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "requires": { "mimic-response": "^1.0.0" } @@ -19598,9 +20080,9 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "devOptional": true }, "deepmerge": { @@ -19627,11 +20109,12 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "requires": { - "object-keys": "^1.0.12" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "del": { @@ -19654,6 +20137,12 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -19673,27 +20162,12 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-port": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", - "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "requires": { "address": "^1.0.1", - "debug": "^2.6.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "debug": "4" } }, "detect-port-alt": { @@ -19720,6 +20194,12 @@ } } }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -19734,9 +20214,9 @@ "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "dns-packet": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz", - "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", "requires": { "@leichtgewicht/ip-codec": "^2.0.1" } @@ -19759,13 +20239,13 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domelementtype": { @@ -19774,21 +20254,21 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" } }, "dot-case": { @@ -19821,9 +20301,9 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" }, "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, "eastasianwidth": { "version": "0.2.0", @@ -19836,9 +20316,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.144", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.144.tgz", - "integrity": "sha512-R3RV3rU1xWwFJlSClVWDvARaOk6VUO/FubHLodIASDB3Mc2dzuWvNdfOgH9bwHUTqT79u92qw60NWfwUdzAqdg==" + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" }, "emoji-regex": { "version": "9.2.2", @@ -19868,19 +20348,19 @@ "once": "^1.4.0" } }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "devOptional": true, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "requires": { - "ansi-colors": "^4.1.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" }, "error-ex": { "version": "1.3.2", @@ -19891,42 +20371,35 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "es-module-lexer": { @@ -19955,20 +20428,20 @@ } }, "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" } }, "es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, "requires": { "d": "1", @@ -20011,7 +20484,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "4.0.0", @@ -20019,89 +20492,75 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "devOptional": true, "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", + "@eslint/eslintrc": "^1.3.3", + "@humanwhocodes/config-array": "^0.11.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.15.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "devOptional": true, "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "devOptional": true, - "requires": { - "sprintf-js": "~1.0.2" + "is-glob": "^4.0.3" } }, "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "devOptional": true, "requires": { "type-fest": "^0.20.2" } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "devOptional": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true } } }, @@ -20113,61 +20572,315 @@ "requires": {} }, "eslint-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-1.17.0.tgz", - "integrity": "sha512-O8+JRfwCzpoR2P6zUI1GDAAM/bsuzcoBS1ArvpQrgQO/E2Km0vBmM15ukiJxZ+YUh5d+qDlrqha0fZB50MojJQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-mdx/-/eslint-mdx-2.0.5.tgz", + "integrity": "sha512-1ZzcJwJNfladtuK+uuG/MdC0idc1e3d1vCI2STOq/pLcJBGuao2biWh90vEh2M93zDiNoHJGUIU7UAxupiiHFw==", "dev": true, "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "cosmiconfig": "^7.0.1", - "remark-mdx": "^1.6.22", - "remark-parse": "^8.0.3", - "remark-stringify": "^8.1.1", - "tslib": "^2.3.1", - "unified": "^9.2.2" + "espree": "^9.4.0", + "estree-util-visit": "^1.2.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "synckit": "^0.8.4", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "unist-util-visit": "^4.1.1", + "uvu": "^0.5.6", + "vfile": "^5.3.4" }, "dependencies": { - "unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", "dev": true, "requires": { - "bail": "^1.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "requires": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + } + }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" } } } }, "eslint-plugin-markdown": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", - "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-3.0.0.tgz", + "integrity": "sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==", "dev": true, "requires": { "mdast-util-from-markdown": "^0.8.5" } }, "eslint-plugin-mdx": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-1.17.0.tgz", - "integrity": "sha512-Kicizy+fbfsB2UxTDXP92qTtFqITApu4v4DRQUfXMoPwBHeQRvZnaEtXu2S9aia51GYRYsMSqUvoPPih/5oB+g==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-mdx/-/eslint-plugin-mdx-2.0.5.tgz", + "integrity": "sha512-j2xN97jSlc5IoH94rJTHqYMztl46+hHzyC8Zqjx+OI1Rvv33isyf8xSSBHN6f0z8IJmgPgGsb/fH90JbvKplXg==", "dev": true, "requires": { - "eslint-mdx": "^1.17.0", - "eslint-plugin-markdown": "^2.2.1", - "synckit": "^0.4.1", - "tslib": "^2.3.1", - "vfile": "^4.2.1" + "eslint-mdx": "^2.0.5", + "eslint-plugin-markdown": "^3.0.0", + "remark-mdx": "^2.1.3", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "tslib": "^2.4.0", + "unified": "^10.1.2", + "vfile": "^5.3.4" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "remark-mdx": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.1.5.tgz", + "integrity": "sha512-A8vw5s+BgOa968Irt8BO7DfWJTE0Fe7Ge3hX8zzDB1DnwMZTNdK6qF2IcFao+/7nzk1vSysKcFp+3ku4vhMpaQ==", + "dev": true, + "requires": { + "mdast-util-mdx": "^2.0.0", + "micromark-extension-mdxjs": "^1.0.0" + } + }, + "remark-parse": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", + "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } } }, "eslint-plugin-react": { - "version": "7.30.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz", - "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==", + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", "dev": true, "requires": { "array-includes": "^3.1.5", @@ -20195,40 +20908,15 @@ "esutils": "^2.0.2" } }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, "resolve": { - "version": "2.0.0-next.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz", - "integrity": "sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==", + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "semver": { @@ -20240,60 +20928,47 @@ } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "devOptional": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "devOptional": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "devOptional": true } } }, "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "devOptional": true }, "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "devOptional": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "devOptional": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "devOptional": true - } + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -20308,14 +20983,6 @@ "devOptional": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "devOptional": true - } } }, "esrecurse": { @@ -20324,19 +20991,28 @@ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "estree-util-is-identifier-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.1.tgz", + "integrity": "sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==", + "dev": true + }, + "estree-util-visit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-1.2.0.tgz", + "integrity": "sha512-wdsoqhWueuJKsh5hqLw3j8lwFqNStm92VcwtAOAny8g/KS/l5Y8RISjR4k5W6skCj3Nirag/WUCMS0Nfy3sgsg==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^2.0.0" + } }, "esutils": { "version": "2.0.3", @@ -20365,7 +21041,7 @@ "event-emitter": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dev": true, "requires": { "d": "1", @@ -20406,13 +21082,13 @@ } }, "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.0", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -20431,7 +21107,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.10.3", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -20478,27 +21154,22 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, "requires": { - "type": "^2.0.0" + "type": "^2.7.2" }, "dependencies": { "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", "dev": true } } @@ -20522,9 +21193,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -20541,13 +21212,13 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "devOptional": true }, "fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", "requires": { "punycode": "^1.3.2" } @@ -20619,6 +21290,18 @@ "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "filesize": { @@ -20674,11 +21357,11 @@ } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -20693,9 +21376,9 @@ } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "devOptional": true }, "flux": { @@ -20708,9 +21391,9 @@ } }, "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", @@ -20805,7 +21488,13 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true }, "function-bind": { "version": "1.1.1", @@ -20824,12 +21513,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "devOptional": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -20842,13 +21525,13 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.3" } }, "get-own-enumerable-property-symbols": { @@ -20881,19 +21564,19 @@ } }, "github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -20968,6 +21651,12 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -20979,15 +21668,14 @@ "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" - } } }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -21007,9 +21695,15 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "devOptional": true }, "gray-matter": { "version": "4.0.3", @@ -21077,15 +21771,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "requires": { "get-intrinsic": "^1.1.1" } }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -21126,6 +21819,28 @@ "vfile": "^4.0.0", "vfile-location": "^3.2.0", "web-namespaces": "^1.0.0" + }, + "dependencies": { + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } } }, "hast-util-parse-selector": { @@ -21148,6 +21863,33 @@ "web-namespaces": "^1.0.0", "xtend": "^4.0.0", "zwitch": "^1.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } } }, "hast-util-to-parse5": { @@ -21230,6 +21972,11 @@ "util-deprecate": "~1.0.1" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -21289,66 +22036,14 @@ } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - } + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" } }, "http-cache-semantics": { @@ -21374,9 +22069,9 @@ } }, "http-parser-js": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", - "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==" + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "http-proxy": { "version": "1.18.1", @@ -21427,23 +22122,22 @@ "requires": {} }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "devOptional": true + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" }, "image-size": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.1.tgz", - "integrity": "sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", "requires": { "queue": "6.0.2" } }, "immer": { - "version": "9.0.14", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.14.tgz", - "integrity": "sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw==" + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.16.tgz", + "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==" }, "import-fresh": { "version": "3.3.0", @@ -21457,12 +22151,12 @@ "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "indent-string": { "version": "4.0.0", @@ -21470,14 +22164,14 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.39", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.39.tgz", - "integrity": "sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw==" + "version": "0.2.0-alpha.42", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", + "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -21532,12 +22226,6 @@ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" }, - "is-alphanumeric": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", - "dev": true - }, "is-alphanumerical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", @@ -21550,7 +22238,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -21585,9 +22273,9 @@ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-ci": { @@ -21596,12 +22284,19 @@ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + } } }, "is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "requires": { "has": "^1.0.3" } @@ -21633,7 +22328,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -21776,7 +22471,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "is-weakref": { "version": "1.0.2", @@ -21813,24 +22508,38 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "jest-util": { + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", + "integrity": "sha512-P5VWDj25r7kj7kl4pN2rG/RN2c1TLfYYYZYULnS/35nFDjBai+hBeo3MDrYZS7p6IoY3YHZnt2vq4L6mKnLk0g==", + "requires": { + "@jest/types": "^29.2.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } }, "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "version": "29.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.2.1.tgz", + "integrity": "sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg==", "requires": { "@types/node": "*", + "jest-util": "^29.2.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -21846,9 +22555,9 @@ } }, "joi": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", - "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "version": "17.6.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.4.tgz", + "integrity": "sha512-tPzkTJHZQjSFCc842QpdVpOZ9LI2txApboNUbW70qgnRB14Lzl+oWQOPdF2N4yqyiY14wBGe8lc7f/2hZxbGmw==", "requires": { "@hapi/hoek": "^9.0.0", "@hapi/topo": "^5.0.0", @@ -21857,6 +22566,12 @@ "@sideway/pinpoint": "^2.0.0" } }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "devOptional": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -21878,7 +22593,7 @@ "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" }, "json-parse-even-better-errors": { "version": "2.3.1", @@ -21886,12 +22601,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-ref-parser": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", - "integrity": "sha512-uxU9Ix+MVszvCTvBucQiIcNEny3oAEFg7EQHSZw2bquCCuqUqEPEczIdv/Uqo1Zv4/wDPZqOI+ulrMk1ncMtjQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "dev": true, "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.7" + "@apidevtools/json-schema-ref-parser": "9.0.9" } }, "json-schema-to-typescript": { @@ -21915,14 +22630,6 @@ "mkdirp": "^1.0.4", "mz": "^2.7.0", "prettier": "^2.2.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - } } }, "json-schema-traverse": { @@ -21933,13 +22640,13 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { @@ -21957,13 +22664,13 @@ } }, "jsx-ast-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz", - "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "object.assign": "^4.1.2" + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" } }, "keyv": { @@ -22013,24 +22720,24 @@ } }, "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -22038,11 +22745,11 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -22050,22 +22757,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.assignin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", - "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" - }, - "lodash.bind": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", - "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "devOptional": true - }, "lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", @@ -22074,38 +22765,13 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.filter": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", - "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, - "lodash.foreach": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", - "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" - }, - "lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -22114,32 +22780,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" - }, - "lodash.reject": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", - "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "devOptional": true }, "lodash.uniq": { @@ -22148,9 +22789,9 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, "longest-streak": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", - "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", + "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", "dev": true }, "loose-envify": { @@ -22185,7 +22826,7 @@ "lru-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", "dev": true, "requires": { "es5-ext": "~0.10.2" @@ -22211,15 +22852,6 @@ "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "requires": { - "repeat-string": "^1.0.0" - } - }, "mdast-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", @@ -22228,15 +22860,6 @@ "unist-util-remove": "^2.0.0" } }, - "mdast-util-compact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz", - "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==", - "dev": true, - "requires": { - "unist-util-visit": "^2.0.0" - } - }, "mdast-util-definitions": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", @@ -22258,6 +22881,301 @@ "unist-util-stringify-position": "^2.0.0" } }, + "mdast-util-mdx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.0.tgz", + "integrity": "sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==", + "dev": true, + "requires": { + "mdast-util-mdx-expression": "^1.0.0", + "mdast-util-mdx-jsx": "^2.0.0", + "mdast-util-mdxjs-esm": "^1.0.0" + } + }, + "mdast-util-mdx-expression": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.1.tgz", + "integrity": "sha512-TTb6cKyTA1RD+1su1iStZ5PAv3rFfOUKcoU5EstUpv/IZo63uDX03R8+jXjMEhcobXnNOiG6/ccekvVl4eV1zQ==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "dependencies": { + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, + "mdast-util-mdx-jsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.0.tgz", + "integrity": "sha512-KzgzfWMhdteDkrY4mQtyvTU5bc/W4ppxhe9SzelO6QUUiwLAM+Et2Dnjjprik74a336kHdo0zKm7Tp+n6FFeRg==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-to-markdown": "^1.3.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^4.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true + }, + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + }, + "character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true + }, + "is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true + }, + "is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "requires": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + } + }, + "is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true + }, + "is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true + }, + "parse-entities": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.0.tgz", + "integrity": "sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + } + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-remove-position": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz", + "integrity": "sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + } + } + }, + "mdast-util-mdxjs-esm": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.0.tgz", + "integrity": "sha512-7N5ihsOkAEGjFotIX9p/YPdl4TqUoMxL4ajNz7PbT89BqsdWJuBC9rvgt6wpbwTZqWWR0jKWqQbwsOWDBUZv4g==", + "dev": true, + "requires": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "dependencies": { + "mdast-util-from-markdown": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", + "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" + } + }, + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "micromark": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", + "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } + } + }, "mdast-util-to-hast": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", @@ -22273,6 +23191,62 @@ "unist-util-visit": "^2.0.0" } }, + "mdast-util-to-markdown": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", + "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" + }, + "dependencies": { + "mdast-util-to-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", + "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "dev": true + }, + "unist-util-is": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", + "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", + "dev": true + }, + "unist-util-visit": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", + "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + } + }, + "unist-util-visit-parents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", + "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + } + }, + "zwitch": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", + "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", + "dev": true + } + } + }, "mdast-util-to-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", @@ -22294,11 +23268,11 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "memoizee": { @@ -22315,14 +23289,6 @@ "lru-queue": "^0.1.0", "next-tick": "^1.1.0", "timers-ext": "^0.1.7" - }, - "dependencies": { - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - } } }, "merge-descriptors": { @@ -22355,6 +23321,330 @@ "parse-entities": "^2.0.0" } }, + "micromark-core-commonmark": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", + "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "dev": true, + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "micromark-extension-mdx-expression": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.3.tgz", + "integrity": "sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==", + "dev": true, + "requires": { + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-mdx-jsx": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz", + "integrity": "sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==", + "dev": true, + "requires": { + "@types/acorn": "^4.0.0", + "estree-util-is-identifier-name": "^2.0.0", + "micromark-factory-mdx-expression": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "micromark-extension-mdx-md": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz", + "integrity": "sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==", + "dev": true, + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-mdxjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz", + "integrity": "sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==", + "dev": true, + "requires": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^1.0.0", + "micromark-extension-mdx-jsx": "^1.0.0", + "micromark-extension-mdx-md": "^1.0.0", + "micromark-extension-mdxjs-esm": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-mdxjs-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz", + "integrity": "sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==", + "dev": true, + "requires": { + "micromark-core-commonmark": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.1.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "micromark-factory-destination": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", + "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-label": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", + "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-mdx-expression": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.6.tgz", + "integrity": "sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-events-to-acorn": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-position-from-estree": "^1.0.0", + "uvu": "^0.5.0", + "vfile-message": "^3.0.0" + } + }, + "micromark-factory-space": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", + "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-factory-title": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", + "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-factory-whitespace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", + "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-character": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", + "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-chunked": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", + "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-classify-character": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", + "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", + "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "dev": true, + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", + "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-decode-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", + "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "dev": true, + "requires": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-encode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", + "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "dev": true + }, + "micromark-util-events-to-acorn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.0.tgz", + "integrity": "sha512-WWp3bf7xT9MppNuw3yPjpnOxa8cj5ACivEzXJKu0WwnjBYfzaBvIAT9KfeyI0Qkll+bfQtfftSwdgTH6QhTOKw==", + "dev": true, + "requires": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "estree-util-visit": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0", + "vfile-location": "^4.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "vfile-location": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.0.1.tgz", + "integrity": "sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + } + } + }, + "micromark-util-html-tag-name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", + "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "dev": true + }, + "micromark-util-normalize-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", + "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "dev": true, + "requires": { + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", + "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "dev": true, + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", + "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", + "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "dev": true, + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-util-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", + "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "dev": true + }, + "micromark-util-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", + "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "dev": true + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -22370,16 +23660,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.52.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -22392,19 +23682,10 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, - "mini-create-react-context": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", - "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", - "requires": { - "@babel/runtime": "^7.12.1", - "tiny-warning": "^1.0.3" - } - }, "mini-css-extract-plugin": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", - "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", "requires": { "schema-utils": "^4.0.0" }, @@ -22452,22 +23733,34 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true }, "mrmime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz", - "integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" }, "ms": { "version": "2.1.2", @@ -22508,7 +23801,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "devOptional": true }, "negotiator": { @@ -22522,9 +23815,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, "no-case": { @@ -22558,9 +23851,9 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "normalize-path": { "version": "3.0.0", @@ -22591,9 +23884,9 @@ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" }, "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "requires": { "boolbase": "^1.0.0" } @@ -22606,17 +23899,30 @@ "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.1.tgz", - "integrity": "sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "object-keys": { "version": "1.1.1", @@ -22624,13 +23930,13 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -22664,18 +23970,6 @@ "requires": { "define-properties": "^1.1.4", "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "object.values": { @@ -22710,7 +24004,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } @@ -22758,19 +24052,19 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-map": { @@ -22860,9 +24154,12 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "requires": { + "entities": "^4.4.0" + } }, "parse5-htmlparser2-tree-adapter": { "version": "7.0.0", @@ -22871,29 +24168,6 @@ "requires": { "domhandler": "^5.0.2", "parse5": "^7.0.0" - }, - "dependencies": { - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "entities": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", - "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==" - }, - "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "requires": { - "entities": "^4.3.0" - } - } } }, "parseurl": { @@ -22918,12 +24192,12 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "path-key": { "version": "3.1.1", @@ -22964,6 +24238,41 @@ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } } }, "pkg-up": { @@ -22991,6 +24300,14 @@ "path-exists": "^3.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -23007,9 +24324,9 @@ } }, "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", + "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -23078,23 +24395,13 @@ } }, "postcss-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", - "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", "semver": "^7.3.7" - }, - "dependencies": { - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } } }, "postcss-merge-idents": { @@ -23107,9 +24414,9 @@ } }, "postcss-merge-longhand": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz", - "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", "requires": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.0" @@ -23209,17 +24516,17 @@ } }, "postcss-normalize-positions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", - "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "requires": { "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", - "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "requires": { "postcss-value-parser": "^4.2.0" } @@ -23267,9 +24574,9 @@ } }, "postcss-ordered-values": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", - "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "requires": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" @@ -23310,11 +24617,11 @@ } }, "postcss-sort-media-queries": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz", - "integrity": "sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", "requires": { - "sort-css-media-queries": "2.0.4" + "sort-css-media-queries": "2.1.0" } }, "postcss-svgo": { @@ -23365,7 +24672,7 @@ "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { "version": "2.3.1", @@ -23388,27 +24695,21 @@ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" }, "prism-react-renderer": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz", - "integrity": "sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", "requires": {} }, "prismjs": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", - "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "devOptional": true - }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -23427,13 +24728,13 @@ } }, "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "property-information": { @@ -23472,7 +24773,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "pupa": { "version": "2.1.1", @@ -23488,9 +24789,9 @@ "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" }, "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { "side-channel": "^1.0.4" } @@ -23519,7 +24820,7 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" }, "raw-body": { "version": "2.5.1", @@ -23553,7 +24854,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" } } }, @@ -23575,7 +24876,7 @@ "react-base16-styling": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", "requires": { "base16": "^1.0.0", "lodash.curry": "^4.0.1", @@ -23584,12 +24885,12 @@ } }, "react-copy-to-clipboard": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.3.tgz", - "integrity": "sha512-9S3j+m+UxDZOM0Qb8mhnT/rMR0NGSrj9A/073yz2DSxPMYhmYFBMYIdI2X4o8AjOjyFsSNxDRnCX6s/gRxpriw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", "requires": { - "copy-to-clipboard": "^3", - "prop-types": "^15.5.8" + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" } }, "react-dev-utils": { @@ -23623,43 +24924,10 @@ "text-table": "^0.2.0" }, "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "loader-utils": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } } } }, @@ -23734,15 +25002,14 @@ } }, "react-router": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", - "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -23759,15 +25026,15 @@ } }, "react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", "requires": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.3.3", + "react-router": "5.3.4", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } @@ -23816,17 +25083,17 @@ "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "requires": { "resolve": "^1.1.6" } }, "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.5" } }, "regenerate": { @@ -23835,17 +25102,17 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, "regenerator-transform": { "version": "0.15.0", @@ -23873,24 +25140,24 @@ "devOptional": true }, "regexpu-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", - "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", "requires": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.0.0" } }, "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", "requires": { - "rc": "^1.2.8" + "rc": "1.2.8" } }, "registry-url": { @@ -23902,14 +25169,14 @@ } }, "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" }, "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "requires": { "jsesc": "~0.5.0" }, @@ -23917,78 +25184,14 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", - "requires": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", - "requires": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" - } - }, - "hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", - "requires": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" } } }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remark-admonitions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", - "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", - "requires": { - "rehype-parse": "^6.0.2", - "unified": "^8.4.2", - "unist-util-visit": "^2.0.1" - }, - "dependencies": { - "unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "requires": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - } - } - } + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" }, "remark-emoji": { "version": "2.2.0", @@ -24043,10 +25246,71 @@ "source-map": "^0.5.0" } }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } } } }, @@ -24082,25 +25346,49 @@ } }, "remark-stringify": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz", - "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", + "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", "dev": true, "requires": { - "ccount": "^1.0.0", - "is-alphanumeric": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "longest-streak": "^2.0.1", - "markdown-escapes": "^1.0.0", - "markdown-table": "^2.0.0", - "mdast-util-compact": "^2.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "stringify-entities": "^3.0.0", - "unherit": "^1.0.4", - "xtend": "^4.0.1" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "dependencies": { + "bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true + }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "trough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", + "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "dev": true + }, + "unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + } + } } }, "renderkid": { @@ -24115,6 +25403,51 @@ "strip-ansi": "^6.0.1" }, "dependencies": { + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -24131,7 +25464,7 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" }, "require-from-string": { "version": "2.0.2", @@ -24141,20 +25474,21 @@ "require-like": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", - "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-from": { @@ -24170,7 +25504,7 @@ "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "requires": { "lowercase-keys": "^1.0.0" } @@ -24207,41 +25541,6 @@ "picocolors": "^1.0.0", "postcss": "^8.3.11", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - } } }, "run-parallel": { @@ -24253,17 +25552,37 @@ } }, "rxjs": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", - "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "requires": { "tslib": "^2.1.0" } }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } }, "safer-buffer": { "version": "2.1.2", @@ -24285,12 +25604,12 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" } }, @@ -24306,20 +25625,20 @@ "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "requires": { "node-forge": "^1" } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" } @@ -24409,17 +25728,12 @@ "range-parser": "1.2.0" }, "dependencies": { - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "mime-db": "~1.33.0" + "brace-expansion": "^1.1.7" } }, "path-to-regexp": { @@ -24432,7 +25746,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -24485,7 +25799,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" } } }, @@ -24503,7 +25817,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", @@ -24537,9 +25851,9 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.4.tgz", + "integrity": "sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==" }, "shelljs": { "version": "0.8.5", @@ -24590,6 +25904,13 @@ "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.2.4" + }, + "dependencies": { + "@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + } } }, "slash": { @@ -24597,17 +25918,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "devOptional": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -24619,19 +25929,14 @@ } }, "sort-css-media-queries": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz", - "integrity": "sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==" - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==" }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { "version": "1.0.2", @@ -24639,19 +25944,12 @@ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } } }, "space-separated-tokens": { @@ -24687,7 +25985,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "stable": { "version": "0.1.8", @@ -24705,9 +26003,9 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "std-env": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", - "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.0.tgz", + "integrity": "sha512-cNNS+VYsXIs5gI6gJipO4qZ8YYT274JHvNnQ1/R/x8Q8mdP0qj0zoMchRXmBNPqp/0eOEhX+3g7g6Fgb7meLIQ==" }, "string_decoder": { "version": "1.3.0", @@ -24715,13 +26013,6 @@ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } } }, "string-replace-loader": { @@ -24732,22 +26023,43 @@ "requires": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } } } }, @@ -24765,14 +26077,6 @@ "internal-slot": "^1.0.3", "regexp.prototype.flags": "^1.4.1", "side-channel": "^1.0.4" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "string.prototype.trimend": { @@ -24784,18 +26088,6 @@ "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "string.prototype.trimstart": { @@ -24807,29 +26099,24 @@ "call-bind": "^1.0.2", "define-properties": "^1.1.4", "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "stringify-entities": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.1.0.tgz", - "integrity": "sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", "dev": true, "requires": { - "character-entities-html4": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "xtend": "^4.0.0" + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "dependencies": { + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + } } }, "stringify-object": { @@ -24853,7 +26140,7 @@ "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" }, "strip-final-newline": { "version": "2.0.0", @@ -24883,20 +26170,18 @@ } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - } + "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", @@ -24920,51 +26205,62 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" } } }, "synckit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.4.1.tgz", - "integrity": "sha512-ngUh0+s+DOqEc0sGnrLaeNjbXp0CWHjSGFBqPlQmQ+oN/OfoDoYDBXPh+b4qs1M5QTk5nuQ3AmVz9+2xiY/ldw==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.4.tgz", + "integrity": "sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==", "dev": true, "requires": { - "tslib": "^2.3.1", - "uuid": "^8.3.2" - } - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "devOptional": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "devOptional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "devOptional": true - } + "@pkgr/utils": "^2.3.1", + "tslib": "^2.4.0" } }, "tapable": { @@ -24973,9 +26269,9 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", + "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -24991,21 +26287,51 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" + }, + "dependencies": { + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "thenify": { "version": "3.3.1", @@ -25019,7 +26345,7 @@ "thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" @@ -25040,10 +26366,20 @@ "next-tick": "1" } }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "tiny-warning": { "version": "1.0.3", @@ -25053,7 +26389,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-readable-stream": { "version": "1.0.0", @@ -25071,7 +26407,7 @@ "toggle-selection": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" }, "toidentifier": { "version": "1.0.1", @@ -25086,12 +26422,12 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" }, "trim-trailing-lines": { "version": "1.1.4", @@ -25124,9 +26460,9 @@ } }, "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" }, "type-is": { "version": "1.6.18", @@ -25135,6 +26471,21 @@ "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } } }, "typedarray-to-buffer": { @@ -25146,14 +26497,14 @@ } }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" }, "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", + "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" }, "unbox-primitive": { "version": "1.0.2", @@ -25165,14 +26516,6 @@ "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } } }, "unherit": { @@ -25204,14 +26547,14 @@ "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" }, "unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", "requires": { "bail": "^1.0.0", "extend": "^3.0.0", @@ -25219,6 +26562,28 @@ "is-plain-obj": "^2.0.0", "trough": "^1.0.0", "vfile": "^4.0.0" + }, + "dependencies": { + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + } } }, "unique-string": { @@ -25249,6 +26614,15 @@ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" }, + "unist-util-position-from-estree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.1.tgz", + "integrity": "sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + }, "unist-util-remove": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", @@ -25300,7 +26674,16 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } }, "update-notifier": { "version": "5.1.0", @@ -25343,6 +26726,26 @@ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -25364,9 +26767,9 @@ } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" }, @@ -25386,12 +26789,37 @@ "loader-utils": "^2.0.0", "mime-types": "^2.1.27", "schema-utils": "^3.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } } }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "requires": { "prepend-http": "^2.0.0" } @@ -25419,12 +26847,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "utility-types": { "version": "3.10.0", @@ -25434,18 +26862,32 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "devOptional": true + "uvu": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", + "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", + "dev": true, + "requires": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "dependencies": { + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + } + } }, "value-equal": { "version": "1.0.1", @@ -25455,17 +26897,29 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.5.tgz", + "integrity": "sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==", + "dev": true, "requires": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } } }, "vfile-location": { @@ -25474,12 +26928,24 @@ "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" }, "vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", + "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", + "dev": true, "requires": { "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "unist-util-stringify-position": "^3.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", + "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0" + } + } } }, "wait-on": { @@ -25495,9 +26961,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -25524,23 +26990,23 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -25553,7 +27019,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { @@ -25562,21 +27028,49 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, - "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, "webpack-bundle-analyzer": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", - "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "requires": { "acorn": "^8.0.4", "acorn-walk": "^8.0.0", @@ -25632,6 +27126,19 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -25651,14 +27158,15 @@ } }, "webpack-dev-server": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.1.tgz", - "integrity": "sha512-CTMfu2UMdR/4OOZVHRpdy84pNopOuigVIsRbGX3LVDMWNP8EUgC5mUBMErbwBlHTEX99ejZJpVqrir6EXAEajA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", @@ -25666,7 +27174,7 @@ "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", + "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", @@ -25677,7 +27185,7 @@ "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", @@ -25721,9 +27229,9 @@ } }, "ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "requires": {} } } @@ -25771,7 +27279,7 @@ "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -25804,31 +27312,6 @@ "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "requires": { "string-width": "^5.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "requires": { - "ansi-regex": "^6.0.1" - } - } } }, "wildcard": { @@ -25858,19 +27341,9 @@ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" }, "ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==" - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" }, "strip-ansi": { "version": "7.0.1", @@ -25885,7 +27358,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "3.0.3", @@ -25899,9 +27372,9 @@ } }, "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, "xdg-basedir": { diff --git a/docs/package.json b/docs/package.json index b2833c30..a6582472 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.0.0-beta.21", - "@docusaurus/preset-classic": "^2.0.0-beta.21", + "@docusaurus/core": "^2.1.0", + "@docusaurus/preset-classic": "^2.1.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -43,16 +43,16 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.0.0-beta.21", - "@docusaurus/types": "^2.0.0-beta.21", + "@docusaurus/module-type-aliases": "^2.1.0", + "@docusaurus/types": "^2.1.0", "@tsconfig/docusaurus": "^1.0.5", "@types/js-yaml": "^4.0.5", "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^7.32.0", + "eslint": "^8.0.0", "eslint-config-prettier": "^8.5.0", - "eslint-plugin-mdx": "^1.17.0", + "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.30.0", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", From a02eb282717ccef4dfde175b0a6d74b5ed60a1c8 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 26 Oct 2022 13:55:47 +0000 Subject: [PATCH 220/494] fix(docs): Move to `data-tooltip` for profiler. * Fix ESLint warning by using `data-` prefixed custom attr. --- docs/src/components/custom-board-form.js | 8 ++++---- docs/src/css/power-profiler.css | 12 ++++++------ docs/src/pages/power-profiler.js | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/src/components/custom-board-form.js b/docs/src/components/custom-board-form.js index 0279f6b1..e8ae4294 100644 --- a/docs/src/components/custom-board-form.js +++ b/docs/src/components/custom-board-form.js @@ -34,7 +34,7 @@ function CustomBoardForm({
@@ -45,7 +45,7 @@ function CustomBoardForm({
@@ -64,7 +64,7 @@ function CustomBoardForm({
@@ -74,7 +74,7 @@ function CustomBoardForm({
diff --git a/docs/src/css/power-profiler.css b/docs/src/css/power-profiler.css index 94c4a5dd..a0c18928 100644 --- a/docs/src/css/power-profiler.css +++ b/docs/src/css/power-profiler.css @@ -26,12 +26,12 @@ font-size: 14px; } -span[tooltip] { +span[data-tooltip] { position: relative; } -span[tooltip]::before { - content: attr(tooltip); +span[data-tooltip]::before { + content: attr(data-tooltip); font-size: 13px; padding: 5px 10px; position: absolute; @@ -47,7 +47,7 @@ span[tooltip]::before { left: 50%; } -span[tooltip]::after { +span[data-tooltip]::after { content: ""; position: absolute; border-top: 8px solid var(--ifm-background-surface-color); @@ -62,12 +62,12 @@ span[tooltip]::after { left: 50%; } -span[tooltip]:hover::before { +span[data-tooltip]:hover::before { opacity: 1; visibility: visible; } -span[tooltip]:hover::after { +span[data-tooltip]:hover::after { opacity: 1; visibility: visible; } diff --git a/docs/src/pages/power-profiler.js b/docs/src/pages/power-profiler.js index c909ec02..d28886ef 100644 --- a/docs/src/pages/power-profiler.js +++ b/docs/src/pages/power-profiler.js @@ -155,7 +155,7 @@ function PowerProfiler() {
@@ -167,7 +167,7 @@ function PowerProfiler() {
From 3353712bc1be89e9c239eeacbe51c163135fdeb7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 27 Oct 2022 03:53:28 +0000 Subject: [PATCH 221/494] fix(docs): `npm start` to work from Docker. * Listen on 0.0.0.0 so testing docs within our container works properly with port forwarding. --- docs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/package.json b/docs/package.json index a6582472..7c933b03 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "docusaurus start", + "start": "docusaurus start --host 0.0.0.0", "build": "docusaurus build", "serve": "docusaurus serve", "swizzle": "docusaurus swizzle", From 4e1191312745597b2312fda3d53e079ace4ea7f3 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Fri, 28 Oct 2022 10:03:16 +0800 Subject: [PATCH 222/494] feat(docs): troubleshooting steps for macOS 13 Finder bug --- docs/docs/troubleshooting.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 46901d15..91c7d6d7 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -21,6 +21,10 @@ Variations of the warnings shown below occur when flashing the `.uf2` | :--------------------------------------------------------------------------: | | An example of the file transfer error on MacOS | +### MacOS Ventura error + +MacOS 13.0 (Ventura) Finder running on Apple silicon hardware may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. + ### CMake Error An error along the lines of `CMake Error at (zmk directory)/zephyr/cmake/generic_toolchain.cmake:64 (include): include could not find load file:` during firmware compilation indicates that the Zephyr Environment Variables are not properly defined. From d393247e15210a424c3cfcae4cd1eb67195c6595 Mon Sep 17 00:00:00 2001 From: HookyQR Date: Mon, 31 Oct 2022 08:50:21 +0800 Subject: [PATCH 223/494] fix(display): Set bits per pixel and color depth on n!v --- app/boards/shields/nice_view/Kconfig.defconfig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index 622c7498..a699a813 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -17,6 +17,13 @@ config LS0XX config ZMK_WIDGET_WPM_STATUS default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + endif # ZMK_DISPLAY endif From a61eac91395a7e8f2695e76c7512fb97e0e13e11 Mon Sep 17 00:00:00 2001 From: Okke Formsma Date: Tue, 1 Nov 2022 21:13:19 +0100 Subject: [PATCH 224/494] fix(behaviors): make tap dances work on a combo * Tap dance event handler goes after combos * Add test --- app/CMakeLists.txt | 2 +- .../tap-dance/6-combo-tap2/events.patterns | 2 ++ .../6-combo-tap2/keycode_events.snapshot | 7 +++++ .../6-combo-tap2/native_posix_64.keymap | 17 +++++++++++ app/tests/tap-dance/behavior_keymap.dtsi | 30 ++++++++++++------- 5 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 app/tests/tap-dance/6-combo-tap2/events.patterns create mode 100644 app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot create mode 100644 app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4b61fc72..3da50b57 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -47,13 +47,13 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c) target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c) target_sources(app PRIVATE src/behaviors/behavior_outputs.c) - target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behaviors/behavior_toggle_layer.c) target_sources(app PRIVATE src/behaviors/behavior_to_layer.c) target_sources(app PRIVATE src/behaviors/behavior_transparent.c) target_sources(app PRIVATE src/behaviors/behavior_none.c) target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c) target_sources(app PRIVATE src/combo.c) + target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) target_sources(app PRIVATE src/conditional_layer.c) target_sources(app PRIVATE src/endpoints.c) diff --git a/app/tests/tap-dance/6-combo-tap2/events.patterns b/app/tests/tap-dance/6-combo-tap2/events.patterns new file mode 100644 index 00000000..1768fc21 --- /dev/null +++ b/app/tests/tap-dance/6-combo-tap2/events.patterns @@ -0,0 +1,2 @@ +s/.*hid_listener_keycode/kp/p +s/.*on_tap_dance_binding/td_binding/p \ No newline at end of file diff --git a/app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot b/app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot new file mode 100644 index 00000000..227d9cf2 --- /dev/null +++ b/app/tests/tap-dance/6-combo-tap2/keycode_events.snapshot @@ -0,0 +1,7 @@ +td_binding_pressed: 4 created new tap dance +td_binding_pressed: 4 tap dance pressed +td_binding_released: 4 tap dance keybind released +td_binding_pressed: 4 tap dance pressed +td_binding_released: 4 tap dance keybind released +kp_pressed: usage_page 0x07 keycode 0x1F implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x1F implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap new file mode 100644 index 00000000..72b6744a --- /dev/null +++ b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,200) + >; +}; \ No newline at end of file diff --git a/app/tests/tap-dance/behavior_keymap.dtsi b/app/tests/tap-dance/behavior_keymap.dtsi index 5e95cd50..ce80e958 100644 --- a/app/tests/tap-dance/behavior_keymap.dtsi +++ b/app/tests/tap-dance/behavior_keymap.dtsi @@ -3,7 +3,7 @@ #include / { - behaviors { + behaviors { ht: hold_tap { compatible = "zmk,behavior-hold-tap"; label = "HOLD_TAP"; @@ -47,14 +47,24 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + combos { + compatible = "zmk,combos"; - default_layer { - bindings = < - &tdm &tds - &tdb &td2>; - }; - }; + td_combo { + bindings = <&tdb>; + key-positions = <0 1>; + timeout-ms = <50>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &tdm &tds + &tdb &td2>; + }; + }; }; From 2364960f842f34d3c552cca358b7be62fbbf9988 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 22 Oct 2022 02:01:20 -0400 Subject: [PATCH 225/494] feat(shields): Add splitkb.com Aurora Sweep. --- .../splitkb_aurora_sweep/Kconfig.defconfig | 55 ++++++++++ .../splitkb_aurora_sweep/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 31 ++++++ .../boards/nice_nano_v2.overlay | 31 ++++++ .../splitkb_aurora_sweep.conf | 9 ++ .../splitkb_aurora_sweep.dtsi | 80 ++++++++++++++ .../splitkb_aurora_sweep.keymap | 102 ++++++++++++++++++ .../splitkb_aurora_sweep.zmk.yml | 12 +++ .../splitkb_aurora_sweep_left.overlay | 48 +++++++++ .../splitkb_aurora_sweep_right.overlay | 51 +++++++++ 10 files changed, 427 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_sweep/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig new file mode 100644 index 00000000..51fbc28c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_SWEEP_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Sweep" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_SWEEP_LEFT + +if SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +config ZMK_DISPLAY + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield new file mode 100644 index 00000000..abb05282 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_SWEEP_LEFT + def_bool $(shields_list_contains,splitkb_aurora_sweep_left) + +config SHIELD_SPLITKB_AURORA_SWEEP_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_sweep_right) diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf new file mode 100644 index 00000000..bb2b843d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Kyria OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi new file mode 100644 index 00000000..a999df6a --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; + map = < + RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,1) RC(3,0) RC(3,5) RC(3,6) + >; + }; + + left_encoder1: left_encoder1 { + compatible = "alps,ec11"; + label = "L_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; + + left_encoder2: left_encoder2 { + compatible = "alps,ec11"; + label = "L_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; + + right_encoder1: right_encoder1 { + compatible = "alps,ec11"; + label = "R_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; + + right_encoder2: right_encoder2 { + compatible = "alps,ec11"; + label = "R_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder1 &right_encoder1>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap new file mode 100644 index 00000000..136e6927 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + + +&mt { + // flavor = "tap-preferred"; + // tapping_term_ms = <200>; +}; + +/ { + + combos { + compatible = "zmk,combos"; + combo_esc { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp ESC>; + }; + + combo_tab { + timeout-ms = <50>; + key-positions = <10 11>; + bindings = <&kp TAB>; + }; + + combo_ralt { + timeout-ms = <50>; + key-positions = <17 16>; + bindings = <&kp RALT>; + }; + + combo_lalt { + timeout-ms = <50>; + key-positions = <11 12>; + bindings = <&kp LALT>; + }; + + combo_lgui { + timeout-ms = <50>; + key-positions = <12 13>; + bindings = <&kp LGUI>; + }; + + + combo_rgui { + timeout-ms = <50>; + key-positions = <17 18>; + bindings = <&kp RGUI>; + }; + + + + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT + &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET + &mo 1 &kp LCTL &kp SPC &mo 2 + >; + }; + + left_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 + >; + }; + + right_layer { + bindings = < + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP + &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTL &kp SPC &mo 2 + >; + }; + + tri_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans + >; + }; + + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml new file mode 100644 index 00000000..97d3c53b --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: splitkb_aurora_sweep +name: splitkb.com Aurora Sweep +type: shield +url: https://splitkb.com/products/aurora-sweep-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys +siblings: + - splitkb_aurora_sweep_left + - splitkb_aurora_sweep_right diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay new file mode 100644 index 00000000..3dc954c3 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sweep.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&left_encoder1 { + status = "okay"; + a-gpios = <&pro_micro 9 GPIO_PULL_UP>; + b-gpios = <&pro_micro 8 GPIO_PULL_UP>; +}; + +&left_encoder2 { + status = "okay"; + a-gpios = <&pro_micro 14 GPIO_PULL_UP>; + b-gpios = <&pro_micro 16 GPIO_PULL_UP>; +}; + diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay new file mode 100644 index 00000000..3811423e --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sweep.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&right_encoder1 { + status = "okay"; + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; +}; + +&right_encoder2 { + status = "okay"; + a-gpios = <&pro_micro 20 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; +}; + +&default_transform { + col-offset = <5>; +}; From 9847a4c5d597cce84f41455d1990c5338d5bac34 Mon Sep 17 00:00:00 2001 From: Terence Stenvold Date: Wed, 9 Nov 2022 21:56:22 +0100 Subject: [PATCH 226/494] fix(docs): copy error not exclusive to Apple silicon --- docs/docs/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 91c7d6d7..6944135e 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -23,7 +23,7 @@ Variations of the warnings shown below occur when flashing the `.uf2` ### MacOS Ventura error -MacOS 13.0 (Ventura) Finder running on Apple silicon hardware may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. +MacOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. ### CMake Error From c7d83fb951528c825a8c3a221b7b9659c60034d8 Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Wed, 9 Nov 2022 21:38:08 -0500 Subject: [PATCH 227/494] fix(docs): changed MacOS to macOS as per Apple styling --- docs/docs/development/usb-logging.md | 2 +- docs/docs/troubleshooting.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/usb-logging.md b/docs/docs/development/usb-logging.md index cd1d834d..9a2980ae 100644 --- a/docs/docs/development/usb-logging.md +++ b/docs/docs/development/usb-logging.md @@ -68,7 +68,7 @@ If you already have the Ardunio IDE installed you can also use its built-in Seri -On MacOS, the device name is something like `/dev/tty.usbmodemXXXXX` where `XXXXX` is some numerical ID. +On macOS, the device name is something like `/dev/tty.usbmodemXXXXX` where `XXXXX` is some numerical ID. You can connect to the device with [tio](https://tio.github.io/) (can be installed via [Homebrew](https://formulae.brew.sh/formula/tio)): ``` diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 6944135e..a535a4ef 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -19,11 +19,11 @@ Variations of the warnings shown below occur when flashing the `.uf2` | ![Example Error Screen](../docs/assets/troubleshooting/filetransfer/mac.png) | | :--------------------------------------------------------------------------: | -| An example of the file transfer error on MacOS | +| An example of the file transfer error on macOS | -### MacOS Ventura error +### macOS Ventura error -MacOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. +macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. ### CMake Error From a9048956b500e1104bed69038b4a32c2c1e9b7ff Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 3 Nov 2022 16:16:14 -0400 Subject: [PATCH 228/494] feat(shields): Add splitkb.com Aurora Corne. --- .../splitkb_aurora_corne/Kconfig.defconfig | 55 +++++++++++ .../splitkb_aurora_corne/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 31 +++++++ .../boards/nice_nano_v2.overlay | 31 +++++++ .../splitkb_aurora_corne.conf | 9 ++ .../splitkb_aurora_corne.dtsi | 92 +++++++++++++++++++ .../splitkb_aurora_corne.keymap | 56 +++++++++++ .../splitkb_aurora_corne.zmk.yml | 12 +++ .../splitkb_aurora_corne_left.overlay | 42 +++++++++ .../splitkb_aurora_corne_right.overlay | 48 ++++++++++ 10 files changed, 384 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_corne/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig new file mode 100644 index 00000000..5a1eeb13 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_CORNE_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Corne" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_CORNE_LEFT + +if SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +config ZMK_DISPLAY + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield new file mode 100644 index 00000000..3de10105 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_CORNE_LEFT + def_bool $(shields_list_contains,splitkb_aurora_corne_left) + +config SHIELD_SPLITKB_AURORA_CORNE_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_corne_right) diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..0087208c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf new file mode 100644 index 00000000..bb2b843d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Kyria OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi new file mode 100644 index 00000000..aa525948 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; +// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | +// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | +// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | +// | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; +// | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | +// | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | +// | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | +// | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 4 GPIO_PULL_UP>; + b-gpios = <&pro_micro 5 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 19 GPIO_PULL_UP>; + b-gpios = <&pro_micro 18 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap new file mode 100644 index 00000000..53218a86 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ----------------------------------------------------------------------------------------- +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | +// | GUI | LWR | SPC | | ENT | RSE | ALT | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; + lower_layer { +// ----------------------------------------------------------------------------------------- +// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | +// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | +// | SHFT | | | | | | | | | | | | | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans + &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + + raise_layer { +// ----------------------------------------------------------------------------------------- +// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | +// | CTRL | | | | | | | - | = | [ | ] | \ | ` | +// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC + &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE + &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml new file mode 100644 index 00000000..cc141826 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: splitkb_aurora_corne +name: splitkb.com Aurora Corne +type: shield +url: https://splitkb.com/products/aurora-corne-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys +siblings: + - splitkb_aurora_corne_left + - splitkb_aurora_corne_right diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay new file mode 100644 index 00000000..864321cc --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_corne.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; + + diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay new file mode 100644 index 00000000..b4c4b438 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_corne.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <5>; +}; + +&five_column_transform { + col-offset = <6>; +}; From 1e98ea0afbbcc9bc8bcb1057a5290e0d4b1d594e Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Fri, 11 Nov 2022 08:48:16 +0800 Subject: [PATCH 229/494] fix(ci): Refactor west build step --- .github/workflows/build-user-config.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 3833abe8..3d89ed7b 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -99,8 +99,7 @@ jobs: - name: West Build (${{ env.display_name }}) shell: sh -x {0} - run: | - west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} + run: west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - name: ${{ env.display_name }} Kconfig file run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort From 768fc4a5e54fd11229a4f9c3f07eadc4d00da955 Mon Sep 17 00:00:00 2001 From: jhorology Date: Sat, 5 Nov 2022 05:47:16 +0900 Subject: [PATCH 230/494] fix: HID report descriptor --- app/include/zmk/hid.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 0f9cfe2e..01104d1c 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -52,7 +52,7 @@ static const uint8_t zmk_hid_report_desc[] = { HID_INPUT(0x02), #elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) HID_LOGICAL_MIN8(0x00), - HID_LOGICAL_MAX8(0xFF), + HID_LOGICAL_MAX16(0xFF, 0x00), HID_USAGE_MIN8(0x00), HID_USAGE_MAX8(0xFF), HID_REPORT_SIZE(0x08), From 6e7c2a08a26d011512edb76d63c6f96ff081e0be Mon Sep 17 00:00:00 2001 From: Michael Anthony <5498095+manthonygfp@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:58:28 -0700 Subject: [PATCH 231/494] fix(docs): Update link to Zephyr led docs * Change Zephyr gpio-leds link to 3.0.0 --- docs/docs/config/backlight.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/config/backlight.md b/docs/docs/config/backlight.md index a3650766..8084be89 100644 --- a/docs/docs/config/backlight.md +++ b/docs/docs/config/backlight.md @@ -34,7 +34,7 @@ Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/build/dts/int See the Zephyr devicetree bindings for LED drivers: -- [gpio-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/gpio/gpio-leds.html) +- [gpio-leds](https://docs.zephyrproject.org/3.0.0/reference/devicetree/bindings/gpio/gpio-leds.html) - [pwm-leds](https://docs.zephyrproject.org/latest/build/dts/api/bindings/led/pwm-leds.html) See the [backlight feature page](../features/backlight.md) for examples of the properties that must be set to enable backlighting. From 9f90dd1fc76feb272a856742b9f110ec352c0c8a Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 17 Nov 2022 23:25:11 -0500 Subject: [PATCH 232/494] fix(boards): Fix XIAO BLE voltage divider config. * Use proper resistor value for the `output-ohms` property. --- app/boards/seeeduino_xiao_ble.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay index 0f5df999..452786d1 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -16,7 +16,7 @@ label = "BATTERY"; io-channels = <&adc 7>; power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; - output-ohms = <1000000>; + output-ohms = <510000>; full-ohms = <(1000000 + 510000)>; }; }; From c7fdce863ac2f03bc70495f9904b127f2d99d85c Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Wed, 16 Nov 2022 17:00:39 -0500 Subject: [PATCH 233/494] fix(usb): add USB_DC_CLEAR_HALT to supported states See https://manpages.debian.org/testing/linux-manual-4.9/usb_clear_halt.9 for information on halted USB endpoints --- app/src/usb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/usb.c b/app/src/usb.c index aa2d3e75..146e7bb7 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -34,6 +34,7 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state() { case USB_DC_SUSPEND: case USB_DC_CONFIGURED: case USB_DC_RESUME: + case USB_DC_CLEAR_HALT: return ZMK_USB_CONN_HID; case USB_DC_DISCONNECTED: From 5cd608cb6016729f115591145a234faec77da3f4 Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Thu, 24 Nov 2022 20:02:44 -0500 Subject: [PATCH 234/494] fix(docs): Correct syntax in capsword mods --- docs/docs/behaviors/caps-word.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md index 1b743a59..e85d7eca 100644 --- a/docs/docs/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -43,7 +43,7 @@ In addition, if you would like _multiple_ modifiers, instead of just `MOD_LSFT`, ``` &caps_word { - mods = ; + mods = <(MOD_LSFT | MOD_LALT)>; }; / { From 4d0e0fa34b379584dea17a40c5fed4eb1d64e76b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 03:29:20 +0000 Subject: [PATCH 235/494] chore(deps): bump loader-utils from 2.0.3 to 2.0.4 in /docs Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 61af445c..69ee0fc4 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9278,9 +9278,9 @@ } }, "node_modules/loader-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", - "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -12521,9 +12521,9 @@ } }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "engines": { "node": ">= 12.13.0" } @@ -22735,9 +22735,9 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", - "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -24925,9 +24925,9 @@ }, "dependencies": { "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" } } }, From 6550c043c49fcd4db9e213c324f016e622f12d54 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Sat, 26 Nov 2022 13:02:28 +0800 Subject: [PATCH 236/494] refactor: Update cradio keymap with better indentation and additional features --- app/boards/shields/cradio/cradio.keymap | 184 ++++++++++++------------ 1 file changed, 93 insertions(+), 91 deletions(-) diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index ec5e0e7a..587bc7aa 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -1,102 +1,104 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +// Copyright (c) 2022 The ZMK Contributors +// SPDX-License-Identifier: MIT #include #include #include +// Home row mods macro +#define HRML(k1,k2,k3,k4) &ht LSHFT k1 &ht LALT k2 &ht LCTRL k3 &ht LGUI k4 +#define HRMR(k1,k2,k3,k4) &ht RGUI k1 &ht RCTRL k2 &ht RALT k3 &ht RSHFT k4 -&mt { - // flavor = "tap-preferred"; - // tapping_term_ms = <200>; -}; - -/ { - - combos { - compatible = "zmk,combos"; - combo_esc { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp ESC>; +/ { + behaviors { + ht: hold_tap { + label = "hold_tap"; + compatible = "zmk,behavior-hold-tap"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <220>; + quick-tap-ms = <150>; + global-quick-tap; + bindings = <&kp>, <&kp>; }; - - combo_tab { - timeout-ms = <50>; - key-positions = <10 11>; - bindings = <&kp TAB>; - }; - - combo_ralt { - timeout-ms = <50>; - key-positions = <17 16>; - bindings = <&kp RALT>; - }; - - combo_lalt { - timeout-ms = <50>; - key-positions = <11 12>; - bindings = <&kp LALT>; - }; - - combo_lgui { - timeout-ms = <50>; - key-positions = <12 13>; - bindings = <&kp LGUI>; - }; - - - combo_rgui { - timeout-ms = <50>; - key-positions = <17 18>; - bindings = <&kp RGUI>; - }; - - - }; - keymap { - compatible = "zmk,keymap"; - - default_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT - &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 - >; - }; + conditional_layers { + compatible = "zmk,conditional-layers"; + tri_layer { + if-layers = <1 2>; + then-layer = <3>; + }; + }; - left_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 - >; - }; - - right_layer { - bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN - &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP - &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 - >; - }; - - tri_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans - >; - }; - - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ ' " │ + HRML(A, S, D, F) &kp G &kp H HRMR(J, K, L, SQT) + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ Z │ X │ C │ V │ B │ │ N │ M │ , < │ . > │ / ? │ + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + < 2 TAB &kp ENTER &kp SPACE < 1 BSPC + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + + right_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ INSERT │ 1 │ 2 │ 3 │ │ │ HOME │ PAGE DN │ PAGE UP │ END │ : │ + &kp INS &kp N1 &kp N2 &kp N3 &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &kp COLON + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ DELETE │ 4 │ 5 │ 6 │ │ │ LEFT │ DOWN │ UP │ RIGHT │ ; │ + &kp DEL &kp N4 &kp N5 &kp N6 &trans &kp LARW &kp DARW &kp UARW &kp RARW &kp SEMI + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ CAPS │ 7 │ 8 │ 9 │ 0 │ │ │ │ │ │ │ + &caps_word &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + &trans &kp ESC &trans &trans + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + + left_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ │ [ │ { │ } │ │ │ ^ │ ( │ ) │ ] │ ~ │ + &trans &kp LBKT &kp LBRC &kp RBRC &trans &kp CARET &kp LPAR &kp RPAR &kp RBKT &kp TILDE + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ ! │ @ │ # │ $ │ % │ │ * │ - │ = │ \ │ ` │ + &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp ASTRK &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ │ │ │ │ │ │ & │ _ │ + │ │ │ │ + &trans &trans &trans &trans &trans &kp AMPS &kp UNDER &kp PLUS &kp PIPE &trans + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + &trans &trans &trans &trans + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + + tri_layer { + bindings = < + //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ + //│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │ + &reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &reset + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│BOOTLOADER│ │ │ │PROFILE 1 │ │ │ │ │ │BOOTLOADER│ + &bootloader &trans &trans &trans &bt BT_SEL 1 &trans &trans &trans &trans &bootloader + //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ + //│ │ │ │ CLEAR BT │PROFILE 2 │ │ │ │ │ │ │ + &trans &trans &trans &bt BT_CLR &bt BT_SEL 2 &trans &trans &trans &trans &trans + //╰──────────┴──────────┴──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┴──────────┴──────────╯ + &trans &trans &trans &trans + // ╰──────────┴──────────╯ ╰──────────┴──────────╯ + >; + }; + }; }; From 001105e31844f0f59b82a2e71a4c3ada980b931b Mon Sep 17 00:00:00 2001 From: Kurtis Lew Date: Wed, 30 Nov 2022 17:59:26 -0800 Subject: [PATCH 237/494] fix(docs): Correct typo in hold-tap comparison balanced flavor --- docs/docs/assets/hold-tap/comparison.svg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/docs/assets/hold-tap/comparison.svg b/docs/docs/assets/hold-tap/comparison.svg index eef79f39..5193d846 100644 --- a/docs/docs/assets/hold-tap/comparison.svg +++ b/docs/docs/assets/hold-tap/comparison.svg @@ -70,8 +70,8 @@ - - + + @@ -83,7 +83,7 @@ - + @@ -124,8 +124,8 @@ - + - + From 593db8537826539eb8ee81f14e635d3ed1cbed0e Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Thu, 1 Dec 2022 12:34:22 -0600 Subject: [PATCH 238/494] feat(boards): Add support for nRF5340 DK Added overlays to support building for the nRF5340 development kit. Also added some documentation on how to build and flash ZMK for dual- chip Bluetooth configurations, with an example for the nRF5340. --- app/boards/nrf5340dk_nrf5340_cpuapp.conf | 15 +++++++++++++++ docs/docs/development/build-flash.md | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 app/boards/nrf5340dk_nrf5340_cpuapp.conf diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.conf b/app/boards/nrf5340dk_nrf5340_cpuapp.conf new file mode 100644 index 00000000..a40195e3 --- /dev/null +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.conf @@ -0,0 +1,15 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Default main stack size is too small for HCI RPMsg +CONFIG_MAIN_STACK_SIZE=2048 diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 15b4acf7..09006646 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -140,3 +140,23 @@ your board and run the following command to flash: ``` west flash ``` + +## Multi-CPU and Dual-Chip Bluetooth Boards + +Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/latest/connectivity/bluetooth/bluetooth-arch.html) for more details. + +The following documentation shows how to build and flash ZMK for boards that use a dual-chip configuration. + +### nRF5340 + +To build and flash the firmware for the nRF5340 development kit's network core, run the following command from the root of the ZMK repo: + +```sh +cd zephyr/samples/bluetooth/hci_rpmsg +west build -b nrf5340dk_nrf5340_cpunet +west flash +``` + +You can then build and flash ZMK firmware using the normal steps described above. The network core's firmware only needs to be updated whenever ZMK upgrades to a new version of Zephyr. + +For a custom nRF5340-based board, you will need to define two Zephyr boards: one for the application core and one for the network core. The [nRF5340 DK's board definition](https://github.com/zephyrproject-rtos/zephyr/tree/main/boards/arm/nrf5340dk_nrf5340) can be used as reference. Replace `nrf5340dk_nrf5340_cpunet` with the name of your network core board. From 6ccb5280c9e2ca23c633e7cd8113687994acd8c5 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Tue, 6 Dec 2022 00:25:00 -0600 Subject: [PATCH 239/494] fix(docs): Pin Zephyr docs links to a version Co-authored-by: Cem Aksoylar --- docs/docs/development/build-flash.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 09006646..6f4ba84d 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -143,7 +143,7 @@ west flash ## Multi-CPU and Dual-Chip Bluetooth Boards -Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/latest/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/latest/connectivity/bluetooth/bluetooth-arch.html) for more details. +Zephyr supports running the Bluetooth host and controller on separate processors. In such a configuration, ZMK always runs on the host processor, but you may need to build and flash separate firmware for the controller. Zephyr provides sample code which can be used as the controller firmware for Bluetooth HCI over [RPMsg](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_rpmsg/README.html), [SPI](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_spi/README.html), [UART](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_uart/README.html), and [USB](https://docs.zephyrproject.org/3.2.0/samples/bluetooth/hci_usb/README.html). See [Zephyr's Bluetooth Stack Architecture documentation](https://docs.zephyrproject.org/3.2.0/connectivity/bluetooth/bluetooth-arch.html) for more details. The following documentation shows how to build and flash ZMK for boards that use a dual-chip configuration. From 58eb7a3305b11e465505e60657479346bec32f53 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Tue, 29 Nov 2022 22:05:04 -0800 Subject: [PATCH 240/494] feat(display): Add config to show battery level in percentage --- app/src/display/widgets/Kconfig | 7 +++++++ app/src/display/widgets/battery_status.c | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 96e7e16d..847a47ab 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -15,6 +15,13 @@ config ZMK_WIDGET_BATTERY_STATUS default y if BT select LVGL_USE_LABEL +if ZMK_WIDGET_BATTERY_STATUS + +config ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE + bool "Show battery level percentage in text" + +endif + config ZMK_WIDGET_OUTPUT_STATUS bool "Widget for keyboard output status icons" depends on BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 9179b0d0..71b243d3 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -27,7 +27,7 @@ struct battery_status_state { }; static void set_battery_symbol(lv_obj_t *label, struct battery_status_state state) { - char text[8] = {}; + char text[9] = {}; uint8_t level = state.level; @@ -37,6 +37,11 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat } #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ +#if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE) + char perc[5] = {}; + snprintf(perc, sizeof(perc), "%3u%%", level); + strcat(text, perc); +#else if (level > 95) { strcat(text, LV_SYMBOL_BATTERY_FULL); } else if (level > 65) { @@ -48,6 +53,7 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat } else { strcat(text, LV_SYMBOL_BATTERY_EMPTY); } +#endif lv_label_set_text(label, text); lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } From 2a42fe658ee713cb93609c743e7bde3242d7aa7f Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Thu, 1 Dec 2022 15:58:31 -0800 Subject: [PATCH 241/494] feat(docs): Document battery widget percentage Kconfig --- docs/docs/config/displays.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index cf6c07ee..d126e38a 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -14,13 +14,14 @@ Definition files: - [zmk/app/src/display/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/Kconfig) - [zmk/app/src/display/widgets/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/src/display/widgets/Kconfig) -| Config | Type | Description | Default | -| ---------------------------------- | ---- | ---------------------------------------------------- | ------- | -| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | -| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | -| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | -| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | -| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +| Config | Type | Description | Default | +| -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | +| `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | +| `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | +| `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | If `CONFIG_ZMK_DISPLAY` is enabled, exactly zero or one of the following options must be set to `y`. The first option is used if none are set. From 12329b388e5bf7a60c16185d8f714a0596b681a7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 9 Dec 2022 17:07:45 -0500 Subject: [PATCH 242/494] feat(boards): Add Arduino Uno interconnect, nrf52840dk config. --- .../nrf52840dk_nrf52840.zmk.yml | 10 ++++++++++ .../interconnects/arduino_uno/arduino_uno.zmk.yml | 15 +++++++++++++++ app/boards/nrf52840dk_nrf52840.conf | 12 ++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml create mode 100644 app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml create mode 100644 app/boards/nrf52840dk_nrf52840.conf diff --git a/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml b/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml new file mode 100644 index 00000000..2a0d9946 --- /dev/null +++ b/app/boards/arm/nrf52840dk_nrf52840/nrf52840dk_nrf52840.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: nrf52840dk_nrf52840 +name: Nordic nRF52840 DK +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dk +exposes: [arduino_uno] diff --git a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml new file mode 100644 index 00000000..8ec164eb --- /dev/null +++ b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: arduino_uno +name: Arduino Uno Rev3 +type: interconnect +url: https://store-usa.arduino.cc/products/arduino-uno-rev3?selectedStore=us +manufacturer: Arduino +description: | + The Arduino Uno Rev3 is a board who's popularity lead to countless shields being developed for it. By + natural extension, once there were many shields designed for it, many other *boards* began to be developed + that were compatible to leverage the extensive available shields. Today, many dev kits come with Uno + headers to make it easy to work with them. + + Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only + supports 32-bit and 64-bit platforms. As a result, boards like the original Arduino Uno Rev3 itself are + *not* supported by ZMK. diff --git a/app/boards/nrf52840dk_nrf52840.conf b/app/boards/nrf52840dk_nrf52840.conf new file mode 100644 index 00000000..6c9bcdf1 --- /dev/null +++ b/app/boards/nrf52840dk_nrf52840.conf @@ -0,0 +1,12 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y From 63b29ccd3256e0f9e253591c560eb104082a920a Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 13 Jun 2022 03:28:56 +0000 Subject: [PATCH 243/494] feat(shields): Add ZMK Uno shield. * Support underglow, backlight, display, encoder, etc. --- app/boards/shields/zmk_uno/Kconfig.defconfig | 23 +++ app/boards/shields/zmk_uno/Kconfig.shield | 5 + app/boards/shields/zmk_uno/zmk_uno.conf | 18 ++ app/boards/shields/zmk_uno/zmk_uno.keymap | 62 +++++++ app/boards/shields/zmk_uno/zmk_uno.overlay | 186 +++++++++++++++++++ app/boards/shields/zmk_uno/zmk_uno.zmk.yml | 10 + 6 files changed, 304 insertions(+) create mode 100644 app/boards/shields/zmk_uno/Kconfig.defconfig create mode 100644 app/boards/shields/zmk_uno/Kconfig.shield create mode 100644 app/boards/shields/zmk_uno/zmk_uno.conf create mode 100644 app/boards/shields/zmk_uno/zmk_uno.keymap create mode 100644 app/boards/shields/zmk_uno/zmk_uno.overlay create mode 100644 app/boards/shields/zmk_uno/zmk_uno.zmk.yml diff --git a/app/boards/shields/zmk_uno/Kconfig.defconfig b/app/boards/shields/zmk_uno/Kconfig.defconfig new file mode 100644 index 00000000..11c63a5a --- /dev/null +++ b/app/boards/shields/zmk_uno/Kconfig.defconfig @@ -0,0 +1,23 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_ZMK_UNO + +config ZMK_KEYBOARD_NAME + default "ZMK Uno" + +config ZMK_BACKLIGHT + select LED + select LED_GPIO + +config SHIELD_SSD1306_128X64 + select ZMK_DISPLAY + +config SHIELD_SSD1306_128X32 + select ZMK_DISPLAY + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +endif diff --git a/app/boards/shields/zmk_uno/Kconfig.shield b/app/boards/shields/zmk_uno/Kconfig.shield new file mode 100644 index 00000000..3f7331c3 --- /dev/null +++ b/app/boards/shields/zmk_uno/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_ZMK_UNO + def_bool $(shields_list_contains,zmk_uno) diff --git a/app/boards/shields/zmk_uno/zmk_uno.conf b/app/boards/shields/zmk_uno/zmk_uno.conf new file mode 100644 index 00000000..cf282bac --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.conf @@ -0,0 +1,18 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_LOG=y +CONFIG_ZMK_LOG_LEVEL_DBG=y + +# Uncomment for Single color backlight +# CONFIG_ZMK_BACKLIGHT=y + +# Uncomment for RGB +# CONFIG_ZMK_RGB_UNDERGLOW=y + +# Uncomment for Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment these two lines to enable encoder support +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap new file mode 100644 index 00000000..7ab2632a --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include +#include + +// Uncomment the following block if using the "Direct Wire" jumper to switch the matrix to a direct wire. + +/* :REMOVE ME + +&kscan_direct_comp { status = "okay"; }; +&kscan_direct { status = "okay"; }; +&kscan_matrix_comp { status = "disabled"; }; +&kscan_matrix { status = "disabled"; }; + +/ { + chosen { + zmk,matrix-transform = &direct_matrix_transform; + zmk,kscan = &kscan_direct_comp; + }; +}; + +REMOVE ME: */ + + +/ { + macros { + ZMK_MACRO(ble_zero, + wait-ms = <1>; + tap-ms = <1>; + bindings = <&out OUT_BLE &bt BT_SEL 0>; + ) + ZMK_MACRO(ble_one, + wait-ms = <1>; + tap-ms = <1>; + bindings = <&out OUT_BLE &bt BT_SEL 1>; + ) + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + bindings = < + &kp A &bl BL_TOG + &rgb_ug RGB_EFF &bt BT_CLR + + &out OUT_USB &ble_zero &ble_one + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; +}; diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay new file mode 100644 index 00000000..f10d18af --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +&arduino_i2c { + status = "okay"; +}; + +&arduino_spi { + status = "okay"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "RGB"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,kscan = &kscan_matrix_comp; + zmk,backlight = &backlight; + zmk,underglow = &led_strip; + zmk,matrix-transform = &matrix_transform; + }; + + // Commented out until we add more powerful power domain support + // external_power { + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // }; + + rgb_power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + // label = "RGB_POWER"; + init-delay-ms = <200>; + control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + }; + + backlight: gpioleds { + compatible = "gpio-leds"; + label = "Backlight LEDs"; + gpio_led_0 { + gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + }; + + matrix_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; + + map = < + RC(0,0) RC(0,1) + RC(1,0) RC(1,1) + RC(2,0) RC(2,1) RC(2,2) + >; + }; + + direct_matrix_transform: direct_matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; + + map = < + RC(0,0) RC(0,1) + RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) + >; + }; + + kscan_matrix_comp: kscan_matrix_comp { + compatible = "zmk,kscan-composite"; + rows = <1>; + columns = <7>; + + label = "KSCAN_MATRIX_COMP"; + + matrix { + kscan = <&kscan_matrix>; + }; + + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <2>; + }; + + }; + + kscan_direct_comp: kscan_direct_comp { + compatible = "zmk,kscan-composite"; + + label = "KSCAN_DIRECT_COMP"; + status = "disabled"; + + matrix { + kscan = <&kscan_direct>; + }; + + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <1>; + }; + + }; + + kscan_matrix: kscan_matrix { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN_MATRIX"; + + diode-direction = "col2row"; + + col-gpios + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + }; + + kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + status = "disabled"; + + label = "KSCAN_DIRECT"; + + input-gpios + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + + }; + + kscan_sp3t_toggle: kscan_sp3t_toggle { + compatible = "zmk,kscan-gpio-direct"; + toggle-mode; + + label = "KSCAN_TOGGLE"; + + input-gpios + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; + + encoder: encoder { + label = "ENCODER"; + resolution = <4>; + compatible = "alps,ec11"; + a-gpios = <&arduino_header 14 GPIO_PULL_UP>; + b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; + +}; diff --git a/app/boards/shields/zmk_uno/zmk_uno.zmk.yml b/app/boards/shields/zmk_uno/zmk_uno.zmk.yml new file mode 100644 index 00000000..cee108fa --- /dev/null +++ b/app/boards/shields/zmk_uno/zmk_uno.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: zmk_uno +name: ZMK Uno +type: shield +url: https://github.com/zmkfirmware/zmk-uno +requires: [arduino_uno] +features: + - keys + - encoder + - display From 2b235ae281e886afde8aad968dd768cd9e71718a Mon Sep 17 00:00:00 2001 From: Pavlos Vinieratos Date: Sun, 11 Dec 2022 01:33:50 +0000 Subject: [PATCH 244/494] fix(boards): Add encoder config to bdn9_rev2.conf --- app/boards/arm/bdn9/bdn9_rev2.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/boards/arm/bdn9/bdn9_rev2.conf b/app/boards/arm/bdn9/bdn9_rev2.conf index 36910853..f6506a06 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.conf +++ b/app/boards/arm/bdn9/bdn9_rev2.conf @@ -1,5 +1,9 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT +# Uncomment these lines below to enable encoders. +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + # Uncomment the line below to enable RGB. # CONFIG_ZMK_RGB_UNDERGLOW=y From 36ee1f4e0a7f28c9df150dfd731142eb039bb798 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 10 Dec 2022 21:50:57 -0600 Subject: [PATCH 245/494] fix(boards): Fix nRF5340 DK issues - Fixed a stack overflow when enabling Bluetooth. - Increased the I2C buffer size to support displays. --- app/boards/nrf5340dk_nrf5340_cpuapp.conf | 3 ++- app/boards/nrf5340dk_nrf5340_cpuapp.overlay | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 app/boards/nrf5340dk_nrf5340_cpuapp.overlay diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.conf b/app/boards/nrf5340dk_nrf5340_cpuapp.conf index a40195e3..ccb0ddba 100644 --- a/app/boards/nrf5340dk_nrf5340_cpuapp.conf +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.conf @@ -11,5 +11,6 @@ CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y -# Default main stack size is too small for HCI RPMsg +# Default main and BLE stack sizes are too small for HCI RPMsg CONFIG_MAIN_STACK_SIZE=2048 +CONFIG_ZMK_BLE_THREAD_STACK_SIZE=1024 diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay new file mode 100644 index 00000000..66d2332f --- /dev/null +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +&arduino_i2c { + // Default buffer size is too small for use with displays. + zephyr,concat-buf-size = <512>; +}; From 70aa4fa82456ab6a739c43aae36815804cb58d51 Mon Sep 17 00:00:00 2001 From: Kyle McCreery Date: Sat, 10 Dec 2022 23:01:37 -0500 Subject: [PATCH 246/494] feat(boards): Add PillBug board, blackpill interconnect. * Add blackbill interconnect metadata. * Add config/overlay for upstream blackpill boards to work with ZMK. * Add pillbug board. * Updated new shield docs. Co-authored-by: Cem Aksoylar --- .../blackpill_f401ce/blackpill_f401ce.zmk.yml | 9 ++ .../blackpill_f411ce/blackpill_f411ce.zmk.yml | 9 ++ app/boards/arm/pillbug/Kconfig | 7 + app/boards/arm/pillbug/Kconfig.board | 6 + app/boards/arm/pillbug/Kconfig.defconfig | 25 ++++ app/boards/arm/pillbug/blackpill_pins.dtsi | 50 +++++++ app/boards/arm/pillbug/board.cmake | 6 + app/boards/arm/pillbug/pillbug.dts | 132 ++++++++++++++++++ app/boards/arm/pillbug/pillbug.yaml | 15 ++ app/boards/arm/pillbug/pillbug.zmk.yml | 10 ++ app/boards/arm/pillbug/pillbug_defconfig | 22 +++ app/boards/blackpill_f401ce.conf | 7 + app/boards/blackpill_f401ce.overlay | 51 +++++++ app/boards/blackpill_f411ce.conf | 7 + app/boards/blackpill_f411ce.overlay | 51 +++++++ .../interconnects/blackpill/blackpill.zmk.yml | 8 ++ .../blackpill/blackpill-pins-labelled.png | Bin 0 -> 924160 bytes docs/docs/development/new-shield.md | 24 ++++ 18 files changed, 439 insertions(+) create mode 100644 app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml create mode 100644 app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml create mode 100644 app/boards/arm/pillbug/Kconfig create mode 100644 app/boards/arm/pillbug/Kconfig.board create mode 100644 app/boards/arm/pillbug/Kconfig.defconfig create mode 100644 app/boards/arm/pillbug/blackpill_pins.dtsi create mode 100644 app/boards/arm/pillbug/board.cmake create mode 100644 app/boards/arm/pillbug/pillbug.dts create mode 100644 app/boards/arm/pillbug/pillbug.yaml create mode 100644 app/boards/arm/pillbug/pillbug.zmk.yml create mode 100644 app/boards/arm/pillbug/pillbug_defconfig create mode 100644 app/boards/blackpill_f401ce.conf create mode 100644 app/boards/blackpill_f401ce.overlay create mode 100644 app/boards/blackpill_f411ce.conf create mode 100644 app/boards/blackpill_f411ce.overlay create mode 100644 app/boards/interconnects/blackpill/blackpill.zmk.yml create mode 100644 docs/docs/assets/blackpill/blackpill-pins-labelled.png diff --git a/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml b/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml new file mode 100644 index 00000000..251d2c27 --- /dev/null +++ b/app/boards/arm/blackpill_f401ce/blackpill_f401ce.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: blackpill_f401ce +name: BlackPill F401CE +type: board +arch: arm +outputs: + - usb +url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 +exposes: [blackpill] diff --git a/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml b/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml new file mode 100644 index 00000000..eaa714d6 --- /dev/null +++ b/app/boards/arm/blackpill_f411ce/blackpill_f411ce.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: blackpill_f411ce +name: BlackPill F411CE +type: board +arch: arm +outputs: + - usb +url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 +exposes: [blackpill] diff --git a/app/boards/arm/pillbug/Kconfig b/app/boards/arm/pillbug/Kconfig new file mode 100644 index 00000000..3d53e324 --- /dev/null +++ b/app/boards/arm/pillbug/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_PILLBUG) diff --git a/app/boards/arm/pillbug/Kconfig.board b/app/boards/arm/pillbug/Kconfig.board new file mode 100644 index 00000000..70232e18 --- /dev/null +++ b/app/boards/arm/pillbug/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_PILLBUG + bool "PillBug" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/pillbug/Kconfig.defconfig b/app/boards/arm/pillbug/Kconfig.defconfig new file mode 100644 index 00000000..8657f8ae --- /dev/null +++ b/app/boards/arm/pillbug/Kconfig.defconfig @@ -0,0 +1,25 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_PILLBUG + +config BOARD + default "PillBug" + +if USB_DEVICE_STACK + +config USB_NRFX + default y + +endif # USB_DEVICE_STACK + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +endif # BOARD_PILLBUG diff --git a/app/boards/arm/pillbug/blackpill_pins.dtsi b/app/boards/arm/pillbug/blackpill_pins.dtsi new file mode 100644 index 00000000..e7e35140 --- /dev/null +++ b/app/boards/arm/pillbug/blackpill_pins.dtsi @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022 Kyle McCreery + * + * SPDX-License-Identifier: MIT + */ + +/ { + blackpill: connector { + compatible = "blackpill"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <2 0 &gpio0 9 0> /* PC13 */ + , <3 0 &gpio0 10 0> /* PC14 */ + , <4 0 &gpio1 6 0> /* PC15 */ + , <10 0 &gpio0 25 0> /* PA0 */ + , <11 0 &gpio0 5 0> /* PA1 */ + , <12 0 &gpio1 15 0> /* PA2 */ + , <13 0 &gpio0 2 0> /* PA3 */ + , <14 0 &gpio1 11 0> /* PA4 */ + , <15 0 &gpio1 8 0> /* PA5 */ + , <16 0 &gpio0 26 0> /* PA6 */ + , <17 0 &gpio0 11 0> /* PA7 */ + , <18 0 &gpio1 9 0> /* PB0 */ + , <19 0 &gpio1 14 0> /* PB1 */ + , <20 0 &gpio0 3 0> /* PB2 */ + , <21 0 &gpio0 31 0> /* PB10 */ + , <25 0 &gpio0 12 0> /* PB12 */ + , <26 0 &gpio0 19 0> /* PB13 */ + , <27 0 &gpio1 1 0> /* PB14 */ + , <28 0 &gpio0 29 0> /* PB15 */ + , <29 0 &gpio1 13 0> /* PA8 */ + , <30 0 &gpio0 6 0> /* PA9 */ + , <31 0 &gpio0 8 0> /* PA10 */ + , <38 0 &gpio1 0 0> /* PA15 */ + , <39 0 &gpio1 10 0> /* PB3 */ + , <40 0 &gpio1 2 0> /* PB4 */ + , <41 0 &gpio1 4 0> /* PB5 */ + , <42 0 &gpio0 13 0> /* PB6 */ + , <43 0 &gpio0 15 0> /* PB7 */ + , <45 0 &gpio0 17 0> /* PB8 */ + , <46 0 &gpio0 24 0> /* PB9 */ + ; + }; +}; + +blackpill_i2c: &i2c0 {}; +blackpill_spi: &spi1 {}; +blackpill_serial: &uart0 {}; diff --git a/app/boards/arm/pillbug/board.cmake b/app/boards/arm/pillbug/board.cmake new file mode 100644 index 00000000..992f395d --- /dev/null +++ b/app/boards/arm/pillbug/board.cmake @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: MIT + +set(OPENOCD_NRF5_SUBFAMILY nrf52) +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts new file mode 100644 index 00000000..85c5cccd --- /dev/null +++ b/app/boards/arm/pillbug/pillbug.dts @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; + +#include +#include "blackpill_pins.dtsi" + +/ { + model = "PillBug"; + compatible = "pillbug"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; + label = "Blue LED"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; + init-delay-ms = <50>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <15>; + scl-pin = <13>; +}; + +&spi1{ + status = "disabled"; + compatible = "nordic,nrf-spim"; + sck-pin = <40>; + mosi-pin = <11>; + miso-pin = <26>; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; + + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; + + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; diff --git a/app/boards/arm/pillbug/pillbug.yaml b/app/boards/arm/pillbug/pillbug.yaml new file mode 100644 index 00000000..50aa4486 --- /dev/null +++ b/app/boards/arm/pillbug/pillbug.yaml @@ -0,0 +1,15 @@ +identifier: pillbug +name: PillBug +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/pillbug/pillbug.zmk.yml b/app/boards/arm/pillbug/pillbug.zmk.yml new file mode 100644 index 00000000..5df11b9e --- /dev/null +++ b/app/boards/arm/pillbug/pillbug.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: pillbug +name: PillBug +type: board +arch: arm +outputs: + - usb + - ble +url: https://mechwild.com/product/pillbug +exposes: [blackpill] diff --git a/app/boards/arm/pillbug/pillbug_defconfig b/app/boards/arm/pillbug/pillbug_defconfig new file mode 100644 index 00000000..d71d9f62 --- /dev/null +++ b/app/boards/arm/pillbug/pillbug_defconfig @@ -0,0 +1,22 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_PILLBUG=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y diff --git a/app/boards/blackpill_f401ce.conf b/app/boards/blackpill_f401ce.conf new file mode 100644 index 00000000..07e304cf --- /dev/null +++ b/app/boards/blackpill_f401ce.conf @@ -0,0 +1,7 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=n +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/blackpill_f401ce.overlay b/app/boards/blackpill_f401ce.overlay new file mode 100644 index 00000000..54e360a3 --- /dev/null +++ b/app/boards/blackpill_f401ce.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + blackpill: connector { + compatible = "blackpill"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <2 0 &gpioc 13 0> /* PC13 */ + , <3 0 &gpioc 14 0> /* PC14 */ + , <4 0 &gpioc 15 0> /* PC15 */ + , <10 0 &gpioa 0 0> /* PA0 */ + , <11 0 &gpioa 1 0> /* PA1 */ + , <12 0 &gpioa 2 0> /* PA2 */ + , <13 0 &gpioa 3 0> /* PA3 */ + , <14 0 &gpioa 4 0> /* PA4 */ + , <15 0 &gpioa 5 0> /* PA5 */ + , <16 0 &gpioa 6 0> /* PA6 */ + , <17 0 &gpioa 7 0> /* PA7 */ + , <18 0 &gpiob 0 0> /* PB0 */ + , <19 0 &gpiob 1 0> /* PB1 */ + , <20 0 &gpiob 2 0> /* PB2 */ + , <21 0 &gpiob 10 0> /* PB10 */ + , <25 0 &gpiob 12 0> /* PB12 */ + , <26 0 &gpiob 13 0> /* PB13 */ + , <27 0 &gpiob 14 0> /* PB14 */ + , <28 0 &gpiob 15 0> /* PB15 */ + , <29 0 &gpioa 8 0> /* PA8 */ + , <30 0 &gpioa 9 0> /* PA9 */ + , <31 0 &gpioa 10 0> /* PA10 */ + , <38 0 &gpioa 15 0> /* PA15 */ + , <39 0 &gpiob 3 0> /* PB3 */ + , <40 0 &gpiob 4 0> /* PB4 */ + , <41 0 &gpiob 5 0> /* PB5 */ + , <42 0 &gpiob 6 0> /* PB6 */ + , <43 0 &gpiob 7 0> /* PB7 */ + , <45 0 &gpiob 8 0> /* PB8 */ + , <46 0 &gpiob 9 0> /* PB9 */ + ; + }; +}; + +blackpill_i2c: &i2c1 {}; +blackpill_spi: &spi1 {}; +blackpill_serial: &usart1 {}; diff --git a/app/boards/blackpill_f411ce.conf b/app/boards/blackpill_f411ce.conf new file mode 100644 index 00000000..07e304cf --- /dev/null +++ b/app/boards/blackpill_f411ce.conf @@ -0,0 +1,7 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=n +CONFIG_ZMK_KSCAN_MATRIX_POLLING=y diff --git a/app/boards/blackpill_f411ce.overlay b/app/boards/blackpill_f411ce.overlay new file mode 100644 index 00000000..54e360a3 --- /dev/null +++ b/app/boards/blackpill_f411ce.overlay @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + blackpill: connector { + compatible = "blackpill"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <2 0 &gpioc 13 0> /* PC13 */ + , <3 0 &gpioc 14 0> /* PC14 */ + , <4 0 &gpioc 15 0> /* PC15 */ + , <10 0 &gpioa 0 0> /* PA0 */ + , <11 0 &gpioa 1 0> /* PA1 */ + , <12 0 &gpioa 2 0> /* PA2 */ + , <13 0 &gpioa 3 0> /* PA3 */ + , <14 0 &gpioa 4 0> /* PA4 */ + , <15 0 &gpioa 5 0> /* PA5 */ + , <16 0 &gpioa 6 0> /* PA6 */ + , <17 0 &gpioa 7 0> /* PA7 */ + , <18 0 &gpiob 0 0> /* PB0 */ + , <19 0 &gpiob 1 0> /* PB1 */ + , <20 0 &gpiob 2 0> /* PB2 */ + , <21 0 &gpiob 10 0> /* PB10 */ + , <25 0 &gpiob 12 0> /* PB12 */ + , <26 0 &gpiob 13 0> /* PB13 */ + , <27 0 &gpiob 14 0> /* PB14 */ + , <28 0 &gpiob 15 0> /* PB15 */ + , <29 0 &gpioa 8 0> /* PA8 */ + , <30 0 &gpioa 9 0> /* PA9 */ + , <31 0 &gpioa 10 0> /* PA10 */ + , <38 0 &gpioa 15 0> /* PA15 */ + , <39 0 &gpiob 3 0> /* PB3 */ + , <40 0 &gpiob 4 0> /* PB4 */ + , <41 0 &gpiob 5 0> /* PB5 */ + , <42 0 &gpiob 6 0> /* PB6 */ + , <43 0 &gpiob 7 0> /* PB7 */ + , <45 0 &gpiob 8 0> /* PB8 */ + , <46 0 &gpiob 9 0> /* PB9 */ + ; + }; +}; + +blackpill_i2c: &i2c1 {}; +blackpill_spi: &spi1 {}; +blackpill_serial: &usart1 {}; diff --git a/app/boards/interconnects/blackpill/blackpill.zmk.yml b/app/boards/interconnects/blackpill/blackpill.zmk.yml new file mode 100644 index 00000000..d3fcdc88 --- /dev/null +++ b/app/boards/interconnects/blackpill/blackpill.zmk.yml @@ -0,0 +1,8 @@ +file_format: "1" +id: blackpill +name: BlackPill +type: interconnect +url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 +manufacturer: WeAct Studio +description: | + The WeAct Studio BlackPill has grown in popularity due to its low price, availability, and utilization of the powerful STM32F4x1CEU6 microcontroller. The BlackPill features more GPIO than most other boards, but also has a comparatively larger footprint as a result. Many clones and variations of the original BlackPill are available on the market as an affordable and more powerful alternative to many popular boards. The official WeAct variations of the WeAct Studio BlackPill are powered by the STM32F411CEU6 and STM32F401CEU6 microcontrollers. diff --git a/docs/docs/assets/blackpill/blackpill-pins-labelled.png b/docs/docs/assets/blackpill/blackpill-pins-labelled.png new file mode 100644 index 0000000000000000000000000000000000000000..3f15c620d208ef058c5b094a81272aa2d90199df GIT binary patch literal 924160 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�-?M$f@0qbx$xrRIC{--@kgRo!}qItL}@)+UkH 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

<#4Q03z;=HZ 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∨LABwyc0Rs{g-9 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Ðee>^M?pR)WpWZtl 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

uudHOEosX9wVI3IBQuN05Bg>Wrq|F8wV97< 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�JlQdU`^AwjRq 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 + + + +### Pro Micro Shields + ![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `0` in the devicetree files, use `&pro_micro 0`. + + + + +### BlackPill Shields + +![Labelled BlackPill pins](../assets/blackpill/blackpill-pins-labelled.png) + +ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `17` in the devicetree files, use `&blackpill 17`. + + + + Date: Sat, 10 Dec 2022 22:21:54 -0600 Subject: [PATCH 247/494] fix(boards): Add nRF5340 DK metadata file (#1579) --- .../nrf5340dk_nrf5340_cpuapp.zmk.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml diff --git a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml new file mode 100644 index 00000000..c8472428 --- /dev/null +++ b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: nrf5340dk_nrf5340_cpuapp +name: Nordic nRF3840 DK +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.nordicsemi.com/Products/Development-hardware/nrf5340-dk +exposes: [arduino_uno] From 617136b45eac0d2b4cb2bd4f24c8412faacbefba Mon Sep 17 00:00:00 2001 From: JW2586 <70282382+JW2586@users.noreply.github.com> Date: Sun, 11 Dec 2022 04:51:41 +0000 Subject: [PATCH 248/494] feat(shields): Added Waterfowl shield --- .../shields/waterfowl/Kconfig.defconfig | 47 ++++++++ app/boards/shields/waterfowl/Kconfig.shield | 9 ++ app/boards/shields/waterfowl/waterfowl.conf | 6 + app/boards/shields/waterfowl/waterfowl.dtsi | 85 +++++++++++++ app/boards/shields/waterfowl/waterfowl.keymap | 112 ++++++++++++++++++ .../shields/waterfowl/waterfowl.zmk.yml | 14 +++ .../shields/waterfowl/waterfowl_left.conf | 2 + .../shields/waterfowl/waterfowl_left.overlay | 21 ++++ .../shields/waterfowl/waterfowl_right.conf | 2 + .../shields/waterfowl/waterfowl_right.overlay | 26 ++++ 10 files changed, 324 insertions(+) create mode 100644 app/boards/shields/waterfowl/Kconfig.defconfig create mode 100644 app/boards/shields/waterfowl/Kconfig.shield create mode 100644 app/boards/shields/waterfowl/waterfowl.conf create mode 100644 app/boards/shields/waterfowl/waterfowl.dtsi create mode 100644 app/boards/shields/waterfowl/waterfowl.keymap create mode 100644 app/boards/shields/waterfowl/waterfowl.zmk.yml create mode 100644 app/boards/shields/waterfowl/waterfowl_left.conf create mode 100644 app/boards/shields/waterfowl/waterfowl_left.overlay create mode 100644 app/boards/shields/waterfowl/waterfowl_right.conf create mode 100644 app/boards/shields/waterfowl/waterfowl_right.overlay diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig new file mode 100644 index 00000000..897184f6 --- /dev/null +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -0,0 +1,47 @@ + +if SHIELD_WATERFOWL_LEFT + +config ZMK_KEYBOARD_NAME + default "Waterfowl" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + +if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT + +config ZMK_SPLIT + default y + +if ZMK_DISPLAY + +config I2C + default y + +config SSD1306 + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif diff --git a/app/boards/shields/waterfowl/Kconfig.shield b/app/boards/shields/waterfowl/Kconfig.shield new file mode 100644 index 00000000..a321b73d --- /dev/null +++ b/app/boards/shields/waterfowl/Kconfig.shield @@ -0,0 +1,9 @@ +#Copyright (c) 2022 The ZMK Contributors +#SPDX-License-Identifier: MIT + + +config SHIELD_WATERFOWL_LEFT + def_bool $(shields_list_contains,waterfowl_left) + +config SHIELD_WATERFOWL_RIGHT + def_bool $(shields_list_contains,waterfowl_right) diff --git a/app/boards/shields/waterfowl/waterfowl.conf b/app/boards/shields/waterfowl/waterfowl.conf new file mode 100644 index 00000000..449e0b1f --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.conf @@ -0,0 +1,6 @@ +# Uncomment these two line to add support for encoders to your firmware +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Waterfowl OLED Display +# CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi new file mode 100644 index 00000000..c21dcf07 --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; +// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | +// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | +// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | +// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + }; + + left_encoder: encoder_left { //roller + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; + + right_encoder: encoder_right { //Standard encoder on left half + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; + + // TODO: RGB node(s) +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap new file mode 100644 index 00000000..9a1dabac --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +/* QWERTY + * + * ,----------------------------------. ,----------------------------------. + * | Q | W | E | R | T | | Y | U | I | O | P | + * |------+------+------+------+------| |------+------+------+------+------| + * | A | S | D | F | G | | H | J | K | L | ; | + * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| + * | Z | X | C | V | B | | 2 | | 3 | | N | M | , | . | / | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + navnum_layer { +/* NAVNUM + * + * ,----------------------------------. ,----------------------------------. + * | | PgUp | UP | PgDn | | | / | 7 | 8 | 9 | - | + * |------+------+------+------+------| |------+------+------+------+------| + * | Home | Left | Down | Right| End | | = | 4 | 5 | 6 | + | + * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| + * | | | INS | | | | 2 | | 3 | | 0 | 1 | 2 | 3 | * | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS + &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS + &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + symbol_layer { +/* SYM + * + * ,----------------------------------. ,----------------------------------. + * | % | @ | [ | ] | \ | | | | ^ | | | + * |------+------+------+------+------| |------+------+------+------+------| + * | # | ! | ( | ) | | | | _ | ' | " | ~ | ` | + * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| + * | $ | | { | } | & | | 2 | | 3 | | | | | | | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans + &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE + &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + function_layer { +/* FUNC + * + * ,----------------------------------. ,----------------------------------. + * | | | BTCLR| | Reset| | Reset| F7 | F8 | F9 | F11 | + * |------+------+------+------+------| |------+------+------+------+------| + * | BT0 | BT1 | BT2 | BT3 | BT4 | | | F4 | F5 | F6 | F12 | + * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| + * | | | | | | | 2 | | 3 | | F10 | F1 | F2 | F3 | F13 | + * `----------------------------------' `-----' `-----' `----------------------------------' + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * `-----' `--------------------' `--------------------' `-----' + */ + bindings = < + &trans &trans &bt BT_CLR &trans &reset &reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; + + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; + + }; +}; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl.zmk.yml b/app/boards/shields/waterfowl/waterfowl.zmk.yml new file mode 100644 index 00000000..3cd48686 --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: waterfowl +name: Waterfowl +type: shield +url: https://waterfowl.bio.link/ +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder +siblings: + - waterfowl_left + - waterfowl_right diff --git a/app/boards/shields/waterfowl/waterfowl_left.conf b/app/boards/shields/waterfowl/waterfowl_left.conf new file mode 100644 index 00000000..2f561d0d --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_left.conf @@ -0,0 +1,2 @@ +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl_left.overlay b/app/boards/shields/waterfowl/waterfowl_left.overlay new file mode 100644 index 00000000..031936ea --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_left.overlay @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "waterfowl.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; diff --git a/app/boards/shields/waterfowl/waterfowl_right.conf b/app/boards/shields/waterfowl/waterfowl_right.conf new file mode 100644 index 00000000..2f561d0d --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_right.conf @@ -0,0 +1,2 @@ +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl_right.overlay b/app/boards/shields/waterfowl/waterfowl_right.overlay new file mode 100644 index 00000000..cff0d53c --- /dev/null +++ b/app/boards/shields/waterfowl/waterfowl_right.overlay @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "waterfowl.dtsi" + +&default_transform { + col-offset = <5>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; +}; + + +&right_encoder { + status = "okay"; +}; From f03e29ca135fb41644cbae40b9233ba7adce4153 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 11 Dec 2022 10:25:09 -0500 Subject: [PATCH 249/494] fix(config): Fix split wired detection in setup.sh. --- docs/src/templates/setup.sh.mustache | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index a8a2da22..3184aab2 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -136,12 +136,13 @@ if [ "$keyboard_shield" == "y" ]; then continue fi + board_index=$(( $REPLY-1 )) + if [ -n "${!keyboard_sibling_first}" ] && [ "${boards_usb_only[$board_index]}" = "y" ] ; then echo "Wired split is not yet supported by ZMK." exit 1 fi - board_index=$(( $REPLY-1 )) board=${board_ids[$board_index]} board_title=${options[$board_index]} boards=( "${board}" ) From 1425d0f2d9b81c630d8daabef35e3c8489ebb295 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 13 Dec 2022 21:08:54 -0500 Subject: [PATCH 250/494] fix(shields): Fix col-offset for splitkb.com corne Same column offset for both transforms, since we use the same pins for both, just apply a different transform. Fixes: 1570 --- .../splitkb_aurora_corne/splitkb_aurora_corne_right.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index b4c4b438..34330400 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -40,7 +40,7 @@ }; &default_transform { - col-offset = <5>; + col-offset = <6>; }; &five_column_transform { From 408b87ae7b9a5d3bf1040e0e228c4750c4c4e0ca Mon Sep 17 00:00:00 2001 From: Petrus Claviger Date: Wed, 14 Dec 2022 15:51:46 +0100 Subject: [PATCH 251/494] fix(docs): Grammatical fixes (#1587) Co-authored-by: Dom H --- docs/docs/behaviors/bluetooth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/bluetooth.md b/docs/docs/behaviors/bluetooth.md index d21f3832..7c77c4ad 100644 --- a/docs/docs/behaviors/bluetooth.md +++ b/docs/docs/behaviors/bluetooth.md @@ -75,7 +75,7 @@ The bluetooth behavior completes an bluetooth action given on press. ZMK support bluetooth “profiles” which allows connection to multiple devices (5 by default). Each profile stores the bluetooth MAC address of a peer, which can be empty if a profile has not been paired with a device yet. Upon switching to a profile, ZMK does the following: -- If a profile has not been paired with a peer yet, ZMK automatically advertise itself as connectable. You can discover you keyboard from bluetooth scanning on your laptop / tablet. If you try to connect, it will trigger the _pairing_ procedure. After pairing, the bluetooth MAC address of the peer device will be stored in the current profile. Pairing also negotiate a random key for secure communication between the device and the keyboard. +- If a profile has not been paired with a peer yet, ZMK automatically advertises itself as connectable. You can discover your keyboard from bluetooth scanning on your laptop / tablet. If you try to connect, it will trigger the _pairing_ procedure. After pairing, the bluetooth MAC address of the peer device will be stored in the current profile. Pairing also negotiates a random key for secure communication between the device and the keyboard. - If a profile has been paired but the peer is not connected yet, ZMK will also advertise itself as connectable. In the future, the behavior might change to _direct advertising_ which only target the peer with the stored bluetooth MAC address. In this state, if the peer is powered on and moved within the distance of bluetooth signal coverage, it should automatically connect to the keyboard. - If a profile has been paired and is currently connected, ZMK will not advertise it as connectable. From 4faf6eba97d91e8d9ec5fdbfb7b3a637228cc32d Mon Sep 17 00:00:00 2001 From: hyx0329 Date: Wed, 14 Dec 2022 17:02:04 +0800 Subject: [PATCH 252/494] feat(boards): Add battery sensor for Makerdiary M60 keyboard Signed-off-by: hyx0329 --- app/boards/arm/nrf52840_m2/nrf52840_m2.dts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts index 5ea852e9..dc22c40b 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -16,6 +16,7 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; }; leds { @@ -34,6 +35,14 @@ }; }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 1000000)>; + }; + }; &adc { From 984b16e03bfbaf74c61061fc6489aee5b861c1f8 Mon Sep 17 00:00:00 2001 From: Jerome Olivier <33301870+jeromeOlivier@users.noreply.github.com> Date: Fri, 16 Dec 2022 11:52:26 -0500 Subject: [PATCH 253/494] feat(boards): Add preonic_rev3 board. --- app/boards/arm/preonic/CMakeLists.txt | 4 + app/boards/arm/preonic/Kconfig.board | 8 + app/boards/arm/preonic/Kconfig.defconfig | 17 +++ app/boards/arm/preonic/board.cmake | 7 + app/boards/arm/preonic/preonic_rev3.dts | 139 ++++++++++++++++++ app/boards/arm/preonic/preonic_rev3.keymap | 65 ++++++++ app/boards/arm/preonic/preonic_rev3.yaml | 19 +++ app/boards/arm/preonic/preonic_rev3.zmk.yml | 10 ++ app/boards/arm/preonic/preonic_rev3_defconfig | 15 ++ 9 files changed, 284 insertions(+) create mode 100644 app/boards/arm/preonic/CMakeLists.txt create mode 100644 app/boards/arm/preonic/Kconfig.board create mode 100644 app/boards/arm/preonic/Kconfig.defconfig create mode 100644 app/boards/arm/preonic/board.cmake create mode 100644 app/boards/arm/preonic/preonic_rev3.dts create mode 100644 app/boards/arm/preonic/preonic_rev3.keymap create mode 100644 app/boards/arm/preonic/preonic_rev3.yaml create mode 100644 app/boards/arm/preonic/preonic_rev3.zmk.yml create mode 100644 app/boards/arm/preonic/preonic_rev3_defconfig diff --git a/app/boards/arm/preonic/CMakeLists.txt b/app/boards/arm/preonic/CMakeLists.txt new file mode 100644 index 00000000..91bd0988 --- /dev/null +++ b/app/boards/arm/preonic/CMakeLists.txt @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MIT + +list(APPEND EXTRA_DTC_FLAGS "-qq") + diff --git a/app/boards/arm/preonic/Kconfig.board b/app/boards/arm/preonic/Kconfig.board new file mode 100644 index 00000000..a930b90f --- /dev/null +++ b/app/boards/arm/preonic/Kconfig.board @@ -0,0 +1,8 @@ +# Preonic V3 board configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_PREONIC_REV3 + bool "Preonic V3 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/preonic/Kconfig.defconfig b/app/boards/arm/preonic/Kconfig.defconfig new file mode 100644 index 00000000..186c88bc --- /dev/null +++ b/app/boards/arm/preonic/Kconfig.defconfig @@ -0,0 +1,17 @@ +# Preonic keyboard configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_PREONIC_REV3 + +config ZMK_KEYBOARD_NAME + default "Preonic V3" + +config ZMK_USB + default y + +config ZMK_KSCAN_MATRIX_POLLING + default y + +endif # BOARD_PREONIC_REV3 diff --git a/app/boards/arm/preonic/board.cmake b/app/boards/arm/preonic/board.cmake new file mode 100644 index 00000000..772796da --- /dev/null +++ b/app/boards/arm/preonic/board.cmake @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse") +board_runner_args(jlink "--device=STM32F303VC" "--speed=4000") + +include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/app/boards/arm/preonic/preonic_rev3.dts b/app/boards/arm/preonic/preonic_rev3.dts new file mode 100644 index 00000000..c19b1319 --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.dts @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include + + +/ { + model = "Preonic PCD, rev3"; + compatible = "preonic,rev3", "st,stm32f303"; + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,matrix_transform = &layout_grid_transform; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + row-gpios + = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpiob 11 GPIO_ACTIVE_HIGH> + , <&gpiob 10 GPIO_ACTIVE_HIGH> + , <&gpiob 2 GPIO_ACTIVE_HIGH> + , <&gpiob 1 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + ; + }; + + layout_grid_transform: + keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <10>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) RC(7,5) + RC(8,0) RC(8,1) RC(8,2) RC(9,3) RC(9,4) RC(9,5) RC(9,0) RC(9,1) RC(9,2) RC(8,3) RC(8,4) RC(8,5) + >; + }; + + layout_mit_transform: + keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <10>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) RC(7,5) + RC(8,0) RC(8,1) RC(8,2) RC(9,3) RC(9,4) RC(9,0) RC(9,1) RC(9,2) RC(8,3) RC(8,4) RC(8,5) + >; + }; + + layout_2x2u_transform: + keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <10>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) RC(7,5) + RC(8,0) RC(8,1) RC(8,2) RC(9,3) RC(9,5) RC(9,1) RC(9,2) RC(8,3) RC(8,4) RC(8,5) + >; + }; +}; + +&usb { + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; +cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&clk_hse { + status = "okay"; + clock-frequency = ; +}; + +&pll { + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; +}; diff --git a/app/boards/arm/preonic/preonic_rev3.keymap b/app/boards/arm/preonic/preonic_rev3.keymap new file mode 100644 index 00000000..350fe6de --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.keymap @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +#define DEFAULT 0 +#define LOWER 1 +#define RAISE 2 + +/ { + chosen { zmk,matrix_transform = &layout_grid_transform; }; + keymap { + compatible = "zmk,keymap"; + default_layer { + // ------------------------------------------------------------------------------------------------- + // | GRAV | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BSPC | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | DEL | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LGUI | LALT | LCTL | LOWER | SPACE | SPACE | RAISE | LEFT | DOWN | UP | RIGHT | + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &none &kp LCTRL &kp LALT &kp LGUI &mo LOWER &kp SPACE &kp SPACE &mo RAISE &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; + lower { + // ------------------------------------------------------------------------------------------ + // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | BSPC | + // | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | DEL | + // | DEL | F1 | F2 | F3 | F4 | F5 | F6 | - | + | [ | ] | | | + // | | F7 | F8 | F9 | F10 | F11 | F12 | | LCTL | HOME | END | | + // | LALT | | | | | | | | NEXT | VOL- | VOL+ | PLAY | + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp BSPC + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp PLUS &kp LEFT_BRACKET &kp RIGHT_BRACKET &kp PIPE + &none &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &none &kp LCTRL &kp HOME &kp END &none + &kp LALT &none &none &none &trans &none &none &none &kp C_NEXT &kp C_VOL_UP &kp C_VOL_UP &kp C_PLAY + >; + }; + raise { + // ------------------------------------------------------------------------------------------- + // | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | BSPC | + // | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | DEL | + // | DEL | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + // | | F7 | F8 | F9 | F10 | F11 | F12 | # | \ | PGUP | PGDN | | + // | | | | | | SHIFT | | | NEXT | VOL- | VOL+ | PLAY | + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp KP_EQUAL &kp LEFT_BRACKET &kp RIGHT_BRACKET &kp BSLH + &none &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &none + &none &none &none &none &none &kp LSHIFT &none &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY + >; + }; + }; +}; diff --git a/app/boards/arm/preonic/preonic_rev3.yaml b/app/boards/arm/preonic/preonic_rev3.yaml new file mode 100644 index 00000000..679e1464 --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.yaml @@ -0,0 +1,19 @@ +identifier: preonic_rev3 +name: PREONICREV3 +type: keyboard +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 40 +supported: + - gpio + - i2c + - counter + - spi + - usb_device + - lsm303dlhc + - nvs + - can + - kscan \ No newline at end of file diff --git a/app/boards/arm/preonic/preonic_rev3.zmk.yml b/app/boards/arm/preonic/preonic_rev3.zmk.yml new file mode 100644 index 00000000..bd9d9579 --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: preonic_rev3 +name: Preonic Rev3 +type: board +arch: arm +features: + - keys +outputs: + - usb +url: https://olkb.com/collections/preonic diff --git a/app/boards/arm/preonic/preonic_rev3_defconfig b/app/boards/arm/preonic/preonic_rev3_defconfig new file mode 100644 index 00000000..ab19d10f --- /dev/null +++ b/app/boards/arm/preonic/preonic_rev3_defconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_STM32F3X=y +CONFIG_SOC_STM32F303XC=y +# 72MHz system clock +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# clock configuration +CONFIG_CLOCK_CONTROL=y From 4a3e783f3212e584e86494db2af8e30f362ecace Mon Sep 17 00:00:00 2001 From: Darryldh Date: Fri, 16 Dec 2022 11:57:25 -0500 Subject: [PATCH 254/494] feat(boards): Add Corne-ish zen v2 Co-authored-by: Pete Johanson --- app/boards/arm/corneish_zen/CMakeLists.txt | 60 ++++++++ app/boards/arm/corneish_zen/Kconfig.board | 12 ++ app/boards/arm/corneish_zen/Kconfig.defconfig | 81 ++++++++++ app/boards/arm/corneish_zen/board.cmake | 5 + app/boards/arm/corneish_zen/corneish_zen.dtsi | 126 ++++++++++++++++ .../arm/corneish_zen/corneish_zen.keymap | 67 +++++++++ app/boards/arm/corneish_zen/corneish_zen.yaml | 20 +++ .../arm/corneish_zen/corneish_zen_v2.yaml | 20 +++ .../arm/corneish_zen/corneish_zen_v2.zmk.yml | 15 ++ .../arm/corneish_zen/corneish_zen_v2_left.dts | 78 ++++++++++ .../corneish_zen_v2_left_defconfig | 91 ++++++++++++ .../corneish_zen/corneish_zen_v2_right.dts | 86 +++++++++++ .../corneish_zen_v2_right_defconfig | 83 +++++++++++ .../arm/corneish_zen/custom_status_screen.c | 85 +++++++++++ .../arm/corneish_zen/custom_status_screen.h | 12 ++ .../arm/corneish_zen/widgets/battery_status.c | 97 ++++++++++++ .../arm/corneish_zen/widgets/battery_status.h | 20 +++ .../corneish_zen/widgets/icons/CMakeLists.txt | 4 + .../widgets/icons/USB_connected.c | 41 ++++++ .../arm/corneish_zen/widgets/icons/batt_0.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_0_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_100.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_100_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_25.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_25_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_5.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_50.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_50_chg.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_5_chg.c | 43 ++++++ .../arm/corneish_zen/widgets/icons/batt_75.c | 43 ++++++ .../corneish_zen/widgets/icons/batt_75_chg.c | 43 ++++++ .../widgets/icons/bluetooth_advertising.c | 42 ++++++ .../widgets/icons/bluetooth_advertising_1.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_2.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_3.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_4.c | 47 ++++++ .../widgets/icons/bluetooth_advertising_5.c | 47 ++++++ .../widgets/icons/bluetooth_connected_1.c | 47 ++++++ .../widgets/icons/bluetooth_connected_2.c | 47 ++++++ .../widgets/icons/bluetooth_connected_3.c | 47 ++++++ .../widgets/icons/bluetooth_connected_4.c | 47 ++++++ .../widgets/icons/bluetooth_connected_5.c | 47 ++++++ .../widgets/icons/bluetooth_connected_right.c | 49 +++++++ .../icons/bluetooth_disconnected_right.c | 49 +++++++ .../arm/corneish_zen/widgets/icons/layers.c | 44 ++++++ .../arm/corneish_zen/widgets/icons/layers2.c | 40 +++++ .../arm/corneish_zen/widgets/icons/zenlogo.c | 58 ++++++++ .../arm/corneish_zen/widgets/layer_status.c | 67 +++++++++ .../arm/corneish_zen/widgets/layer_status.h | 19 +++ .../arm/corneish_zen/widgets/output_status.c | 138 ++++++++++++++++++ .../arm/corneish_zen/widgets/output_status.h | 19 +++ .../corneish_zen/widgets/peripheral_status.c | 61 ++++++++ .../corneish_zen/widgets/peripheral_status.h | 20 +++ app/package-lock.json | 17 ++- app/src/display/Kconfig | 1 - app/src/display/main.c | 8 +- 56 files changed, 2611 insertions(+), 10 deletions(-) create mode 100644 app/boards/arm/corneish_zen/CMakeLists.txt create mode 100644 app/boards/arm/corneish_zen/Kconfig.board create mode 100644 app/boards/arm/corneish_zen/Kconfig.defconfig create mode 100644 app/boards/arm/corneish_zen/board.cmake create mode 100644 app/boards/arm/corneish_zen/corneish_zen.dtsi create mode 100644 app/boards/arm/corneish_zen/corneish_zen.keymap create mode 100644 app/boards/arm/corneish_zen/corneish_zen.yaml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2.yaml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_left.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_right.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig create mode 100644 app/boards/arm/corneish_zen/custom_status_screen.c create mode 100644 app/boards/arm/corneish_zen/custom_status_screen.h create mode 100644 app/boards/arm/corneish_zen/widgets/battery_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/battery_status.h create mode 100644 app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt create mode 100644 app/boards/arm/corneish_zen/widgets/icons/USB_connected.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_0.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_100.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_25.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_5.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_50.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_75.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/layers.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/layers2.c create mode 100644 app/boards/arm/corneish_zen/widgets/icons/zenlogo.c create mode 100644 app/boards/arm/corneish_zen/widgets/layer_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/layer_status.h create mode 100644 app/boards/arm/corneish_zen/widgets/output_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/output_status.h create mode 100644 app/boards/arm/corneish_zen/widgets/peripheral_status.c create mode 100644 app/boards/arm/corneish_zen/widgets/peripheral_status.h diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt new file mode 100644 index 00000000..09820577 --- /dev/null +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -0,0 +1,60 @@ +if(CONFIG_ZMK_DISPLAY) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS app PRIVATE widgets/battery_status.c) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS app PRIVATE widgets/output_status.c) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_LAYER_STATUS app PRIVATE widgets/layer_status.c) + target_sources_ifdef(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS app PRIVATE widgets/peripheral_status.c) + + add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) +endif() + +zephyr_library() + +if(CONFIG_ZMK_DISPLAY) + if(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) + zephyr_library_sources(widgets/icons/batt_100.c) + zephyr_library_sources(widgets/icons/batt_100_chg.c) + zephyr_library_sources(widgets/icons/batt_75.c) + zephyr_library_sources(widgets/icons/batt_75_chg.c) + zephyr_library_sources(widgets/icons/batt_50.c) + zephyr_library_sources(widgets/icons/batt_50_chg.c) + zephyr_library_sources(widgets/icons/batt_25.c) + zephyr_library_sources(widgets/icons/batt_25_chg.c) + zephyr_library_sources(widgets/icons/batt_5.c) + zephyr_library_sources(widgets/icons/batt_5_chg.c) + zephyr_library_sources(widgets/icons/batt_0.c) + zephyr_library_sources(widgets/icons/batt_0_chg.c) + endif() + if(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) + zephyr_library_sources(widgets/icons/bluetooth_advertising.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_right.c) + zephyr_library_sources(widgets/icons/bluetooth_disconnected_right.c) + endif() + if(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) + zephyr_library_sources(widgets/icons/USB_connected.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_1.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_2.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_3.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_4.c) + zephyr_library_sources(widgets/icons/bluetooth_connected_5.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_1.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_2.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_3.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_4.c) + zephyr_library_sources(widgets/icons/bluetooth_advertising_5.c) + zephyr_library_sources(widgets/icons/bluetooth_disconnected_right.c) + endif() + if(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) + zephyr_library_sources(widgets/icons/layers.c) + zephyr_library_sources(widgets/icons/layers2.c) + endif() + if(CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT) + zephyr_library_sources(widgets/icons/zenlogo.c) + endif() +endif() + +zephyr_library_include_directories(${ZEPHYR_LVGL_MODULE_DIR}) +zephyr_library_include_directories(${ZEPHYR_BASE}/lib/gui/lvgl/) +zephyr_library_sources_ifdef(CONFIG_ZMK_DISPLAY custom_status_screen.c) +zephyr_library_sources(${ZEPHYR_BASE}/misc/empty_file.c) +zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board new file mode 100644 index 00000000..33baa110 --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -0,0 +1,12 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_V2_LEFT + bool "corneish zen left v2" + depends on SOC_NRF52840_QIAA + +config BOARD_CORNEISH_ZEN_V2_RIGHT + bool "corneish zen right v2" + depends on SOC_NRF52840_QIAA \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig new file mode 100644 index 00000000..a88cc5ca --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -0,0 +1,81 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +if BOARD_CORNEISH_ZEN_V2_LEFT + +config ZMK_KEYBOARD_NAME + default "Corne-ish Zen" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # BOARD_CORNEISH_ZEN_V2_LEFT + + +if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT + +config BOARD + default "corneish_zen" + +config ZMK_SPLIT + default y + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +config ZMK_DISPLAY + select LVGL_USE_CONT + select LVGL_FONT_MONTSERRAT_26 + select LVGL_FONT_MONTSERRAT_20 + select LVGL_FONT_MONTSERRAT_16 + select LVGL_USE_LABEL + select LVGL_USE_IMG + +choice ZMK_DISPLAY_STATUS_SCREEN + default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM +endchoice + +if ZMK_DISPLAY + +config SPI + default y + +config IL0323 + default y + +config ZMK_DISPLAY_BLANK_ON_IDLE + default n + +endif # ZMK_DISPLAY + +menuconfig CUSTOM_WIDGET_BATTERY_STATUS + bool "custom battery status widget" + +menuconfig CUSTOM_WIDGET_OUTPUT_STATUS + bool "custom output status widget" + +menuconfig CUSTOM_WIDGET_LAYER_STATUS + bool "custom layer status widget" + +menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS + bool "custom peripheral status widget" + +endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT diff --git a/app/boards/arm/corneish_zen/board.cmake b/app/boards/arm/corneish_zen/board.cmake new file mode 100644 index 00000000..fa847d50 --- /dev/null +++ b/app/boards/arm/corneish_zen/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi new file mode 100644 index 00000000..f203c9f8 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -0,0 +1,126 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +/dts-v1/; +#include + +#include + +/ { + model = "corneish_zen_v2"; + compatible = "corneish_zen_v2"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,display = &epd; + zmk,battery = &vbatt; + zephyr,console = &cdc_acm_uart; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; + + // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | + // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | + // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; + + // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | + // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | + // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) + RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) + RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; + +}; + + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap new file mode 100644 index 00000000..72d0b8f1 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -0,0 +1,67 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include +#include +#include + +/ { + chosen { + zmk,matrix_transform = &default_transform; + //zmk,matrix_transform = &five_column_transform; + }; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = "QWERTY"; +// ----------------------------------------------------------------------------------------- +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | +// | GUI | LWR | SPC | | ENT | RSE | ALT | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; + lower_layer { + label = "NUMBER"; +// ----------------------------------------------------------------------------------------- +// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | +// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | +// | SHFT | | | | | | | | | | | | | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans + &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + + raise_layer { + label = "SYMBOL"; +// ----------------------------------------------------------------------------------------- +// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | +// | CTRL | | | | | | | - | = | [ | ] | \ | ` | +// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | +// | GUI | | SPC | | ENT | | ALT | + bindings = < + &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC + &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE + &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen.yaml b/app/boards/arm/corneish_zen/corneish_zen.yaml new file mode 100644 index 00000000..7975b262 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.yaml @@ -0,0 +1,20 @@ +identifier: corne-ish_zen_v2 +name: Corne-ish Zen v2 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 40 +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog + - gpio + - i2c + - spi diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2.yaml b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml new file mode 100644 index 00000000..46a213d9 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.yaml @@ -0,0 +1,20 @@ +identifier: corneish_zen_v2 +name: Corne-ish Zen v2 +type: keyboard +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - gpio + - i2c + - counter + - spi + - usb_device + - lsm303dlhc + - nvs + - can + - kscan + - ble + - adc diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml b/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml new file mode 100644 index 00000000..37c1cef4 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: corneish_zen_v2 +name: Corneish Zen v2 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: board +arch: arm +features: + - keys + - display +outputs: + - usb + - ble +siblings: + - corneish_zen_v2_left + - corneish_zen_v2_right diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts new file mode 100644 index 00000000..2d8f0a81 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -0,0 +1,78 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; + +}; + +&spi0 { + status = "okay"; + compatible = "nordic,nrf-spim"; + sck-pin = <27>; + mosi-pin = <8>; + miso-pin = <22>; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig new file mode 100644 index 00000000..eb1e552a --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -0,0 +1,91 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V2_LEFT=y +CONFIG_ZMK_SPLIT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable SPI +CONFIG_SPI=y +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_SSD1306=n +CONFIG_IL0323=y +CONFIG_LVGL_BITS_PER_PIXEL=1 +CONFIG_LVGL_COLOR_DEPTH_1=y +CONFIG_LVGL_DPI=145 +CONFIG_LVGL_VDB_SIZE=100 +CONFIG_LVGL_USE_THEME_MONO=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y +CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y +CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS=y +CONFIG_ZMK_WIDGET_OUTPUT_STATUS=n +CONFIG_CUSTOM_WIDGET_LAYER_STATUS=y +CONFIG_ZMK_WIDGET_LAYER_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=65536 +#CONFIG_LOG_STRDUP_BUF_COUNT=160 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y + +# Turn on USB CDC ACM device +CONFIG_USB_DEVICE_STACK=y +CONFIG_USB_CDC_ACM=y +CONFIG_USB_CDC_ACM_RINGBUF_SIZE=1024 + +# Enable serial console +CONFIG_SERIAL=y +CONFIG_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_UART_LINE_CTRL=y + +# Enable USB UART +CONFIG_UART_CONSOLE=y + + diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts new file mode 100644 index 00000000..097872f5 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -0,0 +1,86 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; + + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; +}; + +&default_transform { + col-offset = <6>; +}; +&five_column_transform { + col-offset = <6>; +}; + +&spi0 { + status = "okay"; + compatible = "nordic,nrf-spim"; + sck-pin = <20>; + mosi-pin = <24>; + miso-pin = <27>; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + //softstart = [17 17 17 17]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig new file mode 100644 index 00000000..46b40dee --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -0,0 +1,83 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT=y +CONFIG_ZMK_SPLIT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable SPI +CONFIG_SPI=y +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_SSD1306=n +CONFIG_IL0323=y +CONFIG_LVGL_BITS_PER_PIXEL=1 +CONFIG_LVGL_COLOR_DEPTH_1=y +CONFIG_LVGL_DPI=145 +CONFIG_LVGL_VDB_SIZE=100 +CONFIG_LVGL_USE_THEME_MONO=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n +CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y +CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y +CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y +CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS=y +CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS=8000 +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=20000 +#CONFIG_LOG_STRDUP_BUF_COUNT=60 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y + +# Enable serial console +CONFIG_SERIAL=y +CONFIG_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_UART_LINE_CTRL=y + +# Enable USB UART +CONFIG_UART_CONSOLE=y diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c new file mode 100644 index 00000000..7842925e --- /dev/null +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -0,0 +1,85 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include "widgets/battery_status.h" +#include "widgets/peripheral_status.h" +#include "widgets/output_status.h" +#include "widgets/layer_status.h" +#include "custom_status_screen.h" + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +LV_IMG_DECLARE(zenlogo); +LV_IMG_DECLARE(layers2); + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) +static struct zmk_widget_battery_status battery_status_widget; +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) +static struct zmk_widget_output_status output_status_widget; +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) +static struct zmk_widget_peripheral_status peripheral_status_widget; +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) +static struct zmk_widget_layer_status layer_status_widget; +#endif + +lv_obj_t *zmk_display_status_screen() { + + lv_obj_t *screen; + screen = lv_obj_create(NULL, NULL); + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) + zmk_widget_battery_status_init(&battery_status_widget, screen); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_MID, + 0, 2); +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) + zmk_widget_output_status_init(&output_status_widget, screen); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_MID, 0, + 41); +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) + zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, + LV_ALIGN_IN_TOP_MID, 0, 41); +#endif + +#if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) + zmk_widget_layer_status_init(&layer_status_widget, screen); + lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, + lv_theme_get_font_small()); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_MID, 0, + -5); + + lv_obj_t *LayersHeading; + LayersHeading = lv_img_create(screen, NULL); + lv_obj_align(LayersHeading, NULL, LV_ALIGN_IN_BOTTOM_MID, 8, 5); + lv_img_set_src(LayersHeading, &layers2); +#endif + +#if !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + lv_obj_t *zenlogo_icon; + zenlogo_icon = lv_img_create(screen, NULL); + lv_img_set_src(zenlogo_icon, &zenlogo); + lv_obj_align(zenlogo_icon, NULL, LV_ALIGN_IN_BOTTOM_MID, 2, -5); +#endif + + // lv_task_handler(); + lv_refr_now(NULL); + // display_blanking_off(display_dev); + + return screen; +} diff --git a/app/boards/arm/corneish_zen/custom_status_screen.h b/app/boards/arm/corneish_zen/custom_status_screen.h new file mode 100644 index 00000000..8da1510d --- /dev/null +++ b/app/boards/arm/corneish_zen/custom_status_screen.h @@ -0,0 +1,12 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include + +lv_obj_t *zmk_display_status_screen(); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.c b/app/boards/arm/corneish_zen/widgets/battery_status.c new file mode 100644 index 00000000..7dfd51e8 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/battery_status.c @@ -0,0 +1,97 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "battery_status.h" +#include +#include +#include +#include +#include + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct battery_status_state { + uint8_t level; +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + bool usb_present; +#endif +}; + +LV_IMG_DECLARE(batt_100); +LV_IMG_DECLARE(batt_100_chg); +LV_IMG_DECLARE(batt_75); +LV_IMG_DECLARE(batt_75_chg); +LV_IMG_DECLARE(batt_50); +LV_IMG_DECLARE(batt_50_chg); +LV_IMG_DECLARE(batt_25); +LV_IMG_DECLARE(batt_25_chg); +LV_IMG_DECLARE(batt_5); +LV_IMG_DECLARE(batt_5_chg); +LV_IMG_DECLARE(batt_0); +LV_IMG_DECLARE(batt_0_chg); + +static void set_battery_symbol(lv_obj_t *icon, struct battery_status_state state) { + uint8_t level = state.level; + +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + if (level > 95) { + lv_img_set_src(icon, state.usb_present ? &batt_100_chg : &batt_100); + } else if (level > 74) { + lv_img_set_src(icon, state.usb_present ? &batt_75_chg : &batt_75); + } else if (level > 49) { + lv_img_set_src(icon, state.usb_present ? &batt_50_chg : &batt_50); + } else if (level > 24) { + lv_img_set_src(icon, state.usb_present ? &batt_25_chg : &batt_25); + } else if (level > 5) { + lv_img_set_src(icon, state.usb_present ? &batt_5_chg : &batt_5); + } else { + lv_img_set_src(icon, state.usb_present ? &batt_0_chg : &batt_0); + } +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ +} + +void battery_status_update_cb(struct battery_status_state state) { + struct zmk_widget_battery_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_symbol(widget->obj, state); } +} + +static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + .usb_present = zmk_usb_is_powered(), +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + }; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, + battery_status_update_cb, battery_status_get_state) + +ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + +int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { + widget->obj = lv_img_create(parent, NULL); + + sys_slist_append(&widgets, &widget->node); + widget_battery_status_init(); + + return 0; +} + +lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget) { + return widget->obj; +} diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.h b/app/boards/arm/corneish_zen/widgets/battery_status.h new file mode 100644 index 00000000..21a4efb8 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/battery_status.h @@ -0,0 +1,20 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include + +#include + +struct zmk_widget_battery_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt b/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt new file mode 100644 index 00000000..eee750bf --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/CMakeLists.txt @@ -0,0 +1,4 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c b/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c new file mode 100644 index 00000000..b3b60422 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/USB_connected.c @@ -0,0 +1,41 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_USB_CONNECTED +#define LV_ATTRIBUTE_IMG_USB_CONNECTED +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_USB_CONNECTED uint8_t USB_connected_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xc0, 0x00, 0x3f, + 0xff, 0xff, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, + 0xff, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xff, 0x07, 0x1e, 0x30, 0x38, 0x07, 0x0f, 0x1c, 0x20, 0x38, + 0x07, 0x0f, 0x1c, 0x47, 0x10, 0xc3, 0x3e, 0x1c, 0x43, 0xf1, 0xc7, 0x7e, 0x3c, 0x60, 0x70, 0x0e, + 0x7e, 0x3c, 0x70, 0x30, 0x0e, 0x7e, 0x38, 0xfc, 0x33, 0xc7, 0xfe, 0x18, 0x8f, 0x23, 0x87, 0x0e, + 0x00, 0xc6, 0x20, 0x07, 0x0f, 0x01, 0xe0, 0x60, 0x0e, 0x0f, 0x87, 0xf0, 0xe0, 0x3e, 0x07, 0xff, + 0xff, 0xff, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xf0, 0x03, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, + 0xfc, 0x00, 0x00, 0x7f, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t USB_connected = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 164, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = USB_connected_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_0.c b/app/boards/arm/corneish_zen/widgets/icons/batt_0.c new file mode 100644 index 00000000..a6066b95 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_0.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_0 +#define LV_ATTRIBUTE_IMG_BATT_0 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0 uint8_t + batt_0_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x7f, 0xfd, 0xff, 0x7f, 0xf8, + 0xff, 0xfd, 0xff, 0x7f, 0xfc, 0xff, 0xfd, 0xff, 0x7f, 0xfc, 0xff, 0xfc, 0xfe, 0x7f, 0xfc, + 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, + 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x0f, 0xf0, 0x00, 0x7c, 0x00, 0x0f, + 0xf0, 0x00, 0x7c, 0x00, 0x0f, 0xf0, 0x00, 0x7c, 0x00, 0x0f, 0xf0, 0x00, 0x7c, 0x00, 0x3f, + 0xf0, 0x00, 0x7c, 0x00, 0x3f, 0xf0, 0x00, 0x7c, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0x01, 0xff, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xfc, 0xff, 0xfe, 0x7c, 0xff, 0xfc, + 0x7f, 0xfc, 0xfe, 0x7f, 0xf8, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, + 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x7c, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_0 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_0_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c new file mode 100644 index 00000000..368ba288 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_0_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_0_CHG +#define LV_ATTRIBUTE_IMG_BATT_0_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_0_CHG uint8_t + batt_0_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x01, 0xfe, 0x00, 0x3f, + 0xf0, 0x03, 0xfc, 0x00, 0x3f, 0xf0, 0x07, 0xfc, 0x00, 0x0f, 0xf0, 0x0f, 0xff, 0xe0, 0x0f, + 0xf0, 0x1f, 0xff, 0xc0, 0x0f, 0xf0, 0x00, 0x7f, 0x80, 0x0f, 0xf0, 0x00, 0x7f, 0x00, 0x3f, + 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_0_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_0_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_100.c b/app/boards/arm/corneish_zen/widgets/icons/batt_100.c new file mode 100644 index 00000000..e6aa27ba --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_100.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_100 +#define LV_ATTRIBUTE_IMG_BATT_100 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100 uint8_t + batt_100_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0x3f, + 0xf3, 0xff, 0xff, 0xff, 0x3f, 0xf3, 0xff, 0xff, 0xff, 0x0f, 0xf3, 0xff, 0xff, 0xff, 0x0f, + 0xf3, 0xff, 0xff, 0xff, 0x0f, 0xf3, 0xff, 0xff, 0xff, 0x0f, 0xf3, 0xff, 0xff, 0xff, 0x3f, + 0xf3, 0xff, 0xff, 0xff, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_100 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_100_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c new file mode 100644 index 00000000..9b2c18d4 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_100_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_100_CHG +#define LV_ATTRIBUTE_IMG_BATT_100_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_100_CHG uint8_t + batt_100_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xfd, 0xfe, 0xff, 0x3f, + 0xf3, 0xfb, 0xfd, 0xff, 0x3f, 0xf3, 0xf7, 0xfc, 0x07, 0x0f, 0xf3, 0xef, 0xff, 0xef, 0x0f, + 0xf3, 0xdf, 0xff, 0xdf, 0x0f, 0xf3, 0x80, 0x7f, 0xbf, 0x0f, 0xf3, 0xff, 0x7f, 0x7f, 0x3f, + 0xf3, 0xfe, 0xfe, 0xff, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_100_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_100_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_25.c b/app/boards/arm/corneish_zen/widgets/icons/batt_25.c new file mode 100644 index 00000000..2445ef39 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_25.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_25 +#define LV_ATTRIBUTE_IMG_BATT_25 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25 uint8_t + batt_25_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xfc, 0x00, 0x00, 0x3f, + 0xf3, 0xfc, 0x00, 0x00, 0x3f, 0xf3, 0xfc, 0x00, 0x00, 0x0f, 0xf3, 0xfc, 0x00, 0x00, 0x0f, + 0xf3, 0xfc, 0x00, 0x00, 0x0f, 0xf3, 0xfc, 0x00, 0x00, 0x0f, 0xf3, 0xfc, 0x00, 0x00, 0x3f, + 0xf3, 0xfc, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_25 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_25_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c new file mode 100644 index 00000000..37c30812 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_25_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_25_CHG +#define LV_ATTRIBUTE_IMG_BATT_25_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_25_CHG uint8_t + batt_25_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xf9, 0xfe, 0x00, 0x3f, + 0xf3, 0xfb, 0xfc, 0x00, 0x3f, 0xf3, 0xf7, 0xfc, 0x00, 0x0f, 0xf3, 0xef, 0xff, 0xe0, 0x0f, + 0xf3, 0xdf, 0xff, 0xc0, 0x0f, 0xf3, 0x80, 0x7f, 0x80, 0x0f, 0xf3, 0xf8, 0x7f, 0x00, 0x3f, + 0xf3, 0xf8, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_25_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_25_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_5.c b/app/boards/arm/corneish_zen/widgets/icons/batt_5.c new file mode 100644 index 00000000..e9824572 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_5.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_5 +#define LV_ATTRIBUTE_IMG_BATT_5 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5 uint8_t + batt_5_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0x00, 0x00, 0x00, 0x3f, + 0xf3, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0x00, 0x00, 0x00, 0x0f, 0xf3, 0x00, 0x00, 0x00, 0x0f, + 0xf3, 0x00, 0x00, 0x00, 0x0f, 0xf3, 0x00, 0x00, 0x00, 0x0f, 0xf3, 0x00, 0x00, 0x00, 0x3f, + 0xf3, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_5 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_5_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_50.c b/app/boards/arm/corneish_zen/widgets/icons/batt_50.c new file mode 100644 index 00000000..bbb0af48 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_50.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_50 +#define LV_ATTRIBUTE_IMG_BATT_50 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50 uint8_t + batt_50_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xff, 0xf0, 0x00, 0x3f, + 0xf3, 0xff, 0xf0, 0x00, 0x3f, 0xf3, 0xff, 0xf0, 0x00, 0x0f, 0xf3, 0xff, 0xf0, 0x00, 0x0f, + 0xf3, 0xff, 0xf0, 0x00, 0x0f, 0xf3, 0xff, 0xf0, 0x00, 0x0f, 0xf3, 0xff, 0xf0, 0x00, 0x3f, + 0xf3, 0xff, 0xf0, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_50 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_50_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c new file mode 100644 index 00000000..c2ced92e --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_50_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_50_CHG +#define LV_ATTRIBUTE_IMG_BATT_50_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_50_CHG uint8_t + batt_50_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xfd, 0xfe, 0x00, 0x3f, + 0xf3, 0xfb, 0xfc, 0x00, 0x3f, 0xf3, 0xf7, 0xfc, 0x00, 0x0f, 0xf3, 0xef, 0xff, 0xe0, 0x0f, + 0xf3, 0xdf, 0xff, 0xc0, 0x0f, 0xf3, 0x80, 0x7f, 0x80, 0x0f, 0xf3, 0xff, 0x7f, 0x00, 0x3f, + 0xf3, 0xfe, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_50_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_50_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c new file mode 100644 index 00000000..6a6d9d44 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_5_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_5_CHG +#define LV_ATTRIBUTE_IMG_BATT_5_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_5_CHG uint8_t + batt_5_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0x01, 0xfe, 0x00, 0x3f, + 0xf3, 0x03, 0xfc, 0x00, 0x3f, 0xf3, 0x07, 0xfc, 0x00, 0x0f, 0xf3, 0x0f, 0xff, 0xe0, 0x0f, + 0xf3, 0x1f, 0xff, 0xc0, 0x0f, 0xf3, 0x00, 0x7f, 0x80, 0x0f, 0xf3, 0x00, 0x7f, 0x00, 0x3f, + 0xf3, 0x00, 0xfe, 0x00, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_5_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_5_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_75.c b/app/boards/arm/corneish_zen/widgets/icons/batt_75.c new file mode 100644 index 00000000..9918386d --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_75.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_75 +#define LV_ATTRIBUTE_IMG_BATT_75 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75 uint8_t + batt_75_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf3, 0xff, 0xff, 0xe0, 0x3f, + 0xf3, 0xff, 0xff, 0xe0, 0x3f, 0xf3, 0xff, 0xff, 0xe0, 0x0f, 0xf3, 0xff, 0xff, 0xe0, 0x0f, + 0xf3, 0xff, 0xff, 0xe0, 0x0f, 0xf3, 0xff, 0xff, 0xe0, 0x0f, 0xf3, 0xff, 0xff, 0xe0, 0x3f, + 0xf3, 0xff, 0xff, 0xe0, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_75 = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_75_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c b/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c new file mode 100644 index 00000000..422aaabc --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/batt_75_chg.c @@ -0,0 +1,43 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BATT_75_CHG +#define LV_ATTRIBUTE_IMG_BATT_75_CHG +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BATT_75_CHG uint8_t + batt_75_chg_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x7f, 0xff, 0xf7, 0xbf, 0xf8, + 0xff, 0xff, 0xef, 0xbf, 0xfc, 0xff, 0xff, 0xdf, 0x7f, 0xfc, 0xff, 0xff, 0xbf, 0x7f, 0xfc, + 0xf0, 0x00, 0x7e, 0x00, 0x3f, 0xf0, 0x00, 0xfe, 0x00, 0x3f, 0xf3, 0xfd, 0xfe, 0xe0, 0x3f, + 0xf3, 0xfb, 0xfd, 0xe0, 0x3f, 0xf3, 0xf7, 0xfc, 0x00, 0x0f, 0xf3, 0xef, 0xff, 0xe0, 0x0f, + 0xf3, 0xdf, 0xff, 0xc0, 0x0f, 0xf3, 0x80, 0x7f, 0xa0, 0x0f, 0xf3, 0xff, 0x7f, 0x60, 0x3f, + 0xf3, 0xfe, 0xfe, 0xe0, 0x3f, 0xf0, 0x00, 0xfc, 0x00, 0x3f, 0xf0, 0x01, 0xf8, 0x00, 0x3f, + 0xff, 0xfd, 0xf7, 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xff, 0xfb, 0xdf, 0xff, 0xfc, + 0x7f, 0xfb, 0xbf, 0xff, 0xf8, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t batt_75_chg = { + .header.always_zero = 0, + .header.w = 40, + .header.h = 31, + .data_size = 163, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = batt_75_chg_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c new file mode 100644 index 00000000..daeee223 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising.c @@ -0,0 +1,42 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING uint8_t + bluetooth_advertising_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x20, 0x7f, 0x80, 0x00, 0x70, 0x77, 0xc0, 0x00, 0xf8, 0x73, 0xe0, 0xc0, 0x7c, 0x71, + 0xe0, 0xe0, 0x3e, 0x73, 0xc0, 0x70, 0x1f, 0x77, 0x86, 0x30, 0x0f, 0xff, 0x07, 0x30, + 0x07, 0xfe, 0x07, 0x38, 0x03, 0xfc, 0x23, 0x38, 0x01, 0xf8, 0x63, 0x18, 0x01, 0xf8, + 0x63, 0x18, 0x03, 0xfc, 0x23, 0x38, 0x07, 0xfe, 0x07, 0x38, 0x0f, 0xff, 0x07, 0x30, + 0x1f, 0x77, 0x86, 0x70, 0x3e, 0x73, 0xc0, 0x70, 0x7c, 0x71, 0xe0, 0xe0, 0xf8, 0x73, + 0xe0, 0xc0, 0x70, 0x77, 0xc0, 0x00, 0x20, 0x7f, 0x80, 0x00, 0x00, 0x7f, 0x00, 0x00, + 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising = { + .header.always_zero = 0, + .header.w = 29, + .header.h = 35, + .data_size = 148, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c new file mode 100644 index 00000000..cf5b8197 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_1.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_1 uint8_t + bluetooth_advertising_1_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc1, 0xc0, 0x7f, 0xff, 0xe0, 0x7c, 0xf3, 0xe0, 0xc0, 0xff, + 0xff, 0xf0, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0x8f, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xfe, 0x0f, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfe, 0x0f, 0xf8, 0x07, 0xfe, 0x06, 0x31, 0xff, 0xcf, 0xfc, + 0x03, 0xfc, 0x27, 0x33, 0xff, 0xcf, 0xfc, 0x01, 0xf8, 0x67, 0x33, 0xff, 0xcf, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xff, 0xcf, 0xfc, 0x03, 0xfc, 0x27, 0x33, 0xff, 0xcf, 0xfc, 0x07, 0xfe, + 0x06, 0x31, 0xff, 0xcf, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xff, 0xcf, 0xf8, 0x1f, 0xff, 0x84, + 0x61, 0xff, 0xcf, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0xcf, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xe0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_1 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_1_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c new file mode 100644 index 00000000..184a5ce8 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_2.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_2 uint8_t + bluetooth_advertising_2_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x60, 0xff, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0xf0, 0xf7, 0xc0, 0x80, + 0x7f, 0xff, 0xe0, 0x78, 0xf3, 0xe1, 0xc0, 0x7f, 0xff, 0xf0, 0x3c, 0xf3, 0xc0, 0xe0, 0xff, + 0x0f, 0xf0, 0x1e, 0xf7, 0x84, 0xe1, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x63, + 0xf8, 0x07, 0xfe, 0x0e, 0x71, 0xff, 0xf3, 0xfc, 0x03, 0xfc, 0x06, 0x33, 0xff, 0xe3, 0xfc, + 0x01, 0xf8, 0x67, 0x33, 0xff, 0xe7, 0xfc, 0x01, 0xf8, 0xe7, 0x33, 0xff, 0xc7, 0xfc, 0x01, + 0xfc, 0x67, 0x33, 0xff, 0x8f, 0xfc, 0x03, 0xfe, 0x06, 0x33, 0xff, 0x1f, 0xfc, 0x07, 0xff, + 0x0e, 0x71, 0xfe, 0x3f, 0xfc, 0x0f, 0xff, 0x8e, 0x61, 0xfc, 0x03, 0xf8, 0x1e, 0xf7, 0xc0, + 0xe1, 0xfc, 0x03, 0xf8, 0x3c, 0xf3, 0xe0, 0xc0, 0xff, 0xff, 0xf0, 0x78, 0xf3, 0xe1, 0xc0, + 0x7f, 0xff, 0xf0, 0xf0, 0xf7, 0xc0, 0x80, 0x7f, 0xff, 0xe0, 0x60, 0xff, 0x80, 0x00, 0x1f, + 0xff, 0xc0, 0x00, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_2 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_2_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c new file mode 100644 index 00000000..e9665ff9 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_3.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_3 uint8_t + bluetooth_advertising_3_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc1, 0xc0, 0x7f, 0xff, 0xf0, 0x7c, 0xf3, 0xe0, 0xc0, 0xff, + 0x9f, 0xf0, 0x3e, 0xf7, 0xc0, 0xe0, 0xfe, 0x07, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xfe, 0x03, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfe, 0xe3, 0xfc, 0x07, 0xfe, 0x06, 0x31, 0xff, 0xe3, 0xfc, + 0x03, 0xfc, 0x27, 0x33, 0xff, 0x87, 0xfc, 0x01, 0xf8, 0x67, 0x33, 0xff, 0x87, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xff, 0x83, 0xfc, 0x03, 0xfc, 0x27, 0x33, 0xff, 0xf3, 0xfc, 0x07, 0xfe, + 0x06, 0x31, 0xfe, 0xf3, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x63, 0xfc, 0x1f, 0xff, 0x84, + 0x61, 0xfe, 0x03, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0x0f, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xf0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xe0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_3 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_3_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c new file mode 100644 index 00000000..d591f17f --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_4.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_4 uint8_t + bluetooth_advertising_4_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x7c, 0xf3, 0xe0, 0xc0, 0xff, + 0xff, 0xf0, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0xcf, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xff, 0x8f, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xff, 0x0f, 0xf8, 0x07, 0xfe, 0x06, 0x31, 0xff, 0x0f, 0xfc, + 0x03, 0xfc, 0x27, 0x31, 0xfe, 0x4f, 0xfc, 0x01, 0xf8, 0x67, 0x31, 0xfc, 0x4f, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xfc, 0xcf, 0xfc, 0x03, 0xfc, 0x27, 0x31, 0xf8, 0x07, 0xfc, 0x07, 0xfe, + 0x06, 0x31, 0xf8, 0x03, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xf8, 0x07, 0xf8, 0x1f, 0xff, 0x84, + 0x61, 0xff, 0xcf, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0xcf, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xc0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0xfe, 0x00, 0x00, 0x07, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_4 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_4_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c new file mode 100644 index 00000000..88213158 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_advertising_5.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_ADVERTISING_5 uint8_t + bluetooth_advertising_5_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0xfe, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x70, 0xf7, 0x80, 0x00, + 0x3f, 0xff, 0xe0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x7c, 0xf3, 0xe0, 0xe0, 0xff, + 0xff, 0xf0, 0x3e, 0xf7, 0xc0, 0xe1, 0xfe, 0x07, 0xf8, 0x1f, 0xff, 0x84, 0x61, 0xfe, 0x07, + 0xf8, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x7f, 0xf8, 0x07, 0xfe, 0x06, 0x33, 0xfc, 0x7f, 0xfc, + 0x03, 0xfc, 0x27, 0x33, 0xfc, 0x07, 0xfc, 0x01, 0xf8, 0x67, 0x33, 0xfc, 0x03, 0xfc, 0x01, + 0xf8, 0x67, 0x33, 0xff, 0x63, 0xfc, 0x03, 0xfc, 0x27, 0x33, 0xff, 0xf3, 0xfc, 0x07, 0xfe, + 0x06, 0x33, 0xfe, 0xf3, 0xfc, 0x0f, 0xff, 0x0e, 0x71, 0xfc, 0x63, 0xf8, 0x1f, 0xff, 0x84, + 0x61, 0xfe, 0x07, 0xf8, 0x3e, 0xf7, 0xc0, 0xe0, 0xff, 0x0f, 0xf8, 0x7c, 0xf3, 0xe1, 0xc0, + 0xff, 0xff, 0xf0, 0xf8, 0xf3, 0xc0, 0xc0, 0x7f, 0xff, 0xe0, 0x70, 0xf7, 0x80, 0x00, 0x3f, + 0xff, 0xc0, 0x20, 0xff, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0xfe, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_advertising_5 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_advertising_5_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c new file mode 100644 index 00000000..a3cb5a2c --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_1.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_1 uint8_t + bluetooth_connected_1_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0x78, 0x77, 0xc0, 0x00, + 0x3f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0xff, 0xf0, 0x1f, 0x73, 0xc0, 0x00, 0xff, 0x8f, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfe, 0x0f, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xfe, 0x0f, 0xf8, 0xc3, 0xfe, 0x18, 0x01, 0xff, 0xcf, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xff, 0xcf, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xff, 0xcf, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xff, 0xcf, 0xfc, 0xe1, 0xfc, 0x38, 0x03, 0xff, 0xcf, 0xfc, 0xc3, 0xfe, + 0x18, 0x01, 0xff, 0xcf, 0xfc, 0x87, 0xff, 0x08, 0x01, 0xff, 0xcf, 0xf8, 0x0f, 0xff, 0x80, + 0x01, 0xff, 0xcf, 0xf8, 0x1e, 0x73, 0xc0, 0x00, 0xff, 0xcf, 0xf8, 0x3c, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x78, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_1 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_1_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c new file mode 100644 index 00000000..2ce5b939 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_2.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_2 uint8_t + bluetooth_connected_2_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0x78, 0x73, 0xc0, 0x00, + 0x7f, 0xff, 0xe0, 0x7c, 0x71, 0xe0, 0x00, 0x7f, 0xff, 0xf0, 0x3e, 0x73, 0xe0, 0x00, 0xff, + 0x0f, 0xf0, 0x1f, 0x77, 0xc0, 0x01, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfc, 0x63, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xff, 0xf3, 0xfc, 0xc3, 0xfe, 0x18, 0x03, 0xff, 0xe3, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xff, 0xe7, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xff, 0xc7, 0xfc, 0xe1, + 0xfc, 0x38, 0x03, 0xff, 0x8f, 0xfc, 0xc3, 0xfe, 0x18, 0x03, 0xff, 0x1f, 0xfc, 0x87, 0xff, + 0x08, 0x01, 0xfe, 0x3f, 0xfc, 0x0f, 0xff, 0x80, 0x01, 0xfc, 0x03, 0xf8, 0x1f, 0x77, 0xc0, + 0x01, 0xfc, 0x03, 0xf8, 0x3e, 0x73, 0xe0, 0x00, 0xff, 0xff, 0xf0, 0x7c, 0x71, 0xe0, 0x00, + 0x7f, 0xff, 0xf0, 0x78, 0x73, 0xc0, 0x00, 0x7f, 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, + 0xff, 0xc0, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_2 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_2_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c new file mode 100644 index 00000000..edac091f --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_3.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_3 uint8_t + bluetooth_connected_3_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0xc0, 0x78, 0x77, 0xc0, 0x00, + 0x7f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xf0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0x9f, 0xf0, 0x1f, 0x73, 0xc0, 0x01, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfc, 0x03, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xfe, 0xe3, 0xfc, 0xc3, 0xfe, 0x18, 0x03, 0xff, 0xe3, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xff, 0x87, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xff, 0x87, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xff, 0x83, 0xfc, 0xe1, 0xfe, 0x38, 0x03, 0xff, 0xf3, 0xfc, 0xc3, 0xff, + 0x18, 0x03, 0xfe, 0xf3, 0xfc, 0x87, 0xff, 0x88, 0x01, 0xfc, 0x63, 0xf8, 0x0f, 0xf7, 0xc0, + 0x01, 0xfe, 0x03, 0xf8, 0x1f, 0x73, 0xe0, 0x01, 0xff, 0x0f, 0xf8, 0x3e, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_3 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_3_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c new file mode 100644 index 00000000..e79d6cb6 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_4.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_4 uint8_t + bluetooth_connected_4_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x07, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x78, 0x77, 0xc0, 0x00, + 0x3f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0xff, 0xf0, 0x1f, 0x73, 0xc0, 0x00, 0xff, 0xcf, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xff, 0x8f, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xff, 0x0f, 0xf8, 0xc3, 0xfe, 0x18, 0x01, 0xff, 0x0f, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xfe, 0x4f, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xfc, 0x4f, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xfc, 0xcf, 0xfc, 0xe1, 0xfe, 0x38, 0x03, 0xf8, 0xc7, 0xfc, 0xc3, 0xff, + 0x18, 0x01, 0xf8, 0x03, 0xfc, 0x87, 0xff, 0x88, 0x01, 0xf8, 0x03, 0xf8, 0x0f, 0xf7, 0xc0, + 0x01, 0xff, 0xcf, 0xf8, 0x1f, 0x73, 0xe0, 0x00, 0xff, 0xcf, 0xf8, 0x3e, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xe0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_4 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_4_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c new file mode 100644 index 00000000..b567aa2d --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_5.c @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 +#endif +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_5 uint8_t + bluetooth_connected_5_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x7f, 0x00, + 0x00, 0x0f, 0xff, 0x00, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x78, 0x77, 0xc0, 0x00, + 0x3f, 0xff, 0xe0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x3e, 0x71, 0xe0, 0x00, 0xff, + 0xff, 0xf0, 0x1f, 0x73, 0xc0, 0x01, 0xfe, 0x07, 0xf8, 0x0f, 0xff, 0x80, 0x01, 0xfe, 0x07, + 0xf8, 0x87, 0xff, 0x08, 0x01, 0xfc, 0x7f, 0xf8, 0xc3, 0xfe, 0x18, 0x03, 0xfc, 0x7f, 0xfc, + 0xe1, 0xfc, 0x38, 0x03, 0xfc, 0x07, 0xfc, 0xf0, 0xf8, 0x78, 0x03, 0xfc, 0x03, 0xfc, 0xf0, + 0xfc, 0x78, 0x03, 0xff, 0x63, 0xfc, 0xe1, 0xfe, 0x38, 0x03, 0xff, 0xf3, 0xfc, 0xc3, 0xff, + 0x18, 0x03, 0xfe, 0xf3, 0xfc, 0x87, 0xff, 0x88, 0x01, 0xfc, 0x63, 0xf8, 0x0f, 0xf7, 0xc0, + 0x01, 0xfe, 0x07, 0xf8, 0x1e, 0x73, 0xc0, 0x00, 0xff, 0x0f, 0xf8, 0x3c, 0x71, 0xe0, 0x00, + 0xff, 0xff, 0xf0, 0x7c, 0x73, 0xe0, 0x00, 0x7f, 0xff, 0xe0, 0x78, 0x77, 0xc0, 0x00, 0x3f, + 0xff, 0xc0, 0x30, 0x7f, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x7f, 0x00, 0x00, 0x0f, 0xff, + 0x00, 0x00, 0x7e, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_5 = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 254, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_5_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c new file mode 100644 index 00000000..2a28a903 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_connected_right.c @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_RIGHT +#define LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_RIGHT +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH_CONNECTED_RIGHT + uint8_t bluetooth_connected_right_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x3f, 0x80, + 0x00, 0x0f, 0xfe, 0x00, 0x10, 0x3f, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x38, 0x3b, 0xe0, 0x00, + 0x7f, 0xff, 0xc0, 0x7c, 0x39, 0xf0, 0x00, 0xff, 0xff, 0xe0, 0x3e, 0x38, 0xf0, 0x01, 0xff, + 0xff, 0xf0, 0x1f, 0x39, 0xe0, 0x01, 0xff, 0xfe, 0x30, 0x0f, 0xbb, 0xc0, 0x03, 0xff, 0xfc, + 0x38, 0x87, 0xff, 0x84, 0x03, 0xff, 0xf8, 0x38, 0xc3, 0xff, 0x0c, 0x07, 0xff, 0xf0, 0x3c, + 0xe1, 0xfe, 0x1c, 0x07, 0xcf, 0xe0, 0x7c, 0xf0, 0xfc, 0x3c, 0x07, 0x87, 0xc0, 0xfc, 0xf0, + 0xfc, 0x3c, 0x07, 0x83, 0x81, 0xfc, 0xe1, 0xfe, 0x1c, 0x07, 0x81, 0x03, 0xfc, 0xc3, 0xff, + 0x0c, 0x07, 0xc0, 0x07, 0xfc, 0x87, 0xff, 0x84, 0x07, 0xe0, 0x0f, 0xfc, 0x0f, 0xbb, 0xc0, + 0x03, 0xf0, 0x1f, 0xf8, 0x1f, 0x39, 0xe0, 0x03, 0xf8, 0x3f, 0xf8, 0x3e, 0x38, 0xf0, 0x01, + 0xfc, 0xff, 0xf0, 0x7c, 0x39, 0xf0, 0x01, 0xff, 0xff, 0xf0, 0x38, 0x3b, 0xe0, 0x00, 0xff, + 0xff, 0xe0, 0x10, 0x3f, 0xc0, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x3f, 0x80, 0x00, 0x3f, 0xff, + 0x80, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_connected_right = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 253, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_connected_right_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c new file mode 100644 index 00000000..37974d69 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/bluetooth_disconnected_right.c @@ -0,0 +1,49 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BLUETOOTH_DISCONNECTED_RIGHT +#define LV_ATTRIBUTE_IMG_BLUETOOTH_DISCONNECTED_RIGHT +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BLUETOOTH_DISCONNECTED_RIGHT + uint8_t bluetooth_disconnected_right_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x3f, 0x80, + 0x00, 0x0f, 0xfe, 0x00, 0x10, 0x3f, 0xc0, 0x00, 0x3f, 0xff, 0x80, 0x38, 0x3b, 0xe0, 0x00, + 0x7f, 0xff, 0xc0, 0x7c, 0x39, 0xf0, 0x00, 0xff, 0xff, 0xe0, 0x3e, 0x38, 0xf0, 0x01, 0xff, + 0xff, 0xf0, 0x1f, 0x39, 0xe0, 0x01, 0xe3, 0xf8, 0xf0, 0x0f, 0xbb, 0xc0, 0x03, 0xe1, 0xf0, + 0xf8, 0x07, 0xff, 0x80, 0x03, 0xe0, 0xe0, 0xf8, 0x03, 0xff, 0x00, 0x07, 0xf0, 0x01, 0xfc, + 0x01, 0xfe, 0x00, 0x07, 0xf8, 0x03, 0xfc, 0x00, 0xfc, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x00, + 0xfc, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x01, 0xfe, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x03, 0xff, + 0x00, 0x07, 0xf8, 0x03, 0xfc, 0x07, 0xff, 0x80, 0x07, 0xf0, 0x01, 0xfc, 0x0f, 0xbb, 0xc0, + 0x03, 0xe0, 0xe0, 0xf8, 0x1f, 0x39, 0xe0, 0x03, 0xe1, 0xf0, 0xf8, 0x3e, 0x38, 0xf0, 0x01, + 0xe3, 0xf8, 0xf0, 0x7c, 0x39, 0xf0, 0x01, 0xff, 0xff, 0xf0, 0x38, 0x3b, 0xe0, 0x00, 0xff, + 0xff, 0xe0, 0x10, 0x3f, 0xc0, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x3f, 0x80, 0x00, 0x3f, 0xff, + 0x80, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x03, 0xf8, 0x00, + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t bluetooth_disconnected_right = { + .header.always_zero = 0, + .header.w = 54, + .header.h = 35, + .data_size = 253, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = bluetooth_disconnected_right_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/layers.c b/app/boards/arm/corneish_zen/widgets/icons/layers.c new file mode 100644 index 00000000..86bc8dfc --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/layers.c @@ -0,0 +1,44 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_LAYERS +#define LV_ATTRIBUTE_IMG_LAYERS +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LAYERS uint8_t + layers_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xc0, 0x00, + 0x01, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, + 0x3f, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x00, + 0x01, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x00, 0x07, 0x9f, 0xff, 0x3c, 0x00, + 0x1e, 0x07, 0xfc, 0x0f, 0x00, 0x38, 0x01, 0xe0, 0x03, 0x80, 0x30, 0x00, 0x00, 0x01, 0x80, + 0x38, 0x00, 0x00, 0x03, 0x80, 0x0e, 0x00, 0x00, 0x0e, 0x00, 0x03, 0xc0, 0x00, 0x78, 0x00, + 0x01, 0xf0, 0x01, 0xf0, 0x00, 0x07, 0xfc, 0x07, 0xfc, 0x00, 0x1f, 0xff, 0x1f, 0xff, 0x00, + 0x3f, 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xff, 0x00, + 0x07, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xff, 0x80, 0x00, + 0x00, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t layers = { + .header.always_zero = 0, + .header.w = 35, + .header.h = 35, + .data_size = 183, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = layers_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/layers2.c b/app/boards/arm/corneish_zen/widgets/icons/layers2.c new file mode 100644 index 00000000..068b0757 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/layers2.c @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_LAYERS2 +#define LV_ATTRIBUTE_IMG_LAYERS2 +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_LAYERS2 uint8_t + layers2_map[] = { + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 0x0f, 0x18, 0xdf, 0xdf, 0xc0, 0x04, 0x00, + 0x00, 0x80, 0x30, 0x19, 0x98, 0xd8, 0x18, 0xe0, 0x0e, 0x00, 0x00, 0x80, 0x30, 0x30, 0xd8, + 0xd8, 0x18, 0xe0, 0x1f, 0x00, 0x00, 0x80, 0x30, 0x30, 0xcf, 0x9f, 0xd9, 0xc0, 0x04, 0x00, + 0x00, 0x80, 0x30, 0x3f, 0xc7, 0x18, 0x1f, 0x80, 0x04, 0x00, 0x03, 0xe0, 0x30, 0x39, 0xc6, + 0x18, 0x1b, 0x80, 0x04, 0x00, 0x01, 0xc0, 0x3f, 0xb0, 0xc6, 0x1f, 0xd9, 0xc0, 0x04, 0x00, + 0x00, 0x80, 0x3f, 0xb0, 0xc6, 0x1f, 0xd8, 0xe0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t layers2 = { + .header.always_zero = 0, + .header.w = 78, + .header.h = 12, + .data_size = 128, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = layers2_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c b/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c new file mode 100644 index 00000000..cc424041 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/icons/zenlogo.c @@ -0,0 +1,58 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_ZENLOGO +#define LV_ATTRIBUTE_IMG_ZENLOGO +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_ZENLOGO uint8_t + zenlogo_map[] = { + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0xe3, 0xe3, 0x9e, + 0x3e, 0x02, 0x72, 0xe0, 0x00, 0x00, 0x06, 0x36, 0x36, 0x33, 0x63, 0x02, 0x8b, 0x10, 0x00, + 0x00, 0x04, 0x14, 0x14, 0x21, 0x41, 0x02, 0x82, 0x10, 0x00, 0x00, 0x04, 0x04, 0x14, 0x21, + 0x7f, 0x7a, 0x72, 0x10, 0x00, 0x00, 0x04, 0x04, 0x14, 0x21, 0x40, 0x02, 0x0a, 0x10, 0x00, + 0x00, 0x04, 0x14, 0x14, 0x21, 0x41, 0x02, 0x0a, 0x10, 0x00, 0x00, 0x06, 0x36, 0x34, 0x21, + 0x63, 0x02, 0x8a, 0x10, 0x00, 0x00, 0x03, 0xe3, 0xe4, 0x21, 0x3e, 0x02, 0x72, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x03, 0xfc, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xf1, + 0xf8, 0x00, 0x60, 0x0f, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xfb, 0xff, 0xe0, 0xf8, 0x1f, 0x80, + 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xfc, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc1, 0xfc, 0x1f, 0x00, 0x7f, 0xc0, 0x1f, 0xff, 0xff, 0xe0, 0x01, 0xfc, 0x3e, 0x00, + 0x40, 0x1f, 0xff, 0xe0, 0xff, 0xc0, 0x07, 0xfc, 0xfc, 0x00, 0xdf, 0xff, 0x80, 0x01, 0xff, + 0xc0, 0x0f, 0xdc, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x8f, 0x1f, 0x9f, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0xef, 0xff, 0x1f, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x8f, + 0xff, 0x3f, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0xfe, 0x3f, 0x0f, 0xf0, 0x00, + 0x00, 0x00, 0x03, 0xf8, 0x1f, 0x80, 0x7e, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x3e, + 0x00, 0x7e, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xc0, 0x3c, 0x00, 0x7e, 0x0f, 0xc0, 0x00, + 0x00, 0x00, 0x1f, 0xf8, 0x3c, 0x00, 0x78, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xbc, + 0x00, 0x78, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0xf8, 0x0f, 0xc0, 0x00, + 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, + 0xff, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0xff, 0xa0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +const lv_img_dsc_t zenlogo = { + .header.always_zero = 0, + .header.w = 80, + .header.h = 38, + .data_size = 388, + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .data = zenlogo_map, +}; diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.c b/app/boards/arm/corneish_zen/widgets/layer_status.c new file mode 100644 index 00000000..a309a787 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/layer_status.c @@ -0,0 +1,67 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "layer_status.h" +#include +#include +#include +#include + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct layer_status_state { + uint8_t index; + const char *label; +}; + +static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) { + const char *layer_label = state.label; + uint8_t active_layer_index = state.index; + + if (layer_label == NULL) { + char text[6] = {}; + + sprintf(text, " %i", active_layer_index); + + lv_label_set_text(label, text); + } else { + lv_label_set_text(label, layer_label); + } +} + +static void layer_status_update_cb(struct layer_status_state state) { + struct zmk_widget_layer_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_layer_symbol(widget->obj, state); } +} + +static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) { + uint8_t index = zmk_keymap_highest_layer_active(); + return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)}; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb, + layer_status_get_state) + +ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); + +int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { + widget->obj = lv_label_create(parent, NULL); + + sys_slist_append(&widgets, &widget->node); + + widget_layer_status_init(); + return 0; +} + +lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) { + return widget->obj; +} \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.h b/app/boards/arm/corneish_zen/widgets/layer_status.h new file mode 100644 index 00000000..04f32faa --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/layer_status.h @@ -0,0 +1,19 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include + +struct zmk_widget_layer_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c new file mode 100644 index 00000000..bd69bbb1 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -0,0 +1,138 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "output_status.h" +#include +#include +#include +#include +#include +#include +#include + +LV_IMG_DECLARE(bluetooth_advertising); +LV_IMG_DECLARE(bluetooth_connected_right); +LV_IMG_DECLARE(bluetooth_disconnected_right); +LV_IMG_DECLARE(bluetooth_connected_1); +LV_IMG_DECLARE(bluetooth_connected_2); +LV_IMG_DECLARE(bluetooth_connected_3); +LV_IMG_DECLARE(bluetooth_connected_4); +LV_IMG_DECLARE(bluetooth_connected_5); +LV_IMG_DECLARE(bluetooth_advertising_1); +LV_IMG_DECLARE(bluetooth_advertising_2); +LV_IMG_DECLARE(bluetooth_advertising_3); +LV_IMG_DECLARE(bluetooth_advertising_4); +LV_IMG_DECLARE(bluetooth_advertising_5); +LV_IMG_DECLARE(USB_connected); + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct output_status_state { + enum zmk_endpoint selected_endpoint; + bool active_profile_connected; + bool active_profile_bonded; + uint8_t active_profile_index; +}; + +static struct output_status_state get_state(const zmk_event_t *_eh) { + return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), + .active_profile_connected = + zmk_ble_active_profile_is_connected(), + .active_profile_bonded = !zmk_ble_active_profile_is_open(), + .active_profile_index = zmk_ble_active_profile_index()}; + ; +} + +static void set_status_symbol(lv_obj_t *icon, struct output_status_state state) { + switch (state.selected_endpoint) { + case ZMK_ENDPOINT_USB: + lv_img_set_src(icon, &USB_connected); + break; + case ZMK_ENDPOINT_BLE: + if (state.active_profile_bonded) { + if (state.active_profile_connected) { + // sprintf(text, LV_SYMBOL_BLUETOOTH "%i " LV_SYMBOL_OK, active_profile_index); + switch (state.active_profile_index) { + case 0: + lv_img_set_src(icon, &bluetooth_connected_1); + break; + case 1: + lv_img_set_src(icon, &bluetooth_connected_2); + break; + case 2: + lv_img_set_src(icon, &bluetooth_connected_3); + break; + case 3: + lv_img_set_src(icon, &bluetooth_connected_4); + break; + case 4: + lv_img_set_src(icon, &bluetooth_connected_5); + break; + } + } else { + lv_img_set_src(icon, &bluetooth_disconnected_right); + } + } else { + switch (state.active_profile_index) { + case 0: + lv_img_set_src(icon, &bluetooth_advertising_1); + break; + case 1: + lv_img_set_src(icon, &bluetooth_advertising_2); + break; + case 2: + lv_img_set_src(icon, &bluetooth_advertising_3); + break; + case 3: + lv_img_set_src(icon, &bluetooth_advertising_4); + break; + case 4: + lv_img_set_src(icon, &bluetooth_advertising_5); + break; + } + } + break; + } +} + +static void output_status_update_cb(struct output_status_state state) { + struct zmk_widget_output_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_status_symbol(widget->obj, state); } +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, + output_status_update_cb, get_state) +ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); + +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); +#endif +#if defined(CONFIG_ZMK_BLE) +ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); +#endif + +int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { + widget->obj = lv_img_create(parent, NULL); + + lv_obj_set_size(widget->obj, 40, 15); + + sys_slist_append(&widgets, &widget->node); + + widget_output_status_init(); + return 0; +} + +lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget) { + return widget->obj; +} diff --git a/app/boards/arm/corneish_zen/widgets/output_status.h b/app/boards/arm/corneish_zen/widgets/output_status.h new file mode 100644 index 00000000..c171e2bb --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/output_status.h @@ -0,0 +1,19 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include + +struct zmk_widget_output_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.c b/app/boards/arm/corneish_zen/widgets/peripheral_status.c new file mode 100644 index 00000000..e18414be --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.c @@ -0,0 +1,61 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "peripheral_status.h" +#include +#include +#include + +LV_IMG_DECLARE(bluetooth_connected_right); +LV_IMG_DECLARE(bluetooth_disconnected_right); + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct peripheral_status_state { + bool connected; +}; + +static struct peripheral_status_state get_state(const zmk_event_t *_eh) { + return (struct peripheral_status_state){.connected = zmk_split_bt_peripheral_is_connected()}; +} + +static void set_status_symbol(lv_obj_t *icon, struct peripheral_status_state state) { + LOG_DBG("halves connected? %s", state.connected ? "true" : "false"); + + lv_img_set_src(icon, + state.connected ? &bluetooth_connected_right : &bluetooth_disconnected_right); +} + +static void output_status_update_cb(struct peripheral_status_state state) { + struct zmk_widget_peripheral_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_status_symbol(widget->obj, state); } +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_peripheral_status, struct peripheral_status_state, + output_status_update_cb, get_state) +ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); + +int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, + lv_obj_t *parent) { + widget->obj = lv_img_create(parent, NULL); + + sys_slist_append(&widgets, &widget->node); + + widget_peripheral_status_init(); + return 0; +} + +lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget) { + return widget->obj; +} diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.h b/app/boards/arm/corneish_zen/widgets/peripheral_status.h new file mode 100644 index 00000000..59675763 --- /dev/null +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.h @@ -0,0 +1,20 @@ +/* + * + * Copyright (c) 2021 Darryl deHaan + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include + +struct zmk_widget_peripheral_status { + sys_snode_t node; + lv_obj_t *obj; +}; + +int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, + lv_obj_t *parent); +lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); \ No newline at end of file diff --git a/app/package-lock.json b/app/package-lock.json index afd730a5..ed8765f3 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -9,27 +9,30 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "prettier": "^2.4.0" + "prettier": "^2.7.1" } }, "node_modules/prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } } }, "dependencies": { "prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true } } diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index ee977556..a503cc46 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -13,7 +13,6 @@ if ZMK_DISPLAY config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" - default y choice LVGL_TXT_ENC default LVGL_TXT_ENC_UTF8 diff --git a/app/src/display/main.c b/app/src/display/main.c index 9de0ad7f..8a70cef2 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -73,6 +73,8 @@ static void start_display_updates() { k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); } +#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) + static void stop_display_updates() { if (display == NULL) { return; @@ -83,6 +85,8 @@ static void stop_display_updates() { k_timer_stop(&display_timer); } +#endif + int zmk_display_is_initialized() { return initialized; } void initialize_display(struct k_work *work) { @@ -94,6 +98,8 @@ void initialize_display(struct k_work *work) { return; } + initialized = true; + screen = zmk_display_status_screen(); if (screen == NULL) { @@ -104,8 +110,6 @@ void initialize_display(struct k_work *work) { lv_scr_load(screen); start_display_updates(); - - initialized = true; } K_WORK_DEFINE(init_work, initialize_display); From ebb4cb76d364a704aa05a62ef322875d86795585 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 4 Nov 2022 17:02:23 -0700 Subject: [PATCH 255/494] fix(boards): Add Zen .conf file for setup script --- app/boards/arm/corneish_zen/corneish_zen.conf | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/boards/arm/corneish_zen/corneish_zen.conf diff --git a/app/boards/arm/corneish_zen/corneish_zen.conf b/app/boards/arm/corneish_zen/corneish_zen.conf new file mode 100644 index 00000000..a2e1fbe6 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen.conf @@ -0,0 +1,5 @@ +# Go to sleep after one hour (1*60*60*1000ms) +CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=3600000 + +# Turn on logging, and set ZMK logging to debug output +# CONFIG_ZMK_USB_LOGGING=y From b8fb218a0195974a3df8367670051acf864d395e Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 14:43:47 -0800 Subject: [PATCH 256/494] fix(setup): Make keymap/conf fall back to using dirname --- docs/src/templates/setup.ps1.mustache | 35 +++++++++++++++++---------- docs/src/templates/setup.sh.mustache | 24 ++++++++++-------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index 54c5ae82..a2bf0c58 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -209,27 +209,36 @@ Set-Location "$repo_name" Push-Location config -$config_file = "${keyboard}.conf" -$keymap_file = "${keyboard}.keymap" - if ($keyboard_type -eq "shield") { - $config_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${basedir}/${keyboard}.conf" - $keymap_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${basedir}/${keyboard}.keymap" + $url_base = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${basedir}" } else { - $config_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${basedir}/${keyboard}.conf" - $keymap_url = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${basedir}/${keyboard}.keymap" + $url_base = "https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${basedir}" } -Write-Host "Downloading config file (${config_url})" +Write-Host "Downloading config file (${url_base}/${keyboard}.conf)" Try { - Invoke-RestMethod -Uri "${config_url}" -OutFile "${config_file}" + Invoke-RestMethod -Uri "${config_url}" -OutFile "${keyboard}.conf" } Catch { - Set-Content -Path $config_file "# Place configuration items here" + Try { + Write-Host "Could not find it, falling back to ${url_base}/${basedir}.conf" + Invoke-RestMethod -Uri "${url_base}/${basedir}.conf" -OutFile "${basedir}.conf" + } Catch { + Set-Content -Path "${keyboard}.conf" "# Put configuration options here" + } } if ($copy_keymap -eq "yes") { - Write-Host "Downloading keymap file (${keymap_url})" - Invoke-RestMethod -Uri "${keymap_url}" -OutFile "${keymap_file}" + Write-Host "Downloading keymap file (${url_base}/${keyboard}.keymap)" + Try { + Invoke-RestMethod -Uri "${url_base}/${keyboard}.keymap" -OutFile "${keyboard}.keymap" + } Catch { + Write-Host "Could not find it, falling back to ${url_base}/${basedir}.keymap" + Try { + Invoke-RestMethod -Uri "${url_base}/${basedir}.keymap" -OutFile "${basedir}.keymap" + } Catch { + Write-Host "Warning: Could not find a keymap file to download!" + } + } } Pop-Location @@ -264,7 +273,7 @@ if ($github_repo -ne "") { Write-Host " git remote rm origin" Write-Host " git remote add origin FIXED_URL" Write-Host " git push --set-upstream origin $(git symbolic-ref --short HEAD)" - Write-Host "Once pushed, your firmware should be availalbe from GitHub Actions at: $actions" + Write-Host "Once pushed, your firmware should be available from GitHub Actions at: $actions" exit 1 } diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index 3184aab2..4c3868ec 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -205,19 +205,23 @@ cd ${repo_name} pushd config if [ "$keyboard_shield" == "y" ]; then - config_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${keyboard_basedir}/${shield}.conf" - - keymap_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${keyboard_basedir}/${shield}.keymap" + url_base="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/shields/${keyboard_basedir}" else - config_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${keyboard_basedir}/${board}.conf" - keymap_file="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${keyboard_basedir}/${board}.keymap" + url_base="https://raw.githubusercontent.com/zmkfirmware/zmk/main/app/boards/${keyboard_arch}/${keyboard_basedir}" +fi + +echo "Downloading config file (${url_base}/${keyboard}.conf)" +if ! $download_command "${url_base}/${keyboard}.conf"; then + echo "Could not find it, falling back to ${url_base}/${keyboard_basedir}.conf" + $download_command "${url_base}/${keyboard_basedir}.conf" || echo "# Put configuration options here" > "${keyboard}.conf" fi -echo "Downloading config file (${config_file})" -$download_command "${config_file}" || echo "# Put configuration options here" > "${keyboard}.conf" if [ "$copy_keymap" == "yes" ]; then - echo "Downloading keymap file (${keymap_file})" - $download_command "${keymap_file}" + echo "Downloading keymap file (${url_base}/${keyboard}.keymap)" + if ! $download_command "${url_base}/${keyboard}.keymap"; then + echo "Could not find it, falling back to ${url_base}/${keyboard_basedir}.keymap" + $download_command "${url_base}/${keyboard_basedir}.keymap" || echo "Warning: Could not find a keymap file to download!" + fi fi popd @@ -254,7 +258,7 @@ if [ -n "$github_repo" ]; then echo " git remote rm origin" echo " git remote add origin FIXED_URL" echo " git push --set-upstream origin $(git symbolic-ref --short HEAD)" - echo "Once pushed, your firmware should be availalbe from GitHub Actions at: ${github_repo%.git}/actions" + echo "Once pushed, your firmware should be available from GitHub Actions at: ${github_repo%.git}/actions" exit 1 fi From 781df31ec482039cf1ca75564853126157aa094f Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 17 Dec 2022 15:34:24 -0800 Subject: [PATCH 257/494] fix(setup): Fix conf download path in PS script --- docs/src/templates/setup.ps1.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index a2bf0c58..f90c7488 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -217,7 +217,7 @@ if ($keyboard_type -eq "shield") { Write-Host "Downloading config file (${url_base}/${keyboard}.conf)" Try { - Invoke-RestMethod -Uri "${config_url}" -OutFile "${keyboard}.conf" + Invoke-RestMethod -Uri "${url_base}/${keyboard}.conf" -OutFile "${keyboard}.conf" } Catch { Try { Write-Host "Could not find it, falling back to ${url_base}/${basedir}.conf" From 5cbe572f7df46ea01d9f0d16ac0c120c7ae3d017 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 18 Dec 2022 12:54:58 -0800 Subject: [PATCH 258/494] fix(display): Re-default to blank on idle for OLEDs --- app/src/display/Kconfig | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index a503cc46..c0753358 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,13 +6,14 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LVGL_THEMES - select LVGL_THEME_MONO + select LVGL_THEMES + select LVGL_THEME_MONO if ZMK_DISPLAY config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" + default y if SSD1306 choice LVGL_TXT_ENC default LVGL_TXT_ENC_UTF8 From 11ca0098a5920aaa59738af9ccca3dca725d43f7 Mon Sep 17 00:00:00 2001 From: as29 Date: Tue, 20 Dec 2022 15:24:32 -0500 Subject: [PATCH 259/494] fix(docs): Disable encoders in dtsi (#1600) --- docs/docs/development/new-shield.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index ea26f6eb..2e468fe0 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -461,6 +461,7 @@ left_encoder: encoder_left { a-gpios = ; b-gpios = ; resolution = <4>; + status = "disabled"; }; ``` From 3eb06f137bac1f8ae8ccabb3464dd5c1943b784c Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 11 Dec 2022 12:20:56 -0600 Subject: [PATCH 260/494] feat: Add global macro timing configs Added ZMK_MACRO_DEFAULT_WAIT_MS and ZMK_MACRO_DEFAULT_TAP_MS to set global defaults for the wait-ms and tap-ms properties of macros. Also reduced the default timings for macros, since it's been reported many times that 100 ms is too slow. --- app/Kconfig | 8 +++++++ .../behaviors/zmk,behavior-macro.yaml | 2 -- app/src/behaviors/behavior_macro.c | 4 ++-- .../timing-override/keycode_events.snapshot | 2 +- docs/docs/config/behaviors.md | 21 ++++++++++++------- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 9902046d..358d5d14 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -355,6 +355,14 @@ config ZMK_BEHAVIOR_KEY_TOGGLE bool default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE)) +config ZMK_MACRO_DEFAULT_WAIT_MS + int "Default time to wait (in milliseconds) before triggering the next behavior in macros" + default 15 + +config ZMK_MACRO_DEFAULT_TAP_MS + int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" + default 30 + endmenu menu "Advanced" diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index ba5bcb07..00947685 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -13,9 +13,7 @@ properties: required: true wait-ms: type: int - default: 100 description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. tap-ms: type: int - default: 100 description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding \ No newline at end of file diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index a6430a53..46fdde3c 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -174,8 +174,8 @@ static const struct behavior_driver_api behavior_macro_driver_api = { #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ static struct behavior_macro_config behavior_macro_config_##n = { \ - .default_wait_ms = DT_INST_PROP_OR(n, wait_ms, 100), \ - .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, 100), \ + .default_wait_ms = DT_INST_PROP_OR(n, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ + .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ .count = DT_INST_PROP_LEN(n, bindings), \ .bindings = TRANSFORMED_BEHAVIORS(n)}; \ DEVICE_DT_INST_DEFINE(n, behavior_macro_init, NULL, &behavior_macro_state_##n, \ diff --git a/app/tests/macros/timing-override/keycode_events.snapshot b/app/tests/macros/timing-override/keycode_events.snapshot index 650d6747..0ff45904 100644 --- a/app/tests/macros/timing-override/keycode_events.snapshot +++ b/app/tests/macros/timing-override/keycode_events.snapshot @@ -1,6 +1,6 @@ queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 -queue_process_next: Processing next queued behavior in 100ms +queue_process_next: Processing next queued behavior in 30ms queue_process_next: Invoking KEY_PRESS: 0x70004 0x00 kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 queue_process_next: Processing next queued behavior in 50ms diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 67f5ce74..2ff99d58 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -120,19 +120,26 @@ Creates a custom behavior which triggers a sequence of other behaviors. See the [macro behavior](../behaviors/macros.md) documentation for more details and examples. +### Kconfig + +| Config | Type | Description | Default | +| ---------------------------------- | ---- | -------------------------------------- | ------- | +| `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | int | Default value for `wait-ms` in macros. | 15 | +| `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | int | Default value for `tap-ms` in macros. | 30 | + ### Devicetree Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro.yaml) Applies to: `compatible = "zmk,behavior-macro"` -| Property | Type | Description | Default | -| ---------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ------- | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<0>` | | -| `bindings` | phandle array | List of behaviors to trigger | | -| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | 100 | -| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | 100 | +| Property | Type | Description | Default | +| ---------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------- | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<0>` | | +| `bindings` | phandle array | List of behaviors to trigger | | +| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | +| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | The following macro-specific behaviors can be added at any point in the `bindings` list to change how the macro triggers subsequent behaviors. From 6e99a4869677b809e3f4a77c87705beb0012f24a Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Fri, 2 Dec 2022 00:03:13 -0500 Subject: [PATCH 261/494] fix(behaviors): Mark sticky key release-after-ms required --- app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml b/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml index c04883c0..172f20a2 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-sticky-key.yaml @@ -13,6 +13,7 @@ properties: required: true release-after-ms: type: int + required: true quick-release: type: boolean ignore-modifiers: From 58f8c97d3cd37a0da335bed84fc457aa85b17bfe Mon Sep 17 00:00:00 2001 From: Ladislav Benc Date: Wed, 21 Dec 2022 03:49:17 +0100 Subject: [PATCH 262/494] feat(shields): Add a Reviung5 shield Co-authored-by: Pete Johanson --- app/boards/shields/reviung5/Kconfig.defconfig | 9 ++++ app/boards/shields/reviung5/Kconfig.shield | 4 ++ app/boards/shields/reviung5/reviung5.conf | 3 ++ app/boards/shields/reviung5/reviung5.keymap | 38 +++++++++++++ app/boards/shields/reviung5/reviung5.overlay | 54 +++++++++++++++++++ app/boards/shields/reviung5/reviung5.zmk.yml | 9 ++++ 6 files changed, 117 insertions(+) create mode 100644 app/boards/shields/reviung5/Kconfig.defconfig create mode 100644 app/boards/shields/reviung5/Kconfig.shield create mode 100644 app/boards/shields/reviung5/reviung5.conf create mode 100644 app/boards/shields/reviung5/reviung5.keymap create mode 100644 app/boards/shields/reviung5/reviung5.overlay create mode 100644 app/boards/shields/reviung5/reviung5.zmk.yml diff --git a/app/boards/shields/reviung5/Kconfig.defconfig b/app/boards/shields/reviung5/Kconfig.defconfig new file mode 100644 index 00000000..9477db39 --- /dev/null +++ b/app/boards/shields/reviung5/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_REVIUNG5 + +config ZMK_KEYBOARD_NAME + default "Reviung5" + +endif \ No newline at end of file diff --git a/app/boards/shields/reviung5/Kconfig.shield b/app/boards/shields/reviung5/Kconfig.shield new file mode 100644 index 00000000..2ecf47b2 --- /dev/null +++ b/app/boards/shields/reviung5/Kconfig.shield @@ -0,0 +1,4 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT +config SHIELD_REVIUNG5 + def_bool $(shields_list_contains,reviung5) \ No newline at end of file diff --git a/app/boards/shields/reviung5/reviung5.conf b/app/boards/shields/reviung5/reviung5.conf new file mode 100644 index 00000000..a8b4a868 --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.conf @@ -0,0 +1,3 @@ +# Encoder support. Uncomment to enable. +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/reviung5/reviung5.keymap b/app/boards/shields/reviung5/reviung5.keymap new file mode 100644 index 00000000..93669479 --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.keymap @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +#define BASE 0 +#define BLE 1 + +/ { + keymap { + compatible = "zmk,keymap"; + + base_layer { + label = "BASE"; + bindings = < + // ╭─────────────┬──────────────┬──────────────────┬─────────────┬─────────────╮ + &mo BLE &kp C_PREVIOUS &kp C_PLAY_PAUSE &kp C_NEXT &kp C_MUTE + // ╰─────────────┴──────────────┴──────────────────┴─────────────┴─────────────╯ + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + ble_layer { + label = "BLE"; + bindings = < + // ╭─────────────┬─────────────┬─────────────┬─────────────┬─────────────╮ + &trans &out OUT_TOG &bt BT_PRV &bt BT_NXT &bt BT_CLR + // ╰─────────────┴─────────────┴─────────────┴─────────────┴─────────────╯ + >; + }; + }; +}; diff --git a/app/boards/shields/reviung5/reviung5.overlay b/app/boards/shields/reviung5/reviung5.overlay new file mode 100644 index 00000000..24b0f582 --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.overlay @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <5>; + rows = <1>; + + map = ; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + encoder: encoder { + compatible = "alps,ec11"; + label = "encoder"; + a-gpios = <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/reviung5/reviung5.zmk.yml b/app/boards/shields/reviung5/reviung5.zmk.yml new file mode 100644 index 00000000..9be3811f --- /dev/null +++ b/app/boards/shields/reviung5/reviung5.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: reviung5 +name: REVIUNG5 +type: shield +url: https://github.com/gtips/reviung/tree/master/reviung5 +requires: [pro_micro] +features: + - keys + - encoder From 14324390e8df33df232cca20556b39c0ae4e1c1f Mon Sep 17 00:00:00 2001 From: "byran.tech" <61983584+Hello9999901@users.noreply.github.com> Date: Thu, 22 Dec 2022 21:42:57 -0500 Subject: [PATCH 263/494] fix(boards): replace nRF3840 with nRF5340 --- .../nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml index c8472428..444de996 100644 --- a/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml +++ b/app/boards/arm/nrf5340dk_nrf5340_cpuapp/nrf5340dk_nrf5340_cpuapp.zmk.yml @@ -1,6 +1,6 @@ file_format: "1" id: nrf5340dk_nrf5340_cpuapp -name: Nordic nRF3840 DK +name: Nordic nRF5340 DK type: board arch: arm outputs: From 77d60182bf1b4704601ccb9c1207f108cbf08b90 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:21:42 -0700 Subject: [PATCH 264/494] feat(docs): Recommend USB testing and warn about BT pairing in user setup --- docs/docs/user-setup.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 06c168b3..3becf5fd 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -193,13 +193,14 @@ To flash the firmware, first put your board into bootloader mode by double click or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass -storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. +storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is +recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. ## Wirelessly Connecting Your Keyboard -ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your laptop or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues. +ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. -ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. +ZMK supports multiple BLE “profiles”, which allows you to connect to and switch among multiple devices. Please refer to the [Bluetooth behavior](behaviors/bluetooth.md) section for detailed explanations on how to use them. If you don't make use of the mentioned behaviors you will have issues pairing your keyboard to other devices. ### Connecting Split Keyboard Halves From 080c47825f9985c6cbddad501a3af1b4e721736b Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:22:18 -0700 Subject: [PATCH 265/494] feat(docs): Add caution note about split peripheral sides to user setup --- docs/docs/user-setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 3becf5fd..961d1079 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -196,6 +196,14 @@ Once this happens, copy the correct UF2 file (e.g. left or right if working on a storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. +:::caution Split keyboards + +For split keyboards, only the central half (typically the left side) will send keyboard outputs over USB or advertise to other devices +over bluetooth. Peripheral half will only send keystrokes to the central once they are paired and connected. For this reason it is +recommended to test the left half of a split keyboard first. + +::: + ## Wirelessly Connecting Your Keyboard ZMK will automatically advertise itself as connectable if it is not currently connected to a device. You should be able to see your keyboard from the bluetooth scanning view of your computer or phone / tablet. It is reported by some users that the connections with Android / iOS devices are generally smoother than with laptops, so if you have trouble connecting, you could try to connect from your phone or tablet first to eliminate any potential hardware issues with bluetooth receivers. From d993b0343304c1d7f67837e1d5a42e70bf05a8f2 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 12 Aug 2022 14:53:55 -0700 Subject: [PATCH 266/494] feat(docs): Refer to troubleshooting in connecting split halves --- docs/docs/user-setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 961d1079..a2e491b8 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -213,3 +213,11 @@ ZMK supports multiple BLE “profiles”, which allows you to connect to and swi ### Connecting Split Keyboard Halves For split keyboards, after flashing each half individually you can connect them together by resetting them at the same time. Within a few seconds of resetting, both halves should automatically connect to each other. + +:::note + +If you have issues connecting the halves, make sure that both sides are getting powered properly through USB or batteries, then follow the +[recommended troubleshooting procedure](troubleshooting.md#split-keyboard-halves-unable-to-pair). This is typically necessary if you +swapped firmware sides between controllers, like flashing left side firmware to the same controller after flashing the right, or vice versa. + +::: From c23443a086b62833ba0b88dd3a271993d3bc9cea Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 23 Dec 2022 05:02:18 +0000 Subject: [PATCH 267/494] feat(docs): Generate new shield interconnect docs. * Add to metadata schema for interconnects. * New conventional location for pinout diagrams/pics. * New component to generate the tabs for the new shield doc section on interconnects. * Add XIAO and arduino uno pinout diagram. Co-authored-by: Cem Aksoylar --- .../arduino_uno/arduino_uno.zmk.yml | 10 +++ .../interconnects/blackpill/blackpill.zmk.yml | 7 ++ .../interconnects/pro_micro/pro_micro.zmk.yml | 7 ++ .../seeed_xiao/seeed_xiao.zmk.yml | 7 ++ .../interconnects/arduino_uno/pinout.png | Bin 0 -> 118303 bytes .../blackpill/pinout.png} | Bin .../assets/interconnects/pro_micro/pinout.png | Bin 0 -> 492581 bytes .../interconnects/seeed_xiao/pinout.png | Bin 0 -> 495415 bytes .../pro-micro/pro-micro-pins-labelled.jpg | Bin 490463 -> 0 bytes .../development/boards-shields-keymaps.md | 2 +- docs/docs/development/new-shield.md | 31 +------- docs/src/components/interconnect-tabs.tsx | 74 ++++++++++++++++++ docs/src/data/interconnects/.gitignore | 1 + .../index.js | 16 ++++ schema/hardware-metadata.schema.json | 22 ++++++ 15 files changed, 149 insertions(+), 28 deletions(-) create mode 100644 docs/docs/assets/interconnects/arduino_uno/pinout.png rename docs/docs/assets/{blackpill/blackpill-pins-labelled.png => interconnects/blackpill/pinout.png} (100%) create mode 100644 docs/docs/assets/interconnects/pro_micro/pinout.png create mode 100644 docs/docs/assets/interconnects/seeed_xiao/pinout.png delete mode 100644 docs/docs/assets/pro-micro/pro-micro-pins-labelled.jpg create mode 100644 docs/src/components/interconnect-tabs.tsx create mode 100644 docs/src/data/interconnects/.gitignore diff --git a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml index 8ec164eb..d6eb89a3 100644 --- a/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml +++ b/app/boards/interconnects/arduino_uno/arduino_uno.zmk.yml @@ -13,3 +13,13 @@ description: | Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only supports 32-bit and 64-bit platforms. As a result, boards like the original Arduino Uno Rev3 itself are *not* supported by ZMK. +node_labels: + gpio: arduino_header + i2c: arduino_i2c + spi: arduino_spi + uart: arduino_serial + adc: arduino_adc +design_guideline: | + The GPIO pin references for the Uno format are a bit odd. The `&arduino_header` label is used, but the numbering + starts at the `A0` pin and increments as you go counter clockwise around the board. That means the `D6` pin + can be referenced by `&arduino_header 12` in your overlay files. diff --git a/app/boards/interconnects/blackpill/blackpill.zmk.yml b/app/boards/interconnects/blackpill/blackpill.zmk.yml index d3fcdc88..0d91e96c 100644 --- a/app/boards/interconnects/blackpill/blackpill.zmk.yml +++ b/app/boards/interconnects/blackpill/blackpill.zmk.yml @@ -6,3 +6,10 @@ url: https://github.com/WeActStudio/WeActStudio.MiniSTM32F4x1 manufacturer: WeAct Studio description: | The WeAct Studio BlackPill has grown in popularity due to its low price, availability, and utilization of the powerful STM32F4x1CEU6 microcontroller. The BlackPill features more GPIO than most other boards, but also has a comparatively larger footprint as a result. Many clones and variations of the original BlackPill are available on the market as an affordable and more powerful alternative to many popular boards. The official WeAct variations of the WeAct Studio BlackPill are powered by the STM32F411CEU6 and STM32F401CEU6 microcontrollers. +node_labels: + gpio: blackpill + i2c: blackpill_i2c + spi: blackpill_spi + uart: blackpill_serial +design_guideline: | + ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the pin labeled `17` in the diagram, use `&blackpill 17` in the devicetree files. diff --git a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml index 78aa14a1..83aa31c7 100644 --- a/app/boards/interconnects/pro_micro/pro_micro.zmk.yml +++ b/app/boards/interconnects/pro_micro/pro_micro.zmk.yml @@ -12,3 +12,10 @@ description: | Note: ZMK doesn't support boards with AVR 8-bit processors, such as the ATmega32U4, because Zephyr™ only supports 32-bit and 64-bit platforms. As a result, controllers like the SparkFun Pro Micro and the Elite-C are *not* supported by ZMK. +node_labels: + gpio: pro_micro + i2c: pro_micro_i2c + spi: pro_micro_spi + uart: pro_micro_serial +design_guideline: | + ZMK uses the blue color coded "Arduino" pin names to generate devicetree node references. For example, to refer to the pin labeled `0` in the diagram, use `&pro_micro 0` in the devicetree files. diff --git a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml index cb9f6b56..48080c7f 100644 --- a/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml +++ b/app/boards/interconnects/seeed_xiao/seeed_xiao.zmk.yml @@ -8,3 +8,10 @@ description: | The Seeed(uino) XIAO is a popular smaller format micro-controller, that has gained popularity as an alterative to the SparkFun Pro Micro. Since its creation, several pin compatible controllers, such as the Seeeduino XIAO BLE, Adafruit QT Py and Adafruit QT Py RP2040, have become available. +node_labels: + gpio: xiao_d + i2c: xiao_i2c + spi: xiao_spi + uart: xiao_serial +design_guideline: | + ZMK uses the "D"-prefixed, green color coded pin names, e.g. `D2`, to generate devicetree node references. For example, to refer to the pin labeled `D0` in the diagram, use `&xiao_d 0` in the devicetree files. diff --git a/docs/docs/assets/interconnects/arduino_uno/pinout.png b/docs/docs/assets/interconnects/arduino_uno/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..b796070063248fba51053a609c1e73e16584efff GIT binary patch literal 118303 zcmd43c{El1A3v(6wuVD0X&Y0KA|0nPMm$nV8Imy$j?!R0W*K|72g#5jLn$g{o-&?e zY$wT-Df4t9^Grg9?q?tLeb&1F+_ipp-F5#+?DHAk^ZWIFe?I&8T~ocpyo+-e0|NuI z(&Y=+85nlqz(1xPTfvj^#LPS3zl+zDH7`!g&dz?^)1=AJ<1Rb*Vy}O2NJ;r82K#@0 z|Naezyoh^q=rEuE{kw-^e5;z8^xmeXzssEY{uSlj`Lq7u?L**MY~6AYr;U;JrmLPj~;tFl`^2 z$}v$`NOR#iYk8n<07*Ci2dFmh9Fi^|JxO;t74yVFr~c|Yin@@(^!8m0?>~NL8u?lQ z*`3xcZ5Di10i8LbKY}EvX8k&VZ>y{La-r_5P2xH2hp#jD@%+U=5HvLmaG{b~W}k^i zS3<3Uc=mkW2^AvwVX&A|yPfJv(=zw@ho28IFob2*xi*wM#@%sG@4pjPKr2BZoo?d% zya72e_?(3oU#v5mx7MQIkrS+283;!c@*3;{uOD#e6t3w<@~e}`==kc&Q_J|z$({*toM1l5(|*-L=>e{; zf_I+#_l@(G_IH*x4h%O+Bo1dcO!cVC+$Ttu;uIg7*gdun39#uy^w%h~3_hWKfQG}% zuW^&+288ssW9ejc%>RB1V^a^l&El~b-kF)P8cz{C7OT{+c{XDh88KsG{AyBm{8-Se z{u4e2br)5$FxCnSvs~wqZbtgtoUQ{m|U91u#;)e{q&&o&^(p7Zp=X=l8WQOX##z)Sk=atucAzJM7R0xq<~hCWk# z6#D35!XPz1wjb$jH#Z}rQww&e-;-3Ws`#@RCVLnjQ2CFT-!Q#@bGV4`B69Vz_(}8n zbJb9GcHjP5k)mvzYCKZwAACV0rnOgqfx#|VQ=(U(8Lx{Dx=P`lYutzCFzxXoPF_7XsUx>tWwHefQff{q5I^U6z;;-!+R~3 zzim?hbDU30Xh^?EG7L@A5NbQy`on_}Ug@zXqoYgEv8AOiH00Z1)^YyZTG|J+Q!3Ty zyF?|*&iJ3DkPa`J+Mr3TFPG1mcho^;)rF)VnZfQXe#0Mj2(-B@C4U6O*OUzX{r;0~ zW+QY$Ph7wOoei~bozQFHlPylf1%;=)#VkvrF=OW1+66%W6OCe=_8r#*$)J7*g9zvBB@^=8NA_*~jA3Q2Pav1yhMjpr*xa6WspsMT+MCN+uz^g04H{Qx5eRKm(Hutk^O zPcq{bi4trVV7r?}C`i_`{ z6+OD>fRZk5b57Y6q25eU_*gmklPlRDej7K`I;Rit|sbI#LW7%_IU_vxMed-5-x4uXNi!gd(OuM*D{=As;R{IYo{Dk$yYh3zBdm%?nJq5X08WH?H)9Mu+o?H+l3f(#Rz z1GX`pNuj;Lv#aE3U&#LYkX9CbYEGKsa92GiGrJC7gVYy zW^h>j;#0|(>ANy-Km9vWWBPze)maZCP9wObCJhchnQ=Z^mF?sQtq{_63FnhS=`6NF zDr2(`aPhf3A5suzt42Z3&l&}^Cw*Ua7|SG`M0La286LDhw9=SoGc*rtln}~ent3tR zcjxX;OBJS+&i(%;)Rx@rr1<^tcrvz>wLE!M$7$i?_p`AzrrEJBr-yg4oJ*3pcnkP> z*`87@entic5uvUop0mmg3NqIi<0d1|epeL)8HE9_OB%H`W6!XDQ;74hlV@Of4;6CX zpEWaMPxGeu;utU9WM~Q=4`cC^Sma#X26NBvkE<1EDuYU?haUJ5r~BJo_b^xwAjZFL znu)epoOUM?j_=z_L&6Th+j^>@q0e=VAp!@+`;ooyw)fBg!T@s*BDZ4s1G0NA^TI3Q zWrrB>pP?=IHW%9czHCQ$JmpE*O49>*2I93qb{fLbct1dp^Y#eU5Fe#_*767g{y4mC zdN*ED$K}Amj6DnX@>?0Vkmd0^$f$gfc)1__8ETE+@c@^+cPo+n0H=-9*xzAFsj(+{ zOS&$0UCc{Y;iiC1!8#PuneMV|eD=2Zb7|RLub8dncXRq}thR<{XLdy6s{?!{K0)A_ z*iDA)0@B$wi0f*maaXb4!s9=Sc*4&G;8bhgrI=5U2DY=U`~%#V5oBaf8jh9v5g5HzaVH1ls~;gK>X3hxCLPYfGq4J;Y{w$0S8VngZbG z?y4Ncd<+yIPznt^lx?;DI;WgnCpN(W)}W8$S7u3NBVj^KwZp#q{OmuEhIK?>%=~tU@vjUNfuZG@3K(`Wh zD53hsFMT}`m}!$Bi(6t95723vC^qo+6%IPxL~?Na#WT-uJz)B2gI*rnv93?anx;>y z3R9=g7$4g*(U1JIPC~W7$AqR|zD$~>#Vh>_NTT;o=Em*%$^Dn)@Ef1? zk*j{KI;SNftP8udzUVb1-Rzy?Z8Cjv>&*1KT)fTM@|1X2^?0{j@9N@ikE-tHR<^!= zy`Q0qm8&cU2816{jW5G6sZJaJJh+XR*$k;o;MrAg^Z9QtzScTyu#edWT~?H8ekkOS zK|8Y2 z^BE1W)_VIee8Kp1dsH`6mgCDSZjxDuW5l#y1-?BL$sT37 zo8-pPK@;tkmq>2ejxzg%`FtkKqH6|_v78=gYBFESI{c1B=E9hR;fc9B_X{6&6-$OE zRtcw6q4zabPrYwSc4iTHc87c&W@0VB$1KEtkyXG;UYPEX{q1;4k^|~~(IP*|baA*J zX+0!j9$`~me6JvzZB=9meV{&QwxGen{`@Nx*UUe=UrhBNt3Vi<*(miFU9c8#k)rKw zxJ&bmV?#l7l7kIOoNnucnjXFKcbM;8jh{JfSOJ+&2)?)sdFEOOaWI{DM~^QvZm>)< zl{9d#q?R`0$hJ>AT*lD>eYA&Q&ru^;^tpH&93T*!m6ImN|1AC={?v~M1LY;>sRJ|w z78IhA=Iy`CVAFh4lsO6uNcYL4u2&w#ywA2iXukB@?swFMkhrALck(*?{so1*=EJ0kk7P?O*cNxft1c-PUA3Xp90`*YDH{@>X z2`Z_p4{^U6&d~`?=@g0dToXBz;2Y7P{{Sa0`E`$=d5m_ZzO&@zo)1?xBwC4gj&2^% z6uh30ywhm(fG5`=GNJ&=0B(Y1VV3<|$JpNdcKzSW`wLVBy2k^G)wsRGb?M>7xd1nr zt?-+ZIPEF~E4OsF2Aqg=Snz%k7C&oU@aT+2+w*u_tboo_g5G&}URUSMMaBy0ci2>J zTwNmOQ>ED`$r>K-bW^uFTba5WW&tSoJeitQbIRXoaN%#(U7bJPwdi^+JX1jXUcGL< z*Fbs+#Ciz+c$!EKf0r7HOHZ&xld16w3dHFr`PCWn= zRUMAQE`9d17lXE7R)}wFfTkYpuN_7bBvt$PW#GtKCl%lP)~3gVb1ezlxH- z)7V^gwpqYYYl%1}+tA-Sc^`)b%BW`O3`%pux81zoZ9wQ1&a!@X;g{y~OLtG-j^=AK zOPS1DnZJ~#tutZ5PRC$nGiH(6$%SqdN;t8=5>~#)Z=N?rZo6Jf<*X7fNceXBhVXgW!;^Cx+h=(uRot`W2)IaZL zw=m)o>9BrQGwV&v3}cG%CaA>id8>X|LD!)>X|1UH@!k&uAJvCgHR$=|rU$Hi)vRS4 zX&A=qau>i0I}WO`De!Uy9yt?Od-lcmNJ3cso0Q6XZj(EjUP#Qt>s~&E^hP_vHL_8P zx{sZ^i76m-&#dn24|>F@#?ADF&B{9=kv8`QM;8ny956~GnBI8oEDQ(ml2LamOTm1W zs)ASTZ7NOkddshxkn8KD%;24W&-;qQ!t-WNWK!;YiY!ryT`DWjMM=DHO;_X>9P=@S zXrlvzNYiJMZ}sCuy3f8-{>he|!9TD+m3&pRA2A*H{Jx14R#iyS$C3qb|I-kHkcij0wJjWphaQx(ddj%6AS~ZCiE+1##A59#y+h65 z8f6JP^`sv;2M;E*rRCt+YmVRZ`&3ADx-qoXsR{yXZ-}n(vrH zLf3h&gee!e2B(#KcQv_9;fxsUq~e+(uXEeQrp(OIdw4p>ufH})>b#p2%&o#$7N*L* zF0)fHzNv+&1NuMX-*n_R2A$Z!Vuy~`_@tnCcD;zCl&HUL8u!hN<0Vzk!>^CM&~<00 z`-L!jDr@YcPSxfTHYa^~=a;yaZCGd55r;P3 zfxB84TjI~%=AJ~vP?8!Ppr2KuQTs}qb(JwD#O|W;&ui0_#~3kZXt>0v_N}lTDjj=v zUOX;|KW$)KrfTHhc)CtR#9!TVvH@++%bRQ z_00sU)6)e)GQw%I%`sFGz93b~;reIBu$|r$rp7v=e^-4HY~1}${wdwqPQ79q@2_4F zNpNPGxY4~k->(V&9r9dtCTA{FPQ%vaO1pE}e2n8w`bN4@4zdeB4$D+loE;;P=spXO znLQlrb8JL+I}iWnlOM1;FN@C}6)C-}rJ92WHxQgMyzlMd6L-E<{1vw#dxj3c$np&D z>$vyv)>V07UD@}L+yPeVUjTGrnD0GAk9=4s^#8>_Bd)H@jGqHoZO1zHyb1@TfAxr~ zUXVUW1@3lfh_B09wdwc;L0?8JIlYHm_h{?vN>J9hc>c5H^<)`g% z!F%e`TQ9|Cr<=LE>^Gq6_!Y(1yL7G%+`G|`{L8TeM4@XilL|gcoX8)cT5#V^+oJ-* zyt-L9#aul5GvTyP&|J^~vy18ZxE>ZRv#<}N{tU1i-tYnyh#>PGT=PiNmq-}9VcE-j z1}@^|`&xOJ<2zz2zYhH`5ec4O?3<6cf{*QrXsd~@2FLz7C{MhG-?3g?cs%QpEL5e^ zEVK1OqL08uJYx1|uAhmsm8Tw}<7!fdZswkNZ`b8%mVsK^-i+DIpEJne{kuJiUwwd@ zuD~_poEO#iF#Q=%y9Ngc*`bZ`>OD}Ce`~X%b1s$U+9m~^H`2q~AAK-81s7EtCkB1La!}kB zPe~@D*MxR%zjza?SLk4W{L{tfuM=NiCWa;_eu7Ti;Z8kMG#!ld$-=eNU9{BW_%qPL zSc{C-Kf$$tF3phfts$h;x0XuMEb)2xpI!6Ax-2qYXFhXG+k0ui0EBb*8b~1xr#Rq# zo#hBv>f>>K-p5|+=;)A&*4GAXr3_JWV)gM43lx|F1bs>9`Y(o|&Zlw9U907!h^AmtM6K<;YL zc3}X4Un9L~cFTcJaS>lNF+$c&gT{{6%@(j3a7Kfv=~=$sm7j1C5vu7g%+HFoiUN(S zS5`b<>bp3uuda@>o-g}l-P=EeT$Hd(+Y3n8+-Ug|;^bT4>t^~y`^iJD7QWr#W{Yjk z=uN`Cb2tACItJ9u)Mm@&n}v&i%ct6psC(lgoQPV&3ETgS!R4s%M(ID6G#lpedn8S? z77QFrN$YjAMT?3Rn+0FC?EN#c@HwgZv?s|U;^`w2!Re}_ap?6d=To`IWd;%TcF2EJ zXCM`$o^Gbog{q~mPeA@vI?hv};dzk%0LKoUl;C*NFkx-p*KKC|s*Y81izd&i1CM)n z$xrTJwb@qd5hU#eueyT<`F?lEFT?(V!+s-w!vR%z_S~i8m|xKiR+zW6>!$j>`O9-g z5niY^TWaT<`yJ01;hL)3Ux%Y_{!c<&iR`c7W~TDx^qq{ITA7MJJ0irBoX|wK;6$5R z6U@^AXIt>P@)u9$*8A=qbx}$;Yk4cqC1%yw37t9L!T&_wI||tLdQ6Bf)1m6C-u3bCUvZc%6|EvM{s{-XLYzc46GVV z<3w2Cu42^M=2+J@c-!F3(utXs8fa!8p5623^5jX6$NJ(s@H=Yc+kUz@4kEg;r+U6i zBxy3?cPOj%t~|hj$c8SpxrQ>r+v453tV-7u$mUMB4N3Nld=MxKPkW>C@m4od5)YCug!}?U}*)@{4`gr?x0e8e8Hd?ukM+#wYLF zO577$wdN0O0Las5tH?VV^8PxoFwAfuF9!G{SLUyc$vUW=IOPyQTpD}?gzd(Wv(F3n z*R8p7?62?0qmN*8g)9mC$S73pSWj{H)YqKTV7<@d^Z`@V%hZ=!yyy?;%uQAQT=hs| zWCB72)FC(zD?DW(2M`=k6|qi`*kh2yG0NrfiHbEq=R3qO&j$ey%M;iqrv*VACH9Fl zHv!tPyh{OD1Rw%H5Dg?dOoQ0cRoGm*KVVI)Lxjh;l90pK1;E@V8w;%`miP1+*W<&! zITh?opMfn6*8I=ows1@CDYIVl!Y5A5t`k1v`>VlR%qmf6$O-L!`Q=Ic3o{YHNpYzl zKq;UJ{3PcQ$@Syj{e@VnTYq$oo(C|$*aj0X<0a$hA%A@xI0E-YmoEa)zsbb_;A)+> zPZ-_wMX&LmTDNz(EM|A?vgB>eoHqA*~5o#rQhSRWe5NpqJ@b6tDWn&1;>sYV3z zHdds4&?GngJ;gg8&w*e3;{Fi}UZBoJVUub|t`n+=HUeYmkL0N&zGHYw5$C%ZAT!J# zh|{<2Q1-eBzPy{{6PtGd#0}SpyA~LQE6G~76d;fRL`0u29#Q*(wIAsO5@iZ&hO;Dt zoR$`xzYsIYv;6J9iC<+i{vwjK;gt@<9@{OG^PlowWWAgHnQ}WJC?Rx1aY189O0&>P zNrtwP(ou2H6OCClbD*X-Kf=jYLm5mb2IUGg$_+OeX)u_s`pbY^4n=-L5)vq+a>|xX z)&ubDAU)FU5!lNU;1*QcX*y)Xgnt}x$Qz1_!7LxM5xVI<*`T2cbDB*xVIw!~0DM4W z8Vk}qx2GU>t>K0E!1Cb@e!==^ox`TwUlKD@a00Pwd0`udH+{<8O*An@FhalBME4X|)1#+;qF?8+eLdZWZkwK1%w=2PjgPujHOy z*W=pTktNIFKe2#;Ioy{qWcfL6GQk1uqH4z#kXG8K3PTL0O)(e89CXM5Es9A4=Vu=( zLmP;MPawQ)7&;lW40qw9lt+*yCfnR0{h`@>DZ!kl{4xbGz0p=o80wQK>7Y|Hm#Rx{y6@)SSjiB#0s*UyzdlU zj_b~G7c|Lan}0ksuUE;L+`&eVc|f-0DBPzsA<5S`tN0s_qjqg7OtK!b#vibbcS2RJ zAK$ZXada}>l5wAAJYq$MI}`DXP3NX}lw?Ah~W$~af;KV~b*S7(cwc>XLs&fG9Cp@XxlmEZ6VpjY_$ zlL?K3A1g;&w`K@L8OnZ%&DgiDZMlz-lTsG%>d6pbxwip&521B$Y3fz0n~IFy2uO0k zKr}E5yXuJYTO+M?wnlGOv;SC&22fO@Vwb)M!^9PK5A{z?}j@| zMEy8W`oGC15j4&Poqx7zDcD?hZ~|@l*Hh7j(qQd1 ziSGX{Yha58D?u4z-{ywVP92DgSh-HEd zJ=amUtuqd`XbQ)H3pPjp2-y~Gt%EY$533*7^vW2ke=8+l)Sa^#k}$7NDWqBIp;to| zW#dQ!tiofY4(dM_=xd`o_Ne4jnhL({1^XO@R+4;%U#?Vnt#D*Deq(@>13GcUs7p=| zeuIF65ZjDBa0I8)lmg@2S?5AQ=FM0(P=IA>N2|m5RMG2E2Jte6)3d#s$z%E{K8k;N zOrLwIZ>6FJA0;)9@0pm=`2@k^$np>TKg}9fFC7)D@sJDI@JHD?NI$9xx>V{cB=5mPbkg}e=}fflOXhN!}X>G@y^d0AT{FjQ3G=L;2>M-S2VFe&u!`S<}&!NP(Dys zTcc!X&)dna!_OleGUN5!RyW-qi#Hh~$g*f*@@IE#)PL%B0#{ACY^X-rI`iwEDKdgk z!!Pd2-WkETFMgpm>u5ig!LdZ92{LvGxO38U9?ehRP3$&u`-0Qhj7R6~&`)lM6$>qa%S@zq}{&m*t(k_X^mFUz|LPot%exzy9iJts2B01JD`rkP_m7&?v z*}u`kLxy*Fl{ftiC`NS(abU7Xn^hJXpKt4#ExlGmb@`{SctesHV2rdwmA5Qfd9zVT z>E3TdpAjq#p6G7a-)G1*%uS{<$sqH|&WMPkCE;Fkp}O3cv8o#r14y@I3rE&MQmCT$ zr{F~P)$YDhgkN!K?dFCoup!xlNOXn4v`it%$_f=-`2AtehuIu2om2m%@=FxXN)a4l z-;|-9w z0#810V*a7WEOqh~nWRd+r)UdynmO-}~# zhx;VlW%1~=;hOHHG$^7F|u8%d&|9b?7UzWs>YoG|* z?f-B;_Z^AeYd{bhCRyDh+3YcH{w*TC>H1ipI|?=uG9mvKCCpg@NC&oV?S%$J;!KH#sZ+pR*r2=AF@80 zddQF*|LG$VovDJG@D#X|WE#$jll?nl!&${)lzxUkTi8Z#(bJyo^YJ$+|Faqpd8oA8 z-$G`S%UazC(&q_sdyTE4zHNpz0PktlRGLunTTkjM@votMA5^>05)wV3y^o_pPQp@BdWED zI59vt4^CDhDt5%1=DqqZQAAFI=?=V4FjYR%$c$e)ak@pjt4Hb&<8O%sGU{DG`n_Fs zJG^ouOtR_NJ~nMw5HA%vai+xNU!_gfzDj?9jG7>v`QtZFho`iU1=-$$a82qNo4!Zu zq>^YzY#&m2?)wSxy_X>AfU1)MJkK6(<};Cg#8{n5njNt&lp;=N?J*E%uMrjr9US7Q zal4;%cx4NE?_fTxD<3U(?R)I0@yzk|b zT>f4q?q4khn>+bCpoid<8X`filJqQA{p^`0lGUDXOMHHt1FUuVb`z()Y*AhgW%C2v zf?vd549=qbf3)z8(;fiTD#-KKrN$LKK2yijXyT9GbH|p~R_iw{p_q?IHl@wb_h@I7ie%ZVSBfhB$pTTiJN#o7+L%%exj729-8}43^=Gh=enD z2-1(0_3*4l)=G@EPfudeE@BkvjD?wjxlw5egGi}H^@`)pUY(fg?}(|#He*i4^jNwI zBZiUuRvdj;#UK*y#b|v{_cOGh(ApS=rMPN4w1!n23!Kw-cBq}G?iqh&!#!b=bWW}N z5b7}t{2~=dx{wxx^LPTV*k~4GrKNFS*LA*g5r^o*M7|+~Q82G+97EL}w3a;fdiMyIkxa4_Z48+@_7vG(XHppEE*qHiX&LF(OIPFSO7Yg}z zs$Fh=x@m{MfG~~&6(`Zo8<6=nQYlu6oihJ;lp_GR-Fk}x7B!r{Ws6>UM=!@P;mW&z zj19rvaX1mQSvCNs7S*Y=?)*LweCZvn&!CuH$s|q-5p6)E*kI<@LpeMw!=UIGQ zrrVU9FmOOj!Wf5C+A#sY!YtgH$)o7r3pU7aD@<(fXAP$PaUOZNHBsby*{j}+6QY@v z?x{$9pLrJ(&$PK0$;nb(8|@)lwgKVBYVcC|l&AG^nBCJ_^)%O7Pv$LckqJ<2$Ix?- z@CU%mA-JZ1^Z_XE%z9C$>jTV)UUQ>KYPsQ{3e05oaVqLhn+oTI&ZT^Etfred=CqVU)35N9 zYZ84(7?m_U0jgI{k$XkpF=iCe14wN#-_hHkjtRw$f(u`mcYT#^6aznw01IDl%uIs| za!=ww-zX4R#JVYr@(31^2!_)ybUbWTw%usWY3cQO&Z*uSiweky0H@x3 z&1u7iNdjvyfd-(g2zVwDOP2xG0H7W^06KKT|HB&(y@A2B{7It3J?kRC8e#Ci^ez-V zd^p?U6CZ=Cdi3_jc`R&gxFW%DGbn-EO;XgCvNzZJ!j6}?`jE~o%O8uN^}fxt5{RAc zn!gizAah40aU})3uIEAOp@4OFi~WvN@Oq`Js1@S|#aFt2IL+PC2wZG)Jx0nR(z}I# z8CsgNYk)-a?<704|1pzQI+uWFpX8by{^!AdA7j7vxVuiFxbs-pcz}~NEuvA`-BQ=o zECVHFtwO8CE2r)%t(@=;Ear>mS504D8E?pAooa*|h0(Xs3K$*G?X3cNE?OfrW3 zXm3We>!mNft32ZDzguGK3fV;-vT&lqrd(JYss`ONcka8=oy7BnS4VaFk?2_KSnrvk z?ASWbxDPIAg%<)VdS_>+e1D#p`T6#Om^eQ|=ChD+gS{#(&mM2pDzh)1p2`9)1)#JdNNR$s+;}3@WwmQ;|c3Y z4)dN^@zx)SV|!U_RPk-I8a<#F1|DKYX;ckKM86}F!{qh@T>yW<8a*R;N+nmFl8^RPa+_j&{ih{FxWbl~dBPFV8XJW8HK9&EjEE5X|80BEelxcF&(JJ0$nb z2_!+x$N*Ds3#oz}UDv>8ELxtwy3;d-lv?#2vCy)SYbrnu)J|h8pvCuHb2z4^Eyq8g ze|o5=xht!8(@B9}aF+vmvpz7}p~-yBRNCm34E>*P^|3ZSo%CRwEDecnAd)riCqAng z8N6TUYxN(5zxV)L`eU|wh_gy&Y2JtHIZ_gnZ-Iqu8nSo~CO-aRTCXocq0NH%mgKGA zr(NQxMr3Mw^~oD>mknKLGYxpj8@%#rCDVEnB9fMx-7$Ea+CN~=T0qOb@^v%NEC|GuL-}s*&!AcdR2ltI{rKA-Com&^@eG|KZl*)2hAws7nwNLacbs^ldt-a zt2NN}+)EX!PF-IH5w%4PI=ti^M5K@2#4n2XLqoQxvpDSbq4yak9)%6N3QWr4kOV|iG-L2Xz2GX`r6>K*Mt?@ z6_%yUPJ9hCvL7az&;b`n<&lo)1pce+xK82G%0n;u5dYM@EYatq*AvM_3aNO9;lZWl ziR;8`@QitOx=wJ3`6Y?e8><;+%bp3+L)E$q#cxqaP0T47yeD!WWfgQxI*vo?Ozx`jURg=3eBA)iMmGkw1sMDi0) z7hlusTb^R8RuA)pU_r%t4C%c0!RxU!nS5y*m39@})t?`ZNX$C-eVT(sjy_hlmIZ%va7wZm26q4(PoL(5R$61Nf3yF9~ zwE45=-Y&*f$ux7Rd6}>AF`kwO=BE|{e!KM8f|rt1YG0T+pc-{N@E}t7Ma2I_79Had za)IPyx3C{4N6+kTHd8ONY8R)Fh<1W$;3mYam3?^1gqXgmuW2G(-XG(|f3c=Xf$gJ- z1P^n#Yu-)8LWF*P_>Z3fA;4o-Hy~~C$DIXw=+{{Q$ihQs5C1@ z*rMpCF)rFS4Rc}V*ErQ_YpaVl$*2ps{!AhD^1xY>pRH(P#&$30m{S=XLhbzW>M|34 zaSQdsfvXanOZ20+zM&Y(jnEYu{c*#mRDl_{9-n{w0TAe8JMAtWzw|O13`+@o6dc@2_4%m@l zM}}zyFr_MW_w`j}@rx?f_2A|)Gk$Uc$!(I(FQld0SLc>mXm1lIv;e?!;+xhXl9kyycT8@wzX4aX;H<`~qe#?4xUk zl}LEj&;NHcZnqgFts$|BubDzy6L47W(04p)B-}gu4Nr-l^;5varkre={e0U!2lOy= zz5}P0!y8VxE8?$`czws*e78JYkT?&jjg2ev!wIY~x*HIBeppe`niBz;{)>*qR_%Ey zv}07-Jp~m6Q(`c#@0I~!Qo{F2oMQN6&CYFwtEY;)9qUgPih!5*QYSF-Kmo=(h7=z& zGObT+4Cx!{PRn;f_ZmTbn6AK0;h_Q&aUTU-UW6Zumf~VY!zV?*LTc6raoVy@bgTtX zY&q2b`aQD~x;TPgJQeWk2s^#!2tH_o`in}>^&vKEmqGjdCYpSV9#_C^11WrzQEdNV zxaMRV3K{VoNZrLqcjq_H?sV@Ju7-HW!tb%04GpdAdq*nI_NAMoJly5t?dIy)c~mK@ zcWOcI>g=SWK7KJNU~PXET`SoIG*Pu|!$ZCLTNjqKCMOm^2k7v3BxB`X)Ec;vjR`IW z$Cwd3rN3ACXNs0QG$p|=jZeHFGi&z*+ac=beMjkXDQ&~Uy`o#MJn|z60AN4giZ(gV zjo6@(B6}la<>)HS`8^nPM{;`)-A-oaOYSzo?x zj<8w#`99b;b5HFMJ-Fz>&uLVd*(07`F|f>yjceIrpd^>-{$KOLTipPK^p1D1K>52hS+=I59Nwvo(t|@9x0Y?DoS3D zvj*fJM`n6(Z?0VvUA)lJKWps>uh3gMKup702UWICU6{L!t`2xH;UAXXYC7b_YD&-E zQLWG=kF)v1pSj+3OWY%Eap;rKLIpUwYG;J$he05wg?P!!*DtfMrFt=yyxk@KnI^p6 zDiLr()nn_*5$iWditG{H3@?vRk#uDKG`%3{DT6LCGX@@T<6|4QM4H7fGa4B{=C|qa z4j6P$+ZBtLk$hE1`nq0vo0{Fh7SFp8>v&24znIHAQHNH~6lU^RAV)bw?@Tvqpn3qJ zfXp$~hZr@yxm1Bmrfn6_eIn1yZ~YQ!J}nu7v!a_6xNF-8TD~Fq-%ha!xBBU?g=eNM zy}zlMd7Ux8N#?3My~b@fAaiqQ9`@j4Bc6*#j&fN9qn1P*FEMDBb`_0#ox3|WsJe?^ zF}V~chpRi6jFg)M<4Ov4X;;$tMIOl0!yaHU`1PP|=H^`hc`vBKMQ%B*yGO2MC?3ZNd~2=b1E&o zGWyaZjr9h=5{PeH@sgvL@f6vk^PExh^0w2Y{?8slaF-JqWrn%I3*HG$gE>;ngz~1k zm|W>WwGz(XQfBl6rA?_^1G{bzqe6+U z^1g^YIL94~`L|h%szAXoh>WddRv$ba)oTN0$H9IJd@IZQ0l2s|*fJLT&6t+rpaaVs zW#-h?IaA`}CHn1M1Hu<_&IFuJh-;nx3~i^<3fjDyZZJwrNUK_!>C@AkJv`oUejoGh zUhw)si6m&cUr*(&W?T+U{S=9g@69KIBYl~0&Max)>5DCvcuB_)$$(Q<5ZKfUzc`;e zX5!VbHMzMQYE=q{43$MR_V3P(XKy1-?VDMol72=Ng3MqcbUPTg+ZLVuE|YMWt#4Fl z=3{c6YwEQvpg+S8uOzYMoy#dxcs8FgC5hI*6(Z*HaE&)ho&IOnr2YY3P^JUL4I&Ak zo01;Y_pTYLU}lUH!AQ^C16%Ce9=Gb1(U^vJPR=T;gI;8LC# zxGh#;hdO8C()A6<5;Lsy0P6e_%`&T@zUmxrk{50BH8}!zNjUDa?yoHfWrd$h zz}(t=2Ps5#ws5=MbeDQ;ht4Oboui}?xgRaPs$`6nB4(zAIlKN0bokbPNrghYOr_nq z4s)km;nw<%E63V=)5dt`QDJw3+ouv)|_b za90F-y0TcC6NPp`s7;0xj0>7T%35EJUDHo5dAQey$)~{cwQ~o!$R}F~EwGjM)(?8T zvPwsM zPYPVzZYm@hG8U$g)EQHD8`!aRZa2ck{d$Fq$phdJ)Qau~i*U!4GGncVv(NpvdpY)L z$NNLsR8kF;;Dn|&y;%Ec>~7XRW4@0gVAQjj&Wjz9Y}8WNarmEC?$e}TCOr6x2yxvO z8@yx*Zf(`|S9pPn9BWZ0ZBWy$D?`vEQy%mwfw>QX`vA+N_wn_Fq8wPIp|%!#yhKmC;xPR ze6?gVf^~8hnc#pEcBS>EIi!mh+BA)|om1`58=%#(Saq6W#c_x5UCFf9O_}bd9C&9l zo^g1Vwfx@*$;_QU39g{l>Q!KDO=Ef8BjTstX%|Z0d;FBAo5wZk z9B9vbZ08{68&&1qeIc3i=?7g5tVD8m<8E%wJE0tz!hVNAQE^%_aM#ZO#<<;{k2XdS zMnt{s6Gu3A=brnN%X19etnG(tMHY{orcAn=S`NzaS5GKapwqVnc%Ytqx@B@yz37nr zSkQOlL1N}BaCgxN(AX_6`%H-hi&1 zx8r6{)=4ziygErR2e(;PI!;p#+F$JKPX6v?oIAE)P6yLdlgL=dmIo)R{q30{h52JU zoxtr;R7q=E=-*|m*3Y`?Sh%HBozBxFJ}O7$0BeET5d%(>Hqj-fI)Y&^lWGRSLO-DB z>4MaFe3!g`)nsZYC`qY)l|6kI+xNq1ipOMsBi$u?@Dw8lZhV`EdE#!!+^JqR>j`oC zM?crVf*4Hvmq}J<-MFF)X-W8%6ay>%A9}8ocO(Bw37Zs=ijw#Tk*mSzd^T?+-QM#Z zQFj$)N-H~BFC%FDmdht{C!^DHvqz-b)a0Wa6{lOw44G)n8xS6)dhV zM%lm1XY{_wvxFBrML3uyXXnS=)2D7nm+}_+n)TYE3$*U_=6F#qZZf*RxIVLsSSah` za)~M9%uPZ@TH#8TpwgO$Ov~Zbq8X&Wfc8^)EMYZ&{jMp316TbLl56nxhIi6EdY)#E z5;}ie&Dm!?=Mnk6ncyjx_gJi4CgU+hkFnnvzi3C{^^h%fD=7Bl9FkiV^3-cP;wrh( z4W?1>QTBO7^=%SeHYUdRy#}^>6|RJf7tkC!ou`vx!v7q1$u>Z(wGgdd)Pj)1EX2fI z%b#CsNSX;LS}9-pd+z!zHO1t;a+XD;aHda0@}9AG%MX9k`+s=JaNH-cVxHB6z!9S6 zZjsh=q2Db;dWJ$v=hVo&L-_`M&S(Uu%?(Cy_{YTNR=`9@sS=K;KqoFYg~j)aB_9YZ z2Jt3K7r{%gQwxJHFS^ggB{Oq z_{x<(J!cmkT)QaX*LtDk(4RICNqHxpV#q zT=3<1o38Ed4AFAh_5tMf*`BcHdBlN4}%_>4O-h<>M0S3*KNB=0f({p-#tsPdY8?zJ=?f| z7j-;`kyf`MmQQbf+g3WL zu>v5mX`pjFk#I2CK394&CLNhr=b8duGz^foe_;RYbo^@cD=E&E+|p**1#sQLjY>=E zfz(8v;aYm*oTur#Xwg;20E2HWP~xTH0yP+Y;@|x<;eHgxb>00f0)rP#OY?>vS1m-= zK>e?-v{L#fM}*o0ysX1<@gv`&zFiyCMH8dNEW2K>1?%nils-ac`9lw<4 zK`wvqr5c~?UzJ^6GZ%jR^>?3dMX9?ke(?^Tokgplg~v%v2ff4L7Dk+&zN=TkRnqQB zBp>j&t^;%@>5Gf;NtGr}7xI=T64m&B2+1C+EFpO^bxYztms9qqGzu-}4aj9=&^vUv_3OO8+VtA& z`KRO3ZMPEZw(F#f8UK8G+GeQrSM0pqnC;V*j)K@1I1lAO%1gUQ*VvpB2J+h$!d)j_ zJ|biDBleu39O6@pgH)2kyPs_;J)gQ$ZBF1N9g?EJ*%|mg86}0g)^-V>rS{d7SU3vv zw9X$lGPJZqNtXa@?I04Y!R-sDIw-|E{k#1+$FBTJ(tO!e#Ff}z&uF>&@rv7f&%(;) zspEeZrexm3DyH2Is4DAcO+^>)sM|(o^p*3&l|nmlRc ziPP82Z&z5&icj7N)VD#sD?#66nM%uR7R-C0qhx7=UXyOVst}(ql5hRvMZnp@2HEA& zZqTY9MYyQ6?SshCxat8{71zmV;jA#6mCqVUmCaI}Hw+g)ukAQ4VBK%kLSci6QQ+OT zqG;TtiOQDcPDsSA9c(rj#nOWSJ7E=FmP3o9Wt zaDo;c?<(sUmTx0r-t`EFPmPYkfeV0{?uywlCsJDqNr}-~1sAuUNcg5AG#IzD+pK(f z1?Sx9@)3NS1s}YULnQZVj65?SjPxU86t70D>odOdr>L}7N>xGKU6x&#uaVK)T7J|+ zJylR=WEK1EQ-S(;_KqR1ofC0Tia^B97bUyBw;K9?taCs;$GCpuT@9@Y4i3+DkG=h# zf9|%Ugduj+2@as-#*qa4mDaQi#F;bhO+7A4cc;}(o;u5YqILVyxt|xu zcb8tQ_z~PW?o^rmV{xe9#;?Nvi>dE`YHHcufA?zeNf0k82`EJcsUbv=BK0C7B2^J- z0YXRV9jVuYQj{Vfz1l!}=)D|i(ov9JLhl5m6Uu*b?|c9ETUp3*kuzsz&&-~^zy0k! ze;5|wWLBWv`elcX@nbJ-r!w>9Pm7xd>+4>#f%3lRCJ$|8Ww*)Cvl{^xG6Su)XM`2E zt!c-mOeFmDzk(;){Z=_Qjix!2l||z;05*#gUL!{6a59LtHB?Z(nazXw>ISk|xwsDk73>MN}zVcB?@a#GO}#kqGz!8$GFb3E3pNOM(eb_0A1>sctU(0;bo zr?=2FA*!XC_PCAE%5z?fF^BegcvJ5To>&?pl?4(|qibA)v2j&P%b^b!OBtNuJPsN# z=id<70@fpyO*+#EdD9Ycu-0W7&I17M0oF=-3f+z1e`jY}O%V2Lt98wjNa2qZYf;{m zo6>6cZL6(2dDEuc3fFYgtVgy=ADuz5#~ISi8M!J#dS>AH$BUP<(G3?4hmOCB?3v+5e|Jfkz9_CyeE>>mOChRRoOm9o$J+c zPxktMA_VE(L5O}o;KV6Z{2Vj(?^_$sQkJxyp_9r+2y?$z1(HrmbeDF(P~kH8LW(}fKmJve)X(QHE_ zNt-y1IO&*!;*~6X6{nB7;)~KQJAP&_9Ti{v8~oebogkoX+R1!ge!B)HaL)zN@w)L? zQ&(8b!NP^sPJ}iNd-__qnP2DYhY^ICuZpd;ZrAN(k#X z$`9jvXv2~|uio?lc1L3*40rS^$^mDr;=;z~iM_YZ)wg7i2>pme?hkCei2PJGenlFK zE6L#}`hSw|CnV|-g?^WEk|TX~g6XwJHP-mlvb1pcjE`%zrH*O>QAISaod|oOK>$?% zPFx-XNaNLUs$BEh87?^Z9$E3jS3o4AG<6=FYKn;1j#S!-r6p*$JpUbX?m?qpUT@#s z-3mlLb}s{PLSjUe(id1W-QXlz)>NsCj#-mJ31B1}4kDrw)WUn7UYj(lPv9uI6E|b{ z!fOU%HNXKbS!yJ*zn$=-a5`@!Y$Pu{X8UQ-Sqt0sK6{Debns3ZqejH$Yxgipg28(C zPjXl9*TdG>pt_>p-4l~=M^VnOY%+em8x+)t(@cjENat=0A#c$iM66DsLnv+@eS$KP z#i$_pX@)4utzKy=5mB^?%Ab?9s3vSgMm~6-y%IchZmeL(@T7Qw-m5Q1ec5#)lW~Fr zjd|%Ye=i(`?x^~jI()%#oJJUoG75RjJb@q|=7ZVat&?|Li=WSv(QOKURa`GY*g9XdJ^hc%+r!@HdbLG$un@`&y0 zkfxTVrVHTkgsMH;FhN|U=8$;VFO|yJK$cpo-6W{@}KXY z21j|>?xB!tfi-<)c7$reM&!#x z-;fkTy7X^6!0ydk*4E3`jj;YoWX*bvb8eJZ1cMF+T0$bgr~x6|ORJWGOfUl0s|5OR zM30f)faXx^G}O7KU9$i43E=*YjAicCj-`~2^sXJ~9Z`Pn@E;G`s#i^%Bu&&+Vn+|- zeHs&wt#@p@@u4P87xj#~U2bpu!EAHLNH@AMas4sTcr3#7!h8&CMUJEsWlz`W)0%0i zt0HZwt2=y)>|u_^sQlqPl#}&F{0j5^3gic30#o?jMe}0PB!Eq&%slVW z>!LATBDP};BrSmLUD}hfR9li$T)f)!u z8Y#}WDwd7j79^XHrs{lu8h@U$rL+lnuY;y!FkxZPh^123NdMZwlAnPy3_NYiFf^v^ zYxWL9**C(npfPD3@5f(b?>^Mr$xX~t7%~rd)2pF6czRu4k` z$h3O+hrQL>J-Y`eZTFKXq)b70xeYQu3EAI92%Pv@ACZ2Nk`ICZvmHOKByD&|dHY#P zD6ZvR*JV6(9$R@kl+$zFyY*jn=Ub*LqV^nwo5>3fPeY}Xw~cyKEl@n*hEV1JfNVIx#@KSZt&*?v?>*I)4#p$bRJmFQ ze(hD`i4V|*x6wHfuv%Tf3&~@zO4?c{kf6Q_?GEA+duE+r{noNH$ggd3vH*9t;Fjd% zq>RkXBI9UUwHfH7J*CWKGU7}|f^W4u=kCYb@7|O@H8LpM^X}r~!spx-roL{yT)Z|AK1za4R2QKWN$slhEx&9R zH~hNY;pIMP@x8ZxI+IiiwQ?c#_3Mu%Cym-88)p%7cf@q*7_}CT&}eVqu<~KcnJ;a1 zHrLH(k(B45SC3ZwPD*mlj8^Ivgh{PfmFTl7-d~)vY+M_UzYkzSQZaU~Ebq?fEf<^% zE1F3nJ@6md$s4R&Qz*U$>*fc*;z&}j5kIDmLK5AfiU7oJ3+2X(UqGr$V1pQS5rPP` zgx7Lq-~9z4A42UT{A(HzdHKz!(cfUbpk?*$a#(dL-SL%QULFN_ocP#?6JuHF(ZIrF|T}qjCv2H0EvdIHO27Q;az7! zDIgX3QuQ`~+@f~nm!D;i(#0iOY>MQ>JxpEZt{KMBrw3+M5H zK;>GkWelvXA%`u;ffth?e-I{lR6bB(#QFH$Tfpr7{UGQ}73l*dXhMNTGMkh=522X> z7VXcEN>4nONuSND-fkbU1&uU-*oWkScH_r-5Jkk3{xYs0?LL<-ul_%8%9!$C+KT(rnxZ z&WP@1j=Z|M+*k}c$y6;~y&WMa6PF%1yA*Bcu!Z~qZoi@03x}hD z%?~JnDZ}!$8c9s){x?KLQZce9D(C$-^r)@hZG$*pUwApbYyOCiaRuvd{||j0U@Xpv zR7$;!3AP-dex82R5D8$C{`$bU`;?77+b&8;O#O!Qv3EO=8hI8vN%0Q+?^m))@_trm zWIJlfpOSAmp2U5P-?STHyOA-f7#=u~#>)K| zwmZ*B#pUY}XKpZM#L(p{#+O&#VY!#8&ef|_nY;2dcl0s)hT=9ui@C%x8_n7tdGX;F zYET5sO_pwJ+WznIeySaICDYIxI?2fw7H8w}uL8<6@u2HJX$#RHO8DgLS%Ij3i=MlX zqZh#`r2~?l^xQvfYhP|TW$qy6(9-%pWKrDV9VJuqVVUS6EooOT4k-~&C2_p?kRIK#xeYBS4wO^0Bb)E_TGe_fa9n%Yv ze}4uEUaUz%31z6ToPP(8)w9k&f=kV)Ik-I1z&qa0hh)v~0Sqj=Vb}ejjtV$ZPEcLf z-Wyfb{Fe(rohOin+}vtIVg##S%bjxxs z*oIRsRB#K>b2hENyXG>XF@i4fAr>!70A+u=KWJK21h^E>pDRaBNTzbGs%dM$Ym)u4 zdj0b3_m=~tCjf=|r1~YT6P&3;RmZ|0k!jZD%bTq`Zr_abQr}lS=$@0AZ;iB_5)VnGF8z{ zmlJ%CB6^(Z?c|Bu=#b;; z*Pu_I0mcS2S1W=n#FW4l`qZ#SJm)fhCq4lnaiES0eqEbJ{>|>I19kZ~0%4y(?{xwFZWT|Q3hc4% zF1%}DPHg}9*~(?Cz43F`EKvNS<%O@ee|Ltp9|28YEOe7Pf^LNUSmU*k8yB*&8*{H2 z$K3}T+jJl(+YA>5PUak3<-O0=@4orS0_>c}fO{af@LN|mdxq+%jM-VJW{ zCMlHzjeinNHCVzHp;*TI!!)M@(q9Gf$FdCh0nR8e8QTemQx(+s5r986(Vv%v^oYMK z5ArHV1*z4nDcR5ofIJbv1H(H!MjuvR(>N&5F$ce^Z}?HtH{IaA5cJDhRhx)ygJH?Y=19_STW-KMNZQoN~*HEK=$mrH)fp zJVsVLW0ntE%7l+>Jieft0}a+?Vt-A>)f{HR!A zv!*e=h0_LMc$gZ9Pmpk25DvqsXtBp2)#jlahJaDkh1hk1hZK<(bw~5*P+&I3{1F`T zi9AClluws8+}=|G&O_1$6c}lL)Hb-`p+Xkg zo9|Ag@cXK@`#!4KjA{8%2+KxHOD|DmSh`)OlrKEbb7%XJ<1|ix;PZv`q4;ZLdf;+q zZ^*{csLlf#LD_WfD$)?e4((GVP=j|;J1YDt?(@%R-C?I&OrE*7V#mbyL17>J1Q0S{ z-}s32xV!?f|4_v5U4u&RUPO-hFcaP%*NFxc-EGIOq2)&o! z$XUBNM6N9-Wrv{g)yS@!pj<`MA+&6~YyW8<;THf|$oPg=brskWL>e|t9`EE>wEO$DL(lJM*d;GTgTulPHTV?l6F+H2#;Uk-~UJCEa=A9D#T_n)3A0@fNo zI;17Zx^ljfBjdfZYQE(CnZNM3+gy~Rqv`o}RbS>vgHz6+{`^kvo!9QX*H20*h6d|( zpe)_-y9bT4U8L0J>4s}$sLtm`;7Vyr+wk^jtVg+TLhv#D?M=%5b%Q@aQJsV1$Aw6& zN5{{Xe!jVjObSy}Lb6OR;^f$X`$mQJWd)sI@P;rfJUq3OMfM{Qs_T(7$n;c+y9$Lc&|;pKeQoyRcWvdQ|OU~+%1!8@61B0316t1bQCE8h}#Z3joV z2fT)55@R-)PEisJ&haeHIfGTizoW)HLDD&8!fZWu`gphKYu{AW7&dc%F!#ga?HC_^ zYr9v&PJ&C^V&$HuaZ>o z7HPqqR;$IZ$+uT!?3NN&BzQN_lo#ERx{kkotjTxbL@XFN?x_fh`W=lqovk4KY%i1m zfTsMtqpt0#o3H9p@D52_DIlF~pZ`H+ zHlZQxHsh$PYJ`2Pr{4MM@Wkzjy6G9HE_(83BoI|Lj0i`d56LrsSGu2#-#xT4L{0=>$(l zh=3KU2(Rq7zah?xsPeqJu#x}u^ZvQ;rUzTAy<0!joN^2^Jw_|i>rS-EP|KTB*z4#V zBA}N`%|wC3uxha1YX59PJhXNrd2DXF(^T% zqY*0TLbeTcq~jBsY=d=*Qx^GVY|S*#CF<_*oAX@T-Se7WB=P=hXm5Ko=C;9ZSR9DW zBFiZ!G@)oIF3RD^*Mp#N^NGrCk>sa4xi0X8+r-K7yRtXOsWo24>X*(m;5zOX(DOwq z4W686?oM4j{qH}n66)uByWF0BdM4@Fov4}dW>4B*r!`%6$O^7Jd7^w-Fi}?{E0qD+ z_KZ6cB0hR>9ur4V>H8+!#hNLm!LTeDTyXUjLb`}B=Kpia>B00~$*EH{#H-T?zz=c0 zwHs(s4H(#56yn57dzfMBu*&cMKy<+M~n$Q6J_NR zljcZdo3H(PXMLHk{jU~*FS+cdc+K?LvgqW-9Krj>a3{v2?>c%bD}1o7f}=Ox3mbaL zh>fsU$LuFr_=MeYeri^)7Y#_Q*?(G}`c2RlnKhUF;b+E3vI3r>{^~spb?WtIk^9=& zP%C*N0^UVwD|zhV<^3)c8B@8}U!gO_B)`r%{E5~dU+8O`;ic^DknSh?wto31af;Q; z2|~TCB^i%2`U3Ki&L7A%J2`)Pi6=})6R(bD z&#(wCfM|h9Wqh`!{v!u&x?{0rdqq(Txaw%)wMRJm-p|b^s?}d@U&thu2^$jW$)7CX zXEh7TmX(egdKz08oh`vP<3IY#`sum#^)-INX_ea+ulEYiB(p4WpvvCwb7o_{5W&P1 zkhFEz9X5lcI}w3V@X-0zNT`aiUiW-=QllbmrF*v~y6AjkE+f+L0EIy>cnS7ti!FCv z#|Hj3ckwbL#-4pkBf3Z_>o1Meo7d?~=_iOT_OR0(CF@Q&_=-2-e5L1;P*L~0)!{)Y z%(IJEzdj$O{smx}R@=e=S2 zTb7YXA;TUnW^e3sjhIWLEdD2*HD?0b5ZMu)7D(EkhR*3gW_TUqX*qeA==|e@v-m>T z?|pU33UL3IhPD2dO8zn;p{Or}SPf_Fus%KGx9a#JmoZ&CkB@`8+6%5$T=i*ecarm8 zOlfC})*ARV2iC$4tN3H=;Q5JXpJ%JiWcMcs3m^kJU%$9xl#nj@M!fGbYMxGiLg5wJ zVwKURLv5@Jcw?5?kDIUT5&KD}R}b>00^Wy^*%k)s7apu)o(6rNLUV-GJ~ zk$ximo$bUe?*r+*Gt5@5cLkX^uy@6_f9<-VQ|b37*#dhJPUW>EwHyEKp|z^yJ}(=q z|B1lfPD>l2ii4)1c07F}UBud*K~Q4EiXT(1KKAz-0K=g$u(v{W?4L;h8QpOiBj$@C ztDkn>`TV$i&E{h+k%YbR-){nw8nZ`HqIDAxf8tluj?k}ZG&Zsq^>7}sDP}}%Wd;6s z225aK)AhR5y0Y^XX#p^3k-xgaR&U--^2u*6usr|SE15+zP~Q0NsY@HuP3jR} zAtYvR!bj^U_DK7#m?KL|{=o8fBNT$>1fNelnEMaU6q2Uwqs$0QCh?`wY*zT(+LI_ zw>(6n8o_8Tp+M8(124$0jS}ldp0;X9h0d*nq;H z{4=@6RCTIX8AD$$I27+s(I;{`9QGRyA5Z++xVKswn51~q%Wv&3Bmml zd(UZ*wZpYuvdp%JpI1x2KSKICRFfKl{?C`~;6Q^6Vnq|p~bc@Eh6lDxm~Ti-HhM_&cOb2NQm4`b~-gV}_`&go8&V zLIHdKp$>S?OOLq7s@BXM%1O5NDQA}5lc+=(tp-Lc@ft^;PCsQEE^N3y`2)ICaa92b zM8Y3IUi|AMQa8CdSpVFbJv^c9scMva@{>|K9djgMdtNx43G94;!FbC~^@Klqw!u{a zWdB88A6Hm!XyQI-uDEdqQ?4I@d^7_!ja1SJ)<#EGdx4e@gpfP^7gcN?)vvw%+IaN4 z@O&vLqZw%-ug(T$uxcKDgV)iES4#nXf zRvfZGyt`cp|2xooq3t%B5Bm51C2sqqH1e~0D^0;w1)osFas*^CuA0wh`fQ5lay4KB zfqHDMh=MfsiZmWho-(m<3@wVKV;cU$kpQ|ykF@A-R$k!>FP{jyduqJ5Hj_-ANxdR? z9~*=?`i3xH%aslhON1(DoHK;poJKzC6Vq8Yb}}-FKJE4-T4}gUxqx)WS?(aHAnl}r zFn*Cgcf)O@TDL6vLn=@-ecC#>+OY1+H_0+KjOWs+GkG1&@{z#fql#Fz`h(5{NW2O$ zT@V4?n<+7l3mIPtMudYJ3rMyRXgA^)sJo(YLafUq_zs*NYt(uBq03IL;oygGX;M)T zZK}>Xpf~$88d<_CHy_3ORiwo!z^n<(`m;wrsM`GGq<*9f=&45TKo z=VgR@9daG*qWA12Bwe%GgJEi;XRP_VKi07C8Ap?!=aM>>Zq%B<;WH425BLLqeX}Bs z$x!9q)|T7I=b=BdrRryr>3}?x1me1MZaJ8=#;?h6<}%;-Mlp8(qcokq>3wEIRvbU98}0^|2dWwI<jWBZTQ{i z-1uA>G0;Axw=x3J;JLMaE(_HD*_JUCP8ZZVT*|7P9QZ*>^xI`_NT6NB-pCJ|Iecnl_>2Mx!AMT>NX`RH@<$8~Wm zTDk<2cnr-^%|P&X0iBNRRUHjkeRKHprH<|}pm!CL+o4_EsFzXibLT>EEcl3nUl~xL|2QueyYqO zciLuhau~Fdfb!crF|5_)-Wa@Pg7G-OVD$-ymCNu4iYe3Cia>XL`X1qDR6Mii7s&QE|ad(Mw$>`dO zKEGQ;LLz;Q0A!6tuh=o$5aRhHUw-aalBywpv%*>>(t-#TI8wNa2z^a@LTraOlz-KK zs^fa^zpALFy+L0=%7>xwssbU5M+{!0DS0C3OU)>0VKjn3SqeiZsUh02Q)2(3pmMr1 z{Axr1+1*l)_of(QM;(LY1>jalM1X|~Dc|#Y8R(WNtl;l2|L+&~)XfKMabHq@n!(?y z*&JUYx`hmhJ%rK6OG5`x^7BUN=&=J#_AdQXRGhE+Mc#f^x&Q&4IjAhta4|x9BTkXJ zV;`ebY>R5mo>_cb5jk^~W_O8`ZS{IHl+lgY6hSzj%_^?+D61uSZOr|tLsTh|d})n* z{mfoM#6-@RND6tZLA-Vo$X*l3erZV+oTFyL0l~)dRcP`!MTL!7-{22q3IKIKEHFq< zDGFyCN0bDfl1lBKwLKiJE1U4G+Q_@Nm`He%Dz^cBJGr>q3CF&ku+S$ zVV~YKw%Bid3}80q3kaeaeq~}W9V~7Q+W#i9v%py!X8WhM9!^LT^o;|3t8Z)^+F%n5 zQ3W@R^o$jMHhVmz#4`E}DGC#=R-)+aXpmhG5SyApuGE$K9K#eIsiwYtq1^_@eEdmv z;VpxI&91>Yy8#0W22)UO6%+-kj2gtI@khyKlCNJFy@hA*{z1eEzPTcN@dP#6FX-xZQr4f#pzJ|Pa515foa59L>zY=bLOdQ+PCrgj! z;Bwnkl{}Xp#3omsr$r+G&>IPy&qwcKQHS>N z2;l}%j#ff>EIwBvFzWm4nW!%Jt4u6woNhvXGZM_mT7fUt>prKEk;pZ`wUR+Lh0Lbx z+NPKM=r2eoUR7X~MXLnf+q%)KsTc|SJh0)4=fv;}>)6Fc$Fm50(Irl$?bLx2$sr$) zQ~&kOoUfc0!L9d70l72EG z&ZIsCwouJC#2a4L_vB2%za_vBeZE5ZwipkwKXLJNTam#v_vcQ(I-A^xf=NFa5Jo_f zp2^5@J2^XnMO!|d6<6ps^_fPfyA@TZjEU>K%o(S%c2ml0TKz&Oq zLYXe+dzxQnT2Aau;QJ`pK85E$ZL#R#64|67fd*F3Em(B_#zy8>YmSSLi-dm-AG+h) z^IupWojxZbu8}|A`!)vq>1wYtkpw%zFWf1=epF&@EuISnQLW{RC>w77?pFdBj8($* z$gQg2DkC+U=8IkO776|GQ%mn1gaZl6VjHcQX((b4q_ZCPx5d9?Eiic6uX|R2 zOTfdZfQRs0D)b}I>uHx}dd|5MUUgw^w9U`yh;u6)yB<{M!%2 ztJ?}F%r#P4lO8e*#@YQ99foC&qN7)`N#z5)H5s<>79Y|%?8)%-H|tMK&2(W_M7+1f z9GwX**rJbsk$PB6YTh;yabB;aU2 zx`bjWNb}KNBk92J%^dK5tyU8Y2uWScf_r;3$OM{m!-oIH>xZ7NT;U+k-u})Fy?DC-R84sb|~iYtP^s4 zCTqC9A%I#5zs&i+Zw7;#OjR&*e z;LHGDBL9iC0=KEK;*y%l8@Bnzb&(^C7I0z*to}G_0)yLg7CEXYk9FUz&rz+kB$P@s z3Sv%TmNJ*yRC6_bVVs>^K}S=NHYq*ilyvn%BNW($XqsL#Re*K{sRv6J!qWD-lnHE> zWi5WQB_LPE#0idYpM7`#t;BOI&*6j9WIvH}Q|G8(Eg=Z?6(!QSFzN3woL3BO)xm!A zfX~u5b3%Q=&hWyT^XKYUR1-NBaj^kcd$Z(*CQ2ossM*YlU^2YM!G$hfCxpM)SPp(g zBz<>=uU1hE&VPHchztq&FBbsx|C3Lna4AcCf}&KvfK>6eqn9ePlU$W&t>HhgL-6mJ z&NEQ!7^Mw&=5ITqCu#DW;O#g%d&v*^f>u(iRw{#rMh+mu2lRq>$)?V^itqXl61E8>6x11jESlMh4Kz#aT!(?P@Dka{wFSa{SK-P(CM_4&g7{|5ho0 zn+si#W{ceupfG6mT}O_ybGYsbqPKi=NRrIn>oP#OFX2%vNuok}8|zlE8Mr;#?B6e+ zS{J8nd%!gQU_*GKI+`(Y`>{y2m(VUH*6G>y^K63`arqj=a()Yi$HU>}cYQWacCB=kWw(t{Y3~-n{ z$_lifh9eMI+VO=WY*z8cKxlLk)SePpkGXU zcBN^zlIN;`!>826Tx$XG;+Ii6V3?ku{NT+GB=|H9a z(AMWX9P&tDnS&|>kdIq%+2Y~jt&7^0d}^0>1>){LocW-h5DFp!3dvs~UBTijDN2!p zIrpS1>|04a4bLk`MLs`|P3=DV+Rz}q{MSMMQTsh zYkfa>hI!j~nbxtjwK&1Iup&$uKX0f>7m*U4*F^AY=X6nU`a~wn!F!JWx6MA$`&~BMIY<<&U&7+K+a$mZxD0kfRAxUHGD^7I;S z{RQAeT>)CG7$K`a)HXh>vs{uZ5XTOt^lt#r0=9bW(!k%!+1pOf)qjf4l(@CO;XSmR z>2p}?Yt+56- z1`k*~HQUct=Ep5N15e@o#1fhO)}7f8;pO(QccJ}Ds+(#IGXOS$5Wzv{5{rQ|(NCFY z?vAtDD@5HbK%{y+`#o*P@x${*`zh%x0fk%0du95>@1qQJz@mRG5sctyAG;GNcZnV= zX(~CDq|+l;vy!qr7>r0&(01DKKAKDZcF=MWd60-KjX{TKc^8V9=MBGOIEwmHwx(Ca z{K9w#RY5dByReQR^I1d&8l{r%cGb?I6*Kiw*Fkipb`LV?EwcGP(`Hh!XjYx!(cvokrj7HX^%K95 z9aAS9~Gz8@=2Q_+se;*kQSz>juoRn z-E_5{uil+XD`Fj^MD>}$k9#?kRe`_`+>pm5cl3ppYRvAwZtYudAg{C;xXlD3Y;SI_ zNLzM~*U8v~fk=D|GCf9a^G)UZ!_!9<#*yT$d$& zA5^}UMboX}8v*F7_rAW-(`AT0nv;EhY@-Vb7vcDq<>8-E$Bj{f`j&d~_151btgMlu zkB9|nTFVDClil5^uhsYcPF^}=bmWN=@D&1TG5IJWwnWO-6qbSP#gM(kwF-hdlrvhnvf!L#?cW;cv53sH!XCvk;o=F3Yo#-SPM zcl40~vH_ks#U$$j#2NPXz2xUxt18&RtQnq60*xf`YDv!Bv;Sh))6}|OvHRm+$GSM- zT&AcH6~Pq4Ck|%HQ!`#=smt!^T~dX)h$K@J=o3>}LUns8U48viClg8u;@;Eir%)_j7!LR5`|}@l)=NgRr*GoEsex6fhdP?4 zUoW5c9H7j-N02osZ8tb1RBS%TO`lEG>ES>oR5An#SWO)4?rsP_2@mGB-D;j3N8x|z z1T3mxJ?_&11N^?gXTlUYoOh7fpG|Mw-mK_e$JdP%CHvv~Li86g9$2J>>~yq12C2Kd zyB3At(xFKabdobQsA1>7e+KMNl;&H>g%X5UO=D}l%A}cD=i;Zj;akhCEX~l|K0+Rq z^xgBd`ZQBgwPSe(B33%){rnqzkIwbY1c+g(9_oAa^y~?F%9m*icwA@eZyX zZURYLXMNrhK_g&yIM@vh6}C8eBWrhjq<6|w#Z3*Uy>@%z@KUnk3XP=>?n-u*GV=1= zg^|i0>?M_2ua*dM2`OCl2zxnM41#SjvIaBIDf^|AXE^2O@-0x`*ZPTF`l+!d zi54g<=1dWhG%?ttJZe53dF|yXF=f93l9*1<17~^7KMPYoM~*f^lV4kewp^sYAruWG zI3_Az7sb7xF7CtL+cXFyoo^X}oT)YMAXGSeUx=@MM>S=_3RZk#l$Dy&6yfE3wOzD` zU_tYB4CppnYvs;!TNm`l2d^p}-S#>$c!r%#t_f$;#q=JV-mXPVpRalTDMB#%hgb+A z)AWyJoYi(8lzYv;HR&+_RdwTXy2zPJNpyG(lcgMgg6;4Jub*?l5Vt6vfEG* z^u^50FCXu!Q3E&Y`X+LdQ=DYB(V48>*(dx8Rr}`#b7Kd!k);82VGrz{F~Vj}`-=mD zs6!es(X#xI-13z`FR9*k_IA?d-?5){WfM8H@koi`Z@BL}A;=|nak0AJy%7H6dh4NZ zW0v-y(+WW-kW**f3{|YQqXH93r<$)w^-h{3uuc3EQS0AtgTuM4>N94c7dxnVGZnJo z*wC@wI@xqiPpGwrb25e{YK`fupemxS2a>hMh@XlKXH8k04Sz*-4N0*rkeY{Uu0PC$ z&iRYyclTD3T5=Dh*JV|Eh5LLl-z%pUhsO`y0Qe}OvmL$`F=y#D=^AF zMYOO0p@=yP1M{BVsq^LtW4F=6ohl$q;8O{GybRIwihgf)Q?QGrL;cDhVT zpk4ZJR?CIlPDT#vPg?n|@2iDfio53}~qcaaM?{5dS+aLah z%zKXMz9uP~dWOmgc!kImk<*`=yY-Xvu>e{H-^pgDk7H0GZqHtBS#0+Xp6)W)U41<* zt|nGSDC!~zZ3RBROZZ`K{9{?j_s9e$7m#}2e%69h-W$0(#V^TzJ{4M1IN9G_yjbwq zy?Lr2Xa6a1>MxJ$A4DML*4o5ie#P`|-S?bKXb| zz>u;JTBkmwJIk5=!5#gMy&&y2`rV^=&m7x8LAK_9)}V|X?38k!fzA$O?OTGZb(f1| z0$k@eUC>&uB)DDVJ>?6wyt_VbUeh;K#dHPZ1RpfZ=ny?IKjr|l49jf7sl{Zd$GEd> z!jsV%pr1LSddQMzS2n_)s(c*r2-u?HaY)p4DOGHF&T9t$Dji}OLP@PNnw3qaq_`ImJeqF9#_(ieYv*SJ}{ zo(cSAy&VBAp5#U!da*BYt94wVyJ8XHlK!qbjZ~()?*0U8CG2hnD*V=uMik)JZBQXT zZ`15AH9{jX^$_<`tvk59wf&n-0@71Fy!?f6QZpYrt~?yEi4e4jNhl3{1a26S3Pot= z3WCnN)wP?dVfS8$m^VAY6H&ULk^@d-k^%4l%DQMyVLaH7mHI}wp4gb%TM0soKeiFb z^XXN(>(Z}2$!6ZDP}{lcZYRf6UVu0nbvFb3GKFD~vtq3pJ`2TkqnD8h4+6$D)`b8q z!V`7QL@rfe!Db@Dsp4yPE%_UbwJLcdXJ+ILoq-c_JTcs9B4X;}v5hS9S#~?!)|vA& zFAeyG9<3`2?8QYOcXl|s=0Kf$+1_wwDxV{tM&>EvW2 zjUKkViOpq2QR>ITYH!1HV-3gp>&#=TE@I$73BeOB;R%o&Q+_0z+)3q=%FSO|S+)(g z05p&^OAx@zNR|54Z1`ga(&H{DTASiW-Ez64m@W|Hb@6V1SMVa+u_5xf3*-<_%o(R5 zW!yZ{Edl?}vWT?2d1+E1in^bD`yM;k!&MLjQ77O`FTXuz_+F zBPz-6h}eZ_I4)~lafYQ+76Vr>ejVErR$a|{hyB{prp4(W!En_ zft+|En`i~0G#25P>m=8k{G3kOXa@4ch+ppE<)_WMrWcUq!TzJGfA0bI14*H>h~S+5 zKXZsGEepWR<9%!I+wsPmvbB{4dB3!!tt}f34@! zR1oQx^^|vFTNfF#n_b&`8KJPOV+)r^H}1e!QK$95#n2%5(DbgOW$^LRIwbCNxDBtbq$cNsrSK2Uu+rohd%-#j>{f7e9 zm-boAe|8~0zgv<<+&!7=zvS{1POX&JDXn^=aAZCij3}Wu+Bkk(eDO}EzQ!m^#}gRh z{z{ly?&iJkmd*#>eWrkL%SMjUzklxQB&bz<*+^qz5LC(kP$RH+C3FV*zMgzj6Zn9* z)d3FcpVpstm{bI~xi`_eT}m8PLaF0arSHFGhT{x{9U? zOnrM!VDLHSksrnx!=&If2R&uUK1`@Rxk#~)6S*0$t@}_z1ob#~pT~Ft`iXvd+-a%d z;EWVC!hUE!r^;3*Smn zA#^&-rNEV1qIrJ}yw?6l#5?f2CFPGR;69!(6=!z3aRx=Tn_@ut8W0dRsH;ZGo%= zxW5!5O}4=F1^cW@SrfA5?|_-W@P3eGs12&rk(m6nVXRYP2Q?C-kpUmQSA5EdJ=(T# z%ihJpG2t;EsvthPH~$HPH11n92l&axN^IL}sLe*smgl`&DRD$v`VBPF$+`&tKf2xn zD2lB89$wdNPzFH}XHW!G41hxr1eEBYh@wcwAqWGAArpYhUYxzJm)I+_Zr$Qj24eKjvhXoO$N}9I2$2d zq2HzeE8>@PuusF?`6XCvt&s@)m!U5+@tknGljR0oLh$)3Kew*;mfH=T3xSR=urnKu zw|O+a<^ZU=()MfId?1AsR;iGQstEUkV^(aQL1ovB3H!jB;bK|)tMjJy*t@)W!xZ!L zAsDTozcFflPAa>UjgSlfM6a|Vuz@9EDssle=X;xEW&$KBYKV-r^UG>>X@m)+Q`g$f z!zy24v)!;c+~!-_5xL}V8Q1-Sg9cfqOn}?9+i{G*NAedqg}1W1>+@pKfkN9u1vw;j zV@sv2Y8&t6F6mK;Lx=N#mI%a~8Dwpq4Q}N%?g4WopECD1MutCdT_@fn5-Q9YkQ%%Q z%GBe?HSnH33rw!-0Rj5cjj^QsE>0&PY9723Dn02B4HPopWQ(YVI+W2oESMaCkIquq z6V6@Qa^Wa$QmY%YJlOxDqx!`NFFt+*=9^CDZF$=$Ea7^*vqTQZTEvF$)OJsI&9(4C zy1+yvB>al>Uzi$|5Py+$^NqbR(rem4`ecYv6z2w+dQ>8O7vvjeOze+O?f<#bhE4WO zaRQaM-_DCj1#EDq)tIi5DJ0Rm#M3?_`_jl{8^l8CV5Ch5Bso$OBuFN=+%1;{RF2$* zAbdRk>2qd;xvGZiAT4f)Wa-Ry1!HdSMui}Wgrpuk9yhR zxbOn-0rrXG*CwZQS}b|o#!^K4dR~5z&@G90dIy16d;8&-C_TLyxpjMtVoKA^aqMBD zWp{&7OR}gE`UDj&6(1)|W7wYNrNK<@r??3B0`a>anZqz)OXQZ*1C} zj0Iu^su?ZJ5o;gYpb*TVaht8be|8T&`~pEaySWJ&I#2DB23;+9!kVzO`9B0ztdY%u zjqDzrK~`Jg2(k%!uG3*LkWroH}IqF%GVqKpCC~UO&MGm1Pb$z zoeWy$WVPYHvIP3Vysp%amEEl)hjVqS*YbXd-A6cF@4GU=7@W;%=~%qKfkxNH!YN4_^dw;AstUyjvne zYc=OfF5a@eMzkxW8^K5ij>9&B83O<*tOb99M{576W4p2XtA#~Vg%{+q!Knc6L5jU3 zL2=c+_;p`F=YiW_p5?jYGfufyMPT}~zSSAbI3PC!Ge*D-ycYnxxyZO5kKGEEIh3RS zniW-agD9L2Q{cYiu`Smp@(j2v3bcpw9=u|}^KCA&a2Ks9;8E*V0)TY&05oY6KpMEO9dEn&|swR*>1TyrK`PSXf!Tz-hQju2PZwz?Q}7l8WM54|DTk>`vu$wH)5C8=+%utS`-0GJYcL9qZ3 zj-nZrVCUA8A$%RdYKp}-54dmnygT1T6tYzlV`9hfB_t*Z9nP9q?=yF0rM*2mrqIVK z;pP}`)m%$b&@OpZdc>-v`NRFh&1^e^5xtMbV&A^&V?CMld}fwPyBF?ncP>q*?bgeZ z<$g;N%Q#VT>&ve66?}Y)oGCVVEm=IW^e&^8$N4dyDI6GbXsVdjID%s1Phu6U(_~jB zXMN6av==st-r<{e9{bd|O|NBL7QJlle;0$#hNZ)9Ach_Av?J0ZlT`b`5g)oUo$}p> z1jZq%cB3W2gs>4=&DjWyq(deiMO2U1k93TYSr&b-)U$zTQe(UG9zx9O-*hnjbo}uW z^N%J94hHhBtxe=W0XASMr;UW0-{H?HnXU)I#YOTM=%(Kd3~vFhlnCSkLlc;&E_m$i z>Z9oM5&9KXyuc3p-6iEuRc@da^aq0`tqvypx$G&i>a@xZxh*^R%;K9L(1~5+H|qz^ zT)@XNMz486w`=<0WHso&JcfTXnN2M2nS|3uTi$olJ?NmInJLoTn(2I9(|1?O)(d+| zJZbGvq~uq9IUyUtQ?Hb{Z-6lkdUCd&LdsY(10!%x|MqB=ZUIBP6Fxn%k9{Pt$dzOF zNBp_9&1sP!xArjM6{i;kH*!8QqCb5OFj$G9%G=Dc@E#PyQri!e!=?$M0LrKG?jMyd zRnRrC1HZ{ooVa!!5Hz=oz$|hV;E~I!#n1i7?LzAatFYB8KkPv}9&g z*3VkkaQ1>;-4Nw#=O#FveoxZ=>whS;E^>4B`QBiri`2I3*LWj} z&GzDLx={q4L~Gn^K3Ggj41xYgnj}QDAgnOa`KGVPd3Yh85}*p1GIUaJUpR_h=)B(; z+3&;pk24O%j(136}K75VdyrB4EjxBX(dWK-}7MoglCVvaTosRBOt zFB@DC20H24D`*oMPFBLFcF`$elTQZcU<0Nn#g1|4*rkE@H$oq^R0DAo-^~mdT^FKMIt%7aA0OE#GwW7`J>JW+7q>&KW%E+w>uPwu|+8401cIEoR^esrfyxI zSc<*CA49%|5i_+Y-gEV$$I4Mmt-#t->{-qh8+_7aQyWdlW#gZ+RFD z@8Dr`Geg#h8x^!WA)r>Iwt|R!h7~o9>jx?^I^2yp_QQ!fzE-;-!5es<55ch-@_R}K zi3Z-4$##O6*8^)_X?%m4TL!%bDUmKq>^5vUdXPQ<(Ko(Ud45ada zz+|Q#ioDLgJEI)0-^# z>7J<4OWVUK-&P>BlCM3@+>lVL&z<8B#lEVz-H&A~JLVmKk5}`2QCbE$5le}eyO?ti z1xTm(L&f(-*Fw%^&vaDY46dn9RsPJCdJU3a@ecb`xBT|hrb|9S3pKz%Z30}V{h_$w zoc#E63;pmlt-q7;MCHRa%rlk^+}_bCk(kEiC|%w3HiZbTnZ-jsm9SUrTSw$I6ua+b zAU&fIa`D&xBn$adybqr1>%}H+UY=QJM`>>`Ua9>QQe&xBg=*5^atPC{RJr3wC2sik zD5!{o)+Y(2{bAJYv4UwWI z=|@cH4BM`*%>^k-@A&;GJOtR*tO?>CKyT#+o@vGXEAac zGn_`sH?J^Alp)cC)yb0J#a!T!Vs2e^Ue(Ltxn8;w*z*AOBZ+4-1UpZuBXaJBW^#?- z4X-GLqENV!!VRiMr+C~BZbUKh^XL{Mt1eCp$A`q3V}t#xp@(Nh5tJ{Wg-7c|fzXeu zEWR>nyvCfp)_Fg!8zW0$!r=FHSv8uhP7*=ORU{;O={Yj3?)>y_xsM;ddi8(5z9bMI zMVWjxT#V zzD3A`4|2&y0z^tEN&yih2xCX}RGubX?@BrEcslN8@Xq>zvNZKh)LiUjj(SY5)FzBzeJq<)f;$&>5J{UX%;HNrj?jgyU`jVG?UITmZa%o**JQB zsDgxmm_rQHX=O`z=PgwOIXBhFmSHvSOt*<+Ejgb2TfUb;H3xCgXu7ls&@Q;C9rRlg z-LG*HZI|YFJ2J{GR z@t%B*3t;HXYG9of{{C6u z^|vpm-fa0(y%_)-+##&^LXleJ#Xx}mY2hEpsd%pag;tN^XSV~HQ5;lS2anTZB%0{v zOQ%4h2+Sw6kOcsXhETNDll|XXPb4jqig*tP8X^w7JJEfZg5DM2o8|sX=O!l_7=A;6 z{`w=E5*R*w{;kpnw3N3-w}vN^9Yt^cb7v!Trmoh*k3R_BTMXKvvyB zQi5x{=2Q1|#Fp;7D3(>0Xm^c~4@E3@fhrm(B*AzAhcIaIuMCR=^y0TyuT^PD6uXYV z>{|J{AZL!o+uy-|Eu2=l+M?Fn7M&|j^LJL?$P2WWX-0Xv-KrD!-@t-ZHGk~haGky@ zc6&CUp|s6F`D5smqB+H5!tD#UV4;ZGlQN5&7%`8R{^J|-lU52Evb$6p|59JDgS{_) z!7TEx`V0>rb6p|)7sE^+!sH%lJ)+D;e~j-Y?{{I0m<@Y6d3@^lWHp>u45LB&BM|P= zLU+54FL3Q6MMEjdZPEKPP1Kv@d%`r3&`#RSpxp|~W=?Eyei- zkG)v|`PrmB**`TBwcdR-x^UM~{HjSV#NPRE!L-lMuumoT%elS38pap<%o8#H#V(U- zAjdrrU3+p5>$5EzCUJ4?JID`p?zx}FnTGEiEC}W@&m1u&`b~)C>%N=`?!fneEkJ9y z(Qyqb0(EAqK-rLyc9YGD}_9O<{r^^_IDhgS6 zHFNofK*S)#0V@Gv(?!ycjfaBK8wt(9Rs-K?)1tb^7j>L;xU@2b3h z{7@TXb2{&O>GAQ-)t8lHmZK~RDT1fM~5Z_aE%p*X$Su^H81M zT1ehC^6jl9jxTuu>=`8Qktd}=$kgQgBS{vt4*56u33X*cQxJ9&4Cz!XHbSbk7LqkY zTxHlgiRod|o|4p6cr01eBpbMY2^gW66wQzP&{OfN0)q11k~lWZq3rMN=(B~yH zQD`&}cQ#wSuPKN!Q~gOnYf}8@rdxRmze0@2!oDq;iCQit?C=|3?ezSXAcaK>PE3Cp z=cP-sKA3r+bQ@bAW;C zRDyqWleOq6N(CB%fPv?*uFBgVj2*k*t$zv=HY^Xj;xk0|NA;A=(-h+H8pc2z4<^NCfK%Mna@sw?f@u~ADS%ffaB|kkHD$u7nMJ0A zndLu+1^7E7t{#%ysoA38RSkb7Q&vOSOa~Of;y!A#x(gdI`JsO*_4kWVNIu!r(Awa> z(UKdcP2twI*UU{{#YBnbKZ0%e<84>kJeq8WS%J4kFkR!Aqml=O+;0~PZIO`v((rWZ z9Y99=yS;{Hj2CcVuS9oBfYTg`(zF0e)R&#})q+t>aJr%EZ)@nWJZt?a!PGqR^Qn-& z?`xs0{qqB-KV7Bgc!1$|OPZFun|25wwBn9#bJtS2p|#YJXe)7}*#Nv-8LaEPcjkX! z4OsI;QmEx1yb&K++EWs9jfl@84@Vsb7%=>-N{*Okb4jv}K{2Rjiun=sO{D9)SH&%B z4W4e(=NJV(KD^ua+p|JgykE$q!Zz^7{yKsy8rZVv7#J9#iuSz^a5L(R%8Vhq`zrUe zX1m?J+3>~!qZoS~o81@H_zvum+zQt82uWvX>SG=Ip(LxMWRal;>!oL5m1SV62x5} zB376u_itS_9>B++^qT_2vKG~&G?~6H#8lE$gxDMghwG~R8kiaOuf){4_}F?~U+m0# z2A#l4rPCFIuhEv+Ht4sFpQP*s*pkk+UqsF+y?1$Izo#^RX=LJ%mBBZ(v-4!Hi2M|? zVwPiE!-7!UOqmdeW%a_iRMI6b9e$-;&n-r{;e_Xrq>#&D$s<36u)j)!JJ+iGw`VOV z(>HhLNI8BrbtPy0;+hC$T9tO!-hWbiKj(*I4&m7rQPgBd2jzuJ8busA!qITBvmMr9 zW6KYhgrTZcu?*@e!^M^R1Dv#V3EO)fSO5M~QqzGOj6D-+m-zcFzXabUgY$K-73AR2 zJ263J4eh~a8V`g77C^wT$iuRhgglcbrpkS{JitD&tgH5jdE*B_|7hF+3cK9!7(XwJ zKAlSxE~M@MzJ@NI#`x(HRrt!T8@7D@%B7=zhakZ7{TJ`H^UY)YG6*!Am-NzgR6drhS`ki% zJWjls&k{1OldiA+@tv+U5`e&tyrWK>8TM^#JJ-LDAN38_PR}c$iQz#Ec1FKBX%3Dg z3N5;(jM?d%TK7BhB|bfX(LR(6v;;&N9nt;P z%muQ(9?ha2thT|J{y)AfVBMZ@AYAMNOp!hij2Dne#)y%Ds$qX(CkZ9Wdf^2(f~G4r ziTN3>HQRLgx>y;MR|6gRZL|VFy`8UK^Con>f9Rp=c`_-4F44i;zGPmr6FAV)VFcb$ z{jkB2^7M7eN%CtlXM*y-N0|w-FUx547s_%|s2;`0puM#i2s*YQA{x7KO5j+TcslzR z&K~Yg%(q13Q9!4oX<3t9zrGujd+y|(s?Bw9ES#+$d*KXP1WLmuC^~7Tkh*dT17TpZ z(aGN5(Su3KrV2AmlMr{Gj5|phb1$Svb!J~}7{|1QPjtiE{z)`gx(p8b_HY^yW)Q>H zi(}7NX4%jG2T;oR%m?$iB@C)bD)M6eUHiuxM7&&5e&9B&ITwv4^+=a+a6G) z{X0qv06A>Zvr9}M>d05#jd#nu)GWK}b?o1?f6t&EbVNMFJXa=e2@q|MyQ01`rS6Y1 zsAq%;3rz#R5jHZf-Q0$`;<>hqZsQ}!XFdhJvg;jHHf`eAA9#pew-f06Oh(Bjlto%K z_!&JTddmOC%YSHi4Bbun&x}d}#@Q5H(*I_4X-0~T@uw^Ib~8XS)NlWlqBwAKv+iA3 zDY=JRo00Us(DovS!XVve0kj?r!!6M z08COb1NdRfWxbG2e;5!A=XLl{Y=p8+AQiOp(647;fYsfHuj%byFcpFNT&yn z0|7D$lhIN|Bc#j2m-StwhP#hV{P5kGlF@4!v3g{zlD?M5?;D`uC0LFO=CkZYgVQ)= z_i9wPygPU{D!fk=o^MVT>4BmN(PCi?Hbwh!%;QcnR z`g4)Ss9g>&q1M~zi_^&Fgs0B0!}N*=Hp;J++|A$le;SC`CdB&g?8(sIzb-mC@!)>U z{97U$P$eC8zuSmd|7Pifym|&f1Y{#zMO3T?riRiA@lP2_Ta}oxC*rKC~le7 zQwjS|q-?z#zuW)J5po5)?L9dujHL-dFdrRk+e8z|&pn?TAVg9;XJDXW@wtdq{c63EV4g`~)MQ4xlf-FUt1-bD)XN`~|B|$R?xH}b zZ18%}DJl)?TtrH0ga5@K0f1}BJCOfYq1Wn^8c}83&N7AP{fWmI{&T-B^iC7Ri=e)l zV$H}~BQYXVgpt)0t0g%X)JdxM8Jv4QipF!1P2Yo?lsenL#8_~YSg$&t3O)P&pE46H zsPZJunrx{>MY_puQ|L8N@ki1*RLbfH`Xh0N??=6KG5yZ4{SIS`m&Dbtm1lB}e;bhW z2O?5hWafbQ0${q@uJjaA7AK`k>ZdPT?^Ud6JnzeNu8ye8djKDyAoa8GJCiT%a(sT3 z0lDx!?s>5T!Tvaq2zvp3I7SXfA!Xem#SLhOF>7pncIuR$WZk~L5;HxAGy6qDL5xAb zOaUOk4C-!E7S|Ui!+g%UOkqPM?}lV)m#3aV87eR{j^ieScqLfDifLO6xC&2%e3TC# ze5!0Sdq8Ye09XYP&#Ih>SXFZL{T&m79~6JGv6UKo4g!fhAVTy8g1Ku-nC{(O>9+xZCae(R19FE2tkvIw3H?=Jsr+9Kudl2meBC?z7OH#Z z8*9aJntrjaZ-m7d5xH?<^MdyJ=kwdQq!H;KiFVd}@y^qaUe76B>-&}UxboRGp3$#x z!&@EOif+BgWTC~(}w}aFf)3hzd$a@K#ZO(!Vp=LW-kE_FJKV^Gv@>@ zSU}>DuHewKx$o>e-B&*(0OqM6hq|UQbtUFywD8L8Jl3kur=`T+VPKyxv3Z6;z@JR5 z`1ysEt+x&yP}mQqCy07x7N=u3Tk*m{|R{Iyc`f>o<1QY04vo}N;z~)9)JBm6G94%fXsTUbaA z6;q%PlsOm>G&4V|brudKOfcE*|6Id3*bSRZ$Dw$o8=L&TTFwB2_MWVGpO=nn#%Q?e zvJoK#M=X*J+4I+MLth?fl`)+wZ_dao8j%R*hd8Je?4_*UAq?L>^Y$e0wv0`AdP=h^ zHc49u4_y7Kd?8jR3&MF5f+q9fU$yW;t08Y8c70wZx91+18uwm;fzZ4Cs(vAoMK05OMKdYe(*m2w49ny3~&Idl+D6ffi_lhrX#N}zC6cuIF!)b&H* zQ?lK8A2v*shOZ10dr@^?^q<}W-d{uKfPfFfL;P_2B<6LSBD>&DY_h~dpkD&akPfjs z2zn@MS*x*>(}1|%B!7lmXGci~R=*Rh+fa8$bT_~2hzMhUQCh7Sw9@($!x)ZLf(TYy zh)0g_uJ5)M3#BVe*qBw19b=Q#o_+S|lw$G$~Y0;mOG-@YtWb8so z9=n*BkN<}^!jGB=#1CfQvTsd1=e6h7VA8IaDS{T$M8XSZDYfBcZf#prt9nTA4(4@V z`7_8gP+3EFif|Jcgi8E!yhy0Rdd|r79^@w4tI#0LfH9C|3F|j6&B5}*@o!A$9}V}K zbGHqiu~mWI@#3tQXC|~&#-@JU&;*Dyf$`$sJ+Bm68xRt*2T!bPDi;Svm^6n5Km`oL zwId7AaPPr#Lf7f_sLi+nM}^x}Zu}SvHBX;A;?^sJop2vnIhr$unb}Dm;m3FCxD-r@ zx6_RK1ON{r>wt{z8}1mFtq?8D8$YjBI4LPiK)#8Z{_Ho}xABn6ZnsmD%pAJHKT_8fy=n1&g82p^7Ol1KT}oHZz6e4m)4|_3w@F zZkxd0UdFoIq2aB|SAczIy~M0#aO~P2F{3fPQth~I3LbY}h zPRooTWgUDh%s5lnr(>#~8O_(7o8-p@AYU-Zril8Hx|V(EbAlYQ>lL#hJ1hM7LZ?r zU>4mU1Lo)Cp9~@nto27F{L6ec+Z%xZ<~zEH%wEBI_R07H-Y1Xu5ASmpJd!h}Rkrk6 z<6R-bUXVXPnF}D_sUUTB^c?@4B+X0Hp2-0aoZ+)i$xX8@vzHSKPqxEmu*N#oqnDoj zbE$yn{7rhRyEl-!QlAlo1gtgxps{>a@t3OqE3*JhQYGvk&#lsY=ntAfxAxw|XyU>D z1ZXM$n6@xsR&RYPH4e^X;KodbIAazB6m~yG7CH%nerx(8jFsbN!>HA;+ zZ)p1_3fp;^6iu2kQ^L@ak#K@t*H=zr^9ajUpgJM|5Et4vsOnA3c3MubtME{rc~*wj zisb!sdUt)|Zmt*nCE)(Zb?k)8Zx}?Alhw}2a=0;+@L)BHUty+t^lXx_BCLM^%yx+X zoY))*1#qw46zr)#;evXpqWY`fD2RZQeDH|Q&Tw8cqu~)Kg85%70M$?$+j{bqS6kts zPYbfnMYu>wfIPQ#U^FF|?)V_c61u!B{PfqkFN`?77JiQD3;(@6V!QI?+(FJxhE>MM zPY`vyeWGN9iM6P>k`KU;%HsdS_z)D=9l>d6T4|{*7c$(fEiGr48vtDm+7gbV7wb$_}-{xZ))#d)vABeBUs1(l1dXK}Go1yL3^J6$~rX&VVGlBC6 zlS0u?0|u$Ls=#Ppr6YZJBapTNw~G5`(p_pEAKNi{(S&?Gn* zRn##@Uz?ImQ6zpR`) z%~5a(urcynXSP8?6J+A{7Xy&K4uEp5QR|fPbbc2s@8#QO9#6AxhH6PL3f3Z42Ta`A zq9YV~UmkH(sHP2O4*{Of7gc7@Vb@n)5T8pVLk*zr%rt~mh?Pl9V$Q~k;AM|!yZ|T? zP1;0B;xy>rQD5Mf=edFX5QSxWWM9W_!_zo?f&VQlC*fIK$n9g!a&2$oWV9-%eeGvdE4bkh7yK}Y7RZ_V!G zaTCIL?*IYK)l)&C4v71k^KBnLI?Zoa<8VVjo z0^3TE*awXOh~f+Gd3~v#N?`mS;OC!3WyXGB>bWXaG#)UjyxMtN{@}>(<{-Bm2nvEn zB!}Vm0X00^H2b(47HFGSRd$bH*IiW!bBTte-fnf}b-weT{{;a|zxFc!`v9(Vvf3|T z3kV}A*Oa8$#JBH_icp&mW0(@qcC=1%`0sABIXU0qkbp(G5B9fL+k&PaOnz2=60T={ z6@P`pxt!|l{MP&I4NyGt2faY_?{`FI*3DgS$WB#lJ8S93&i{T}h~_*r{xj+1bzxxM z#+m)y5N|f0R}KM&|97;_ieUo4*Lf@~tY$Ox(gBNoZ;6+{o(}4uq(3NU9~u3GCfTC- zocA(xZ=B#glm7-P4LS*C4?q_6(5Y36kiJnFbrEfA%QQok5X%}x-o$J>8B`T^MZ0ge zs&UFWt&*b&H#$;p^8saKHPw_JGyb2qw#Us8K_yoBsG-H{EXDR6hF@YByPq^UT*AL2 zvtw#crmE*a&kS6QL2{p0DBrAV-~R2Ee~0O7q4y37jvL&Tw%#(iN~_NPd5;rNDMoEt zg0?l1-kDQkb~168QSi-rmR-p|g72J6k?8KbnSHnL{S@+ZcSi|eZPHiHHF+e}`y2ch zIx2wN8UTh2#U8G)_r-f^KrvA|IU@AayGbpdGol{4>0yE~pMSg(?zePh>9M&w_!V{l zTA7xJw*WAPo=_IDF4z7anQ>lf7W&DMA|08aZGx;Xr##uI*(I;%ypVgu zqFA!89Xr|G^ceC1)9nk_%chNTivfe9zrhO#$LEF8lgD4hOM43WNbTfG163TKA5)5I zZIsN^v%bO=xCb_b1svgc82ufPkno!Tl~ma)=osB%~qoG4ibgW4)AEB?p*;7I8TAJ~Q~Bc7k_(8<*L7_u&A z+@m?fQYnDlQDHmXZ@(@3nyJDhdj6f^GUv{T3QG<(J*hD6J_VdnUz;Xfeu887j0eyS zEs9y#`ZYBQFdDEz+fJG_D+z@DIHWP0DZJv}gw?x(M3~B#CDIdr{Rr$GKk;#1OOe+) z#hh0ALq3}f@t@7*t-{{+LiadY#NcfrKrDylg@}T}qi>;yI~gn*vJZSHtAx8*S{APM z4|oWmYOl^u@T8=iD)?mRdOUmD5piDISGwrN?W%}O(;W=~0DBae`!hVt;&rP>)9rt< z<_2#uhxoF5c068kGi1z*0ksvXmGJ7#fh0_09Q6mb7sv_04u@W?PzObe$bi?9vJp6! znOdjF;5S2|JUnoz?|OnoU4q>{NIaW7iI)H%fo9QG4g>%A_u9Z^oH+Z5LP|dXT`V@p zen*WBt7ON2pt@jNYZq401p>V}xD*B5rKfQCICrZH1g~(_gZdKK;A_13zR<&Y=}{Y0 z*teZ+Iga}!f{Qp~WqT(pFYSSq=>C-g?{6l&Xu4jbrQtCce1<-H{mG6&;Fe$q1ec${ z6(v~njDFM}?T6Po!28H(95Qi@<_ln@FZ8_bR#Mw3Kmd zTYH3V#^>RsVv1VX;K*kP5h@$dEAJA{#R~?JE5{$4^r@bykuGSf#=sTd+IW zohVVC^={h!=YxWeAlY!tcwc#xI@l{|PY8ouw1VSM0IhDk--~z1cH5 zzyY`j%Hs*bFL!TQ_mM#riW?(_kGF)59YnYV{Xy!e=8FsUV`l*Aed6qKPy%MB!q?V4 z^8V(#ga|Qq%a9pDT=1&8m)nwmu)+5W_$$nF-`v4sOQGU{Z=nl#Pp-Ro;BY0L?|GLN zeqIkrZPlKe`I0?m+PIb1i+tBvk}ch8aKF{ZQQQ>PvYo7|ggYig?LBMKXxgjxetaa@8P_@#KkC(}Yq?yc-8g7&KG@z2bRt*hz8b=SzQZ@md}zL(Qg6 zg#EyE+@wXWap27Aq^>u>Imod)7aA(Kw(`yE)EVshqF(da-9SLy05>(9-1~~w0QJW? z8RUG|N;)z7_XsQ>mr0yzYT#c!oUqt;x2TXMhZ*noORss?dA!@FIoJRVkipceJAF%1 zCw<(wF^1=>BSQKF>)aciyFT~@s-cOUk_XSW$*SSqX7y(8L(0HDv&T2Tqe+VYm% z1y)D$JVN>1nA^QuoPzZ10-=_3&xZ6KEC5Fb#F3Eoovz4mW!hV|nt9_ows)GBb{4=R zNObWavwpzX=gXLn4RILBkMb;5UX;qTvp48vx$toEY?&^M@YXg`MOJA(#!in8Hz)oBcyPiB;*yESVnULpk{KZwLgD1CT(TQ z+8C*78>yvd{;J?Psb^kyQZB{~gz{fq+>RENfLcBx%>u+_#`=!?Hj5Zn-FCKB+d1I1A2uzo4=CiFO8qXKC!|SAR0_&a9Ztb)NfR=4y?b zDZR}%Mm)&6EyH2L9?62Cjo=WqiiHrF!7||R-7CT6v(=CGC53c=Ax!hP;wEVbxcw*? z5ypK(k`3RQ>2+k0Zs$^0!O08DCOR)MmBVtrreTsld#rL_%7)=<1?jU$_HkT6*LxIy z01NVsTG~2`SKRY&=&6uN4FUt5zU~XBlQgEk0b7*X=Nq{3NcI+eCN&1{RP8|9cmh?0 zG`6z?ZSMdO@P!hZ+QuK3t6CT3Lh7%e0NK$^Dk?T_2VWv#ABPHy5Og zLBIe?Vx)X&*^6Kdoqr5<4!?{dnFOvzi3k(bF69Vk97pS$pu43vPMkiGuTG0cC^V@O zy~iVFIb^5KEIkNz6PHUYHx^{UmNsCCAXTngsL*d93iHHRb@mZ0;@2>V`aE+HQw#PD z8Um-1@cH-W`u}FhY{TPohj#rOHhHar>Xrm_6IONhHz4i?-xiO;U{sP>mfmaJL&GB! zphwq06?g2TU;EX3)E0Rq_osH`glnek)J1TJ0phFWzL(*o_!j;gX8;I^Xc!dOklVD+ zpI+toA^|xb6(EC%r$o7}GHkTzFYG^n0AaKtjx}7w*xW$#^C$oXM#g0gbUSKesx)i; zBHq-+-t$$9&3vr_YQ*Q)G@Z7zM%)KF#{2n{p0%B+(LfXF$^iZU#uk$$FKorRE)~6( zeYfWtFrpbfk-HXE`w%jDMVHtO_X#E~y%`=SseqB{=p5?{DkG4Afm5iGr0F|s-(4t` zsa1U0BB(=w($`8_$)(D-7MG82XmeM*Wi2|FO;zStu5od--;b>=0LGET+4vK}X(vLb zRwW-mrR{LCXoDL9#Mr>Cv0e0rDRH)-Y$B%HCL}a(G5c)#@^#h*cWm}XlmI`E0)OXO zR!e?xvXQ*(+{l{$Z&(D>`b2-YRu*HEMB3PJ3rifmpMh31?5`;18>~eOub&(pbwG&|wK^j9o#kjLwBB_JCL2f7_S2 ziEUXt;N?a%9q6$!P?x<1N-U3$=0R;PJ&(@*g~#(01k~c+Q%$mHDfCQ|a}a2p6v8}l zNTI)VL8MgTcfg01!$|81jM^xiH_Rp#Pm)yvct$JXkD?|8tjYM$G{cLi`Cp?Nu;8&w zyQVubcmeBqTh+^)vu;0_i!aeyVGbJskjgImB&22EzNB#jq<`Q3SQ(eDKDLD#M)RT- zs1`e>PzguFpOi9JA%#sAtu>PFFBp3l~UX>99tY0 z27QFeBY>{tX*$^FPdOk8tiYQ7*QQd#R!`So)D_PXI+-XBqEP2kxLZ!Rq0x~beSNn0 z6S=QTKvG8~l)t)!o0iuF0uyxVan(Q@13}AThEkvi;(Eg&Ovw@%qxlL`%Mz2tn{O;I zYR4=AASdlCCIWsrghDEv2Dx$6aNa>`THPgqjDk#ugQYRrA|@XqE(u2i6OnBy<48EuKW|C-@iamEC{L`0A*3yKx~f5QEl{K9Ys35B3Y(;j z%ZW;AqrU|)RiG{z-4@7{*3lyuXzg_R>#=KABeFu1(=3>J=Ied^jRU|7adSiOzb%Rt z@?zuMz*+&UvF+@HZ4-n|#I4I)ug`~Ago!E)9|Kw%P@~=A)8VDyJf5dTOFaW+e0mUK z)(bNSJVC*Mr$8vZZy87vi#$?lxUH1rBJy_V=<{#F3^q1|uCU{3zYf-E&R@O(POCz8 zhFp1HAN@oP#Mo%f(oNTW+tqf~7IglZy4New6m}ASzDEr^_Jh&A%QoH(^+)-xAwE+sRlCl>8|JyN)ZXSa`JR`7E`d^Eq zn)lj5z&5W+gkW%jXa@e5Xx9Yj2QXR+@=z-tw>;N*JC#34Vu>(x=Bja}{+f2Z1tuck z^Rn|u574Z=A*RHJ>ob~p{)d+Pbr!-zMFDnq>&bMd6j`3;dF#bHOPPnU6ab;YGBPPN79TPVNcFDG(L! z16ZNq*^V6%>O3%K|(vb9j^54IA(WNN61;&z+^~qgecS~XwUn3-4QKLqvuqyT_Ch4VBIZ&lKp=a?!%2M4W>nYG^T z#N0{Q{4q!s-72*PKG}UW!3w^_Sq}%Kh61ztjUR!RRD+%HY<)J!Wk&^g%F=22ipOpwKP&1wCn#k7 z^BF-geE^i@q2O^~@6L_&IDPe#(E>kHJq6B8pkEP9*rN4&LOF?rT4z%yfQOZ?-G)v} z4O3HXk*JAAMB+G0G#}3Mvg$8B*~aIXAIvAVhITKb9|;J=5&?J7?VD;!Gtu>(BrL5R zE^_*q8R5n(;mA=9SEG0vAjJDOh!@lEffH)r3Z%+wY6*~hxmYxo1|cs1il8j< zzGa(KAnbzL-lmu$$;L>5w!6UwKP{f4ZREgv-$89c!b)D&$Wu4{aAyZ`_Eyqmo_0sI z?c30FQ6MegbSgt8X(`NEjMtlupDpD*)%eW_D&GU${M*wYrG6|ke)3dfK>*WuT~!f( zXmT*=)FaRmG^dC52mt(92({$E)O_%tKoq<$lE#~n(7!1m-E*T9EH(e@Jr6$V>v*@m zv4ddJqJO=uiPKll{QkaAJ*4*m;hNF zdQRbXw}rEzD;O;dMxQR2-08?Lz1pNt`>XAdvuqu*+^Zb%_*OLLzklmBJk>4Sq`>`Dajo)ZBmxpz?or0~o9{`fnSjqNPC~D?pnW z+jKqA&Hy+w|1F1h`oCGdH1tcMnuBebBCS8cjc7CA&yD_n|EYoRXt3ake`r$$++g)B zhT*8mrXojJ;uc)ul{GC{J$3R!2RM9jICiJza#I?^AIcX!BaWbIIcdbRvlSd8Xvu9W zJ~!my^@<+oNEKJztbs@ zN%27Lmi7f~{GXb5)<+x@&}=wuW&$7hU&qHNhiQfR0_Oa@@_p(1 zb7gRs@rOU*QK8sYSK=n+^qnix`T|5&P~uDN zy1Bm$4#nrs1tZyP51<#A&v5z?2ZVYX8B$NbfDy(&`n=1&oX7qZON zHimQ`D|J_B7lt$6P4mhrrwudm^|S6SJ5QlC|_JNH7r6Uh9*12*vp#!T)K@SQmVC zP-fw=JO`+A6Ljw?hsQ-;RC(^^=OGa^46~q#%luNRH3Q(x(yc`uj9(zvRsTP4dkhy5 z!9S{buuAoLP75sht3lW94Ai1yx32Mh&QK10z3%tz_+zOWKjXZr>-)x#^7@>TO`vMI zh*K11{0vt^hUl%Rt$Q;JOb)+c$b5le$!HcLIvQL$9;K7yaMgxDC^NXTtan!GV^WYt zPEhJI1yy@iKUvt7q(DNxTC~03W^l3MzmkjZ^uMbK&X!E8y@y0c zr;RNQ3@}e^%=dRFt)2Sa*|?HW&)&$qCWH5K14FKXg%wZ1Q&P!qF)j@SL7i5Y@8Fji zA$6VE?$Ljaha7U>{AV%T4>B+>pbCkmb51F2g#(*J5`g(-f?;2QA;P#*!}Q8x{s6_x z=hv2n53=1Gc7_7y7LWY&dI1g0E8!wE4p#C1N_Rk}#S0`KbzNthcpV)>Qp3EoB)Iqz zY_x2R%hHeV`OI0o$+-VnMWEB~`2_#D`54~abUs+^bf2NM*))34`gAu;RNNC_l@<6s z)jil)$4oFKoI=o%Al2eM*R^8rs-+SL_V(M6~Z{XD{GZIYV zUQ{aEUz#TvrFyWcVS0WTK7{eVW8|GuyRH@zjAiA-ytGFC$p9l6jFCur&x5zC7V9r6 z3skq}YTF`Bj|H}R%1K)hNe%;U1sw~&XNR7YLHc{JtKKkqA*s6NK-joAR&K!$iR()W z<9TyOR?mPbSP}+R5sVB^J&n?P-kl^ZFL16+Rg;dcLIyjj-&6Lxt>yxqMzhUZr|;64 zyf~xZ3=i3=mamtuj6Ke7ixO7HT4|*nz7MIM(0RTl%Kc2r>G*R@F7r zw0%JPK3$gEPxo;Hm3#>a=>uG}FTJipy$IjXxuTjofsmy*R!<%Y#vU(O<-d|(3?^aD z#V?8&7j=_|(w8Qipy3t!@EO7U#obG8Mm_|}DK-bfcld zqqaW&>Co)S@Gg(q*2{RFc6Fg=P)!yt+ei8B$%@*2lY-#mmT$E)vtTBgU)1Q$`tag` z?YELE_uJJr4)J3?UW;+hdRKjVXFMf?AY&U7e}U@hik*!y;6&rKkrXfWnY;n!_a%Ra zl)*-zoBhSRu4j>jT=q{g^XV%iDg0(rqDs7C!3c#r-pc}%(Tz0WHYn6{C53Z$%O|33 z&IPeyFCp+nC`DS8q)@SKMQ$N$S>K ztkm3*Gm=HdcTx)|x%D}3F-)&E#KORVT;LnwAHiV6(9u7hFu~8CooKo6Lq5&yhPX5#m0|omUy~0T68CCOANhZzy=7QbQ5QCB9fO0Sf&)s3Vt@>xh%`8gfL64DJ)dQik51eK6dDFJ0@hV)1(DbhI#f^>)EyU(CL&vU)skMFy_KL(uGXUE#> zzSq6hKB;u|7mo<*NKUwwX01wR#J?x_Y<<+CK4Cc1Z&8k9E@b@HwlpTZGpe$=!MLXc ziED0uQQ9REavWc&DcG9ReFS$^5ezH#{gqHx{)NkcEnztTWf?ubp$24S4g0W_M^FJI^Rd9(pvxfAcZX=`+ka{T41|GxbAqK@DLi@d;NNQ0^8q@WiET5O6f{cC4T@tqV3=sLPcDHkv}c8NlIj7&|^sFF5Uzg zpr_uTy<-CECPi1t;0+L1u}^)s23$oEykhEWM&j-Rc*XyW*7%TvJHtyuLi~-B;EXe+y1(fmARwn#Ds#=eP=*i}e>9xQctv9b942U@0hnmuZq)B_Zqdwj=dvtKRu#*y z_}0g-E|Qq^uKw4{$hOoNvI1EDIhi%c`^yw^6=CClz3t_5cxdl)%(TT>;w-NFLa8mu zcj+AgCMZ~YPd-C!$*25FblO4v8jYt=D&v3O{0!F20?x6`Ln6G(ab3SE98!@pp|9HYjx}}UE{?vp2pr1FjhOXnI0I*& zs6}r4>%m0UDsV`Iw4R{ip?|-xL;mxH4@eWaRI=*d5B!or`>gN?TYZ0q^}+zcqM>!9 z`(}prF6kC!k-c-LUL5Dm?M5yem(FcsBCKXS*pIoJ>*K`>O0ZJNYQQ#Ro3!tLMph9{ z`vnZq(ae~|tL=vRQz!j*1Gf%L!S$Y334_(tfZ?&oAY4HA=$rF}HY2?WhXa^qEB1?Q z{jXLeR6`PckQ;o8iI4jgOG>D#0Q8Nhx_i%#qjCqhGR}ScUi^sd%6~T--0)3}l0){O z&MYREAA8R#@1Z4gHsT8sn^@7Sa8vg5>NbN}KnVV8_Gc2MusT!Ua>bKvc3 z@8!G(m_j>k&?`rN8}J_*Du3j6??(b}ZWeT1vsLt_8^fVv|J{YXAa)*k(74O`qRiO0 zS;3@nzn-n(N8f@`Q7e+#po-dKn8(qdK`->s7#r!*&T};z@JYaBsd^FiJ3h8XiI35aMT3 z47@c*|9oS=LZ`kTM2g;d;N)mjJgP5kH~hYQhHmoFDS-uV%wF|>fpk_KI~cyqmy8N6 zEHnHt@S(-^;N#gB-qHYI3ZtrB}v^?z#yLRrPx zi<;mk1bft02c29o#j)_62{s60Xr9yi);0bu1!8rt@e`=*$D{JNQYsHHrY_4TK7)~= z^iBJE^+wmpNl2EkaZ^YRRMs+wZ=2L#+V?^3=`P@!U}hEA6}?le zGmQ$%)4!wM8ueweJjeB2j3kh%2JgRcCf@nl(%Fo}rqz+IJstcrn%MFJbyrnmyEVtM}_GlRlO{B#P9&(my>!PFBNL zzWGo4DP##MIb>)0e>N*(;GpCG+#f`;$<2c8p2%c5W<1h-BO|&{f3);Ump1lrViZ(t zC71JER|vgf}gt{&K)pS>^T^2S$=iX-~F7YA34XhWm#ieF+n8xf*aT5Y<*UT(g#I&Z!u@# zuL%_ieNiQ&6M{-LTDDpubYqHH3NCQ8XGE;GN_(}HTBYA_NAcWpWMAPv)uTGX;GBpe znEUUB7Z40w5otU$Y-m-DC!^G>6QetEosEd&H;qq%Ju3M6%NAYGZZKQu4p>Dc#Q)(+ z3|Y6{FN}=R%mZ@7h`=}h5D$uD`{ix;@Yj=&J}byObc&Z~e@Uz#^D9{JouKM|qLxj* z;91O?VjdW%xKJ6VI-&L)O5KF3Rw4|Y$mWdfM0QPu^D-O|VzzhK_^%Hl?NK{kVko4) z!Mh3NWn22)yDh2iCR+9`CY_e8d-pEgGvg)Nw2;8$dufbL8&N>6qX8NNg(M&ih>r8d zA9r!f3p)$w{w79vY1Mmk9A?EoLdvuzX6&~{gDOSrc#s(qtq3W=Ry~kLMFwr$Bt{mS zAHb_Wzby!K=+SEwX;{yIkdUqWYtI#>JEE{`FvBifbv@L$K8HZ+s&M1IWpEIC%43WW zJ3?S?WU$zn{E0Q*tNcww==tH3m>YC9h*o$JfZ1cW13@T5b|;facksCpp^R@AP-s zq0L;+=BxVCV-|nEsuMakt(CY-D3j}oAz{}3N0m4?KcC_XiDd1>8!uR)t=mw0y~ESG zHcQtn)vF1VLZnZBDov0|{^32~a5Je#^a$lK!Y7a@8|=jVW(HJ!70zu%u6Hgn+2KuH z{f`~Yx_kWC?(iODbhclX|9-+dMN7hHs%n5x-4W>L&kGsTkFu)1=Cvwq&(^Of$}YPP z6|QVqpGt>Vt3k1PGd|PKx!XKUp_NdGXH6`QL+*vX$7j4Eh4zN18p`vzk5m8HT7tv9 zrp|oaM<73`$*7O!Xsr}Hvxj*R~D?8n> z@NLhl`8 z0K3`2Uk4Tu^m2XUPhvpy`~22q3HY(E#NqXq&hDks#w#kk+Lww`y@JOBQqGrpVmnN0 zCDdeP0P1&Ecx985@8dL_jm=P5Q4QyB^1}){a3soOB5`LN z_B(jHT|_@3(B0VX6nrP(Igc6oz4(OXwMRwuE_KhzijK=BaQ0<0;Djc| zoo?B(*-?lRIg3prR?299wNi0K~?6&+0xPU9@X>)(L?zuexCzp77&B#<47#FJ46TwmxR!^28`?G<~2gZ(qS&aa4d zFmH9H(3*@0)9*gd1v_Lx?+>cF5w6RuWey_eY6mHNyvOQ}su`7vhD|F;<1AW|9Bwi? zZFI;aO`xatjI2E%(f1b;D5+i%6?==;yGmQy1bYs2Tr*a?^$eB)$30)(Idfyl@F*0l zt?Gg|y>P!)nVTq`-hf;?U+N+LOI!7q`Zlv?P*)j`R6jBj`Q(HEZ@2?)CPI+p+;Vgf zmvZy*xN0C++mj4p{X0~Mlrc$mDOQKnwfWKEr9nAYYxvKgfCFQedRHpTL{7j(zSjA3 zo-bYtu{O$*PMweuds;BszQ^M*tLPvAhvhmH>)4%p&2i7&bu0*9IZ&i&VuV3Eu%^bO zS*w0^a;BsN{Mz2@k!J1pgN8)CQ;rh5Zn!wlzT&?R==%%KKXs_ITdc6Get;AYD;?ZM zS3&_+sKkp0PH#T!8_VT9@`Dd<_ABDso(j&haQm_#V4Cd>fmXly@!JG@ zm9Rj_EP@#F38_^vQQVS6_~BWm7{Yo0$MOl(B;ov6e~ArOAdZV&&8ZDbmdGE-=A{hl`nnkX%U)O%m+A^uc6klc-zsE_y>TROTeclRpY`LzF@bTS z0w7xN`$zwSDu!{Xhmh``4D9M2nJ z(|yQV(akQ;rJPUr1-D@9A-9deWb}MLB5lDd;&9x(U^}3-G8`Quhuc2 z>BPn_h4I^tDS_HDQ)WaEi-;K6WG8LlrG0Ao>hhv+5*)GEIGEv;AKlNG7pl|t z8szl-|-u?qH1#=LUz z3oi`-CvWk?h+wI2Hoo7%x-60~@FZMJ#=BNTKE;}$$x1@~Gs#BUTN&$>EdrIj4k$o= zSs&Sav#n)qMaEtiW&45zPIt`S<6qCu;%gjk{B6+;2PkomC}dMerwHuy9vg{78|tS8Y8zvr%O=TjXqE0(5;f<>=R`^OtQ{ zvg?o)%~RK#j(JXHJ~MXTbHi`ITjPakd(NEjk2Bw*L$7xxELV43DTr@)Wrnk0f7+z$ zrXFp%;IWQcOsb%+ML#du9(#wU9Dt%0m&drx>mz>PuGi*5Pw{GTbqZm${_(_K8`WM4)gSYH%g^(QDgRhYZ9D#V?6)axP6o$ zm-jeX14|9>b7M>JkIm$+;gU48;ug6l5$>*$yNzS1Xrc(G!MyFh3HtjsLmrN!{6U40 z@1+hQy;lP!2}p00NKw_b{MPrZes7^+ad@bA8~7f8=721u7V;xg^vX}EWN4RdG0yPh zel(oL0$}#1ML*9Jos@_&6$;rx*wojOm+%-BZ?1w(pIN6ma1zM`}!N z6sI2657wa^aC-5wJlJ@+h+O=kHI^KAU{O#ZD=Sgt#Z3yC(*%_?0q>*}XH+sT8%YJN z32z$2hZY|o+I-DEmHhaP)5+(rTKXt7t2)Up#HxE>#eg9vEcb{W`Aky^#&KZ)*(RE# z>NtBr6$F+Uz%KTOABpzVcTzi&i;C{-vLPg%w@j3u4sVVia1s%vO7C z%AK9CY&63ie6G{IFi=W<_~t!GPS!J_XVseyg4u@7Zd$3Rn6yI;wyGRr!Pg->@uAMo zU0^+&6`G)io?)G_5T$tDYb#;_B}`l10^J@01#1a60mh;zr19`yEx>!{l&aTcTbu=m zzn&x(K+#H2a;RlOgTu!C-|W}9fTLOy$9qN#1bvV=EucJmQb8WXxxYlBBDX4^{X-X2 zLJ2;PuDm82V9(*~2b5VJlrUA4t5Kg$JEMEHSvLf8z%dp(Li?=RcIZhuw-K@$hyG>0Bpc&u|0glzOE{LDc(&EITVN{-bgtAmp}j=@{%@w78W-6| zG{5}2ovERJpUP-T*}{-5@?^_7)SgJ$y%T4FW@ZssKmHbCUjK$l$S57%tUjUU18JQG zPo0nDAyOFOW8<4blQ^R&*s8(cb!~T87>FR$BGuK_4_CH*9X>034|+Jz^(?vZV2${u z5tiBF*Q=sUv2G?qJ>`?Pta)a+mPtc}?ZayfcwXyuCJL0nD9)a%iJ`+QjdwVC%Y|v% z9uLb;O10{Mq!hc}P9;KGs&chgmW*jf=o<^2t*4o5O>ABF@Bvl_ko}K7;Xh!09m20u z`+s=;{~OuUqYLzS!8$2G_e=f|2Y+xkhWo%}f7w{fZ_CPoI*h*TBE69bPs_a>?jx?$ z)XwfI_ikXgPPAi`1;hx}$pdjOqxgNC%eb2A9=TONt&hl+Rq;a3!bG#uEO1-78*X8$ zeT>a6{vUzq{S!gVGY0x|cgb32kog6_moH!DA~}l5$!;+~tBhGJUN!xL!kd30eRG{0 zEocHDgvuUthU)ux^W%BDyUD1M08!;>DMNn2`=r(R>{!~-VnA49@O3wp9J}RV)T>^} z1uPtq8_F(%BHw?|p}X>-RC~RnQzG@?UPX!{8el!A-Iq6bTa>6LczHXDg$DMUDjr=Ae|RC(GcIQ(FK0i zXVfYBADKJ+m95Z^_2bnW(w23@^GzkJ?uxfw{l^H{3o5Gf_KN4zqaw|IVFqX?%hQ$R z$-%zQc(zvzl2lqef5jgJi6Z&^NHELum3hYX7{f?;HHF;05!jG&bFe>|L&O;9HY2*+ohatpN}fG=R$!5KY0{*)M5}fFxL9Z2S{V+A0|sAkV4z zfuy=cquh4=wp^^|lr8h?d0vLkAUKlv4b`7WM=FQW`fDVgLEfB|n_3v`y+R5_Ox^l+9a2FgZk{t85+xM|G?8fH`<4&XEt82`22S;k1 z(zqfwaZ$I_+#=lKAe8rZiCr9#NcRCXH3O$@om(Gr0=0nK!)Inwcb?0sIv=)iiwsYt z9h*;8tN91mJCCyVO?;nxW>VcUw`F2(PyUOEp6xFq$yx2lkk8w(Pkn_q%$@D@+;n^( zpt`*I_}TK)*v|?Nya=CHai^m$O+Dh3KHK>T;hD-Cu8NKMmA~-`(o5x0Z+W}x(n|V! zs+(G9DhcTIlZ1O7NmZ%gu^!W8C>n;*gSx;Fh-rB*!q2E%Q-akf#q+{UU+>-{O!;iO!Uwqf_xMGf&_FTccRQz^jyLS{E^Wh` zTJKTp_1ZpaaOlwSh+L4NqoK0plnEE*XNey^G4Mu*@i)Aw8f7WUBo>qWk> za~y6ya2XyNQ8(kxKlEm{Epg!IM!aJ0!`Oziv-kU~%9C0@Aq=j)iW>%TeX9m4C)mQ9 zPij+&bG5W>Tw>1Pc@3TRR06f#Sr4{b+$BCBMF&Gf<%OXIJ!5lA1LNZl=T@g@MSib> zv!Geb_;>}t8L@s3cwQKxKUuDt5nePX!gKFlOXcNHbzcSB{PohV4e{oLGTAO$19-3B zwcd?*Ub#j+a^mrW!LwVGj0rnkr7h;)oXWL&dH6GQG<@@e?MlOBGt`sOB~*}Cj%tp! zaUHFA62GJpdRD=h`*Q`0pkQ)KeW|evkT;p`n++OD1 zHwNZED9-#tgJzr!NaV_iCB{AWs%JCT^7&1S5XpSV>m_l*)2s8KM@!f0u&vj}^`Ouv z5@lG9tG#2zRuw+>h8Cwezu}bCHeE&2E@IScS~ITT03UhDCCE(#&nBl!3D_c<@J!-L z;8UhA>9mE{wI!nhiRyuQjyx7uM_#4Vsxx=(khQe(1&6UmzaDAx)AJp_-61yVSuE$t z#aujA?lMu5w8Xj21OPNXK3~zRTUeO0^7;HXgQfg#eal`D)l$Af=t9azV_rGk)SBR9 zIF=PNK~!C$b~VsCcL>Gu)W}!u5}V5P$+mj#yYRC2NN_-ufzFJ%B9A@amBDtA>44 zvL3waT*e0AZq>-#veT|7?QYn)$GMl9C3TJ_ljLHjU9q9)N-R_{3Y`<$_Pf6DmY60c zNCI)0EA}YPyCR1y$)K!7DQ;oIxd$N~qkO&Efs0F`cIXK1$mZJ#lo+b+)r+uZt?|8C z+8K|)Tsu7RH{Mk53B%o&P^4q&tPR7-{i8#l@U4EJLThtI&ZtTc0tGz7a;4E;9)+_J-#BxB?J5!`X^Kkz*AjO9u`)bj%%)0iwd9I z9(HZ)0i7i|4du&}x#X&t;@ra#)^5NgR3L^fjNmjK$I>b3U2%o#DV&4R)_q#q1@E9y z&dvG5flDQFPyG@FV9k?D%1Xp~E%A8W&RG1f{5*S$qD%|UH0`yP+SPt3OfUsFbXUP& zrV}>9zQJnsIZk~IT(Za8J5-9_ZD|3a#RjDGMlsZMXYZrEhl#?`P>shs54SHYc}{)d z9SAzzcRw4P07)3$1(nUQ)^LFqhxT& zDBt-f?`>O4rWBK3{=?;3xXk%*To~Ro3aV}&^Y(%G zqoJ;laMGp=cc4DjU$~0>a4`MaAh+>gw$RsgFxv+Kl%XpK50_V`3*!= z+jzYp8L1K`5e7$C+oQB^mREo%rr8Nj0AJj0CtAxosn_LN8{-zwFW2K*iiN zn_h`cZv3!62m3{b2kmwjGsr(P$ea|iZd=U^Ni|?+zV(@fb4;MGOz$rPp%}O5*tut0%oPq0h3!6(jkGDxjM<$BzA^D!3$Qc8jp%cQ zO0ip7p_lbfo|2z?K@l)rJ6qN`OJvI58q|KST_Q+cB#KSDVWvp{+a_`Hhgdrgu>yll z9Cpqvw?7+61T}^6yt;(X15>~zNhn%8o%a_!GH!8xYC4?-)|07f6U!zy{Zc=3hgI`a zcFgoN3)tyTzA+!uNU|e{Dye$py-Sv=+KtH{=>o3rgda^T4%ST5IMSS`SVqiRdBhP` z77F>Mu<69rT-=fI#&dW0>yaU?LsKa{TmTZUSvJ46e+zXTOz;iuIzIII?PCGP$9Di_ z_7@G0J%bNq%r~nCj&^ukqPKx@$>EOc>FsSyqcP(w-uU?LqbZKn4lqZ}{@OiRt3wI6 z=bTA%WIOd!+U<)*$xPSeKoc71_r3Q?0P^jdMM=Pd&yEN{|kT# zFW|jPVh2++)ogTNhVX^WPl>{>p+U?1H?2Z@vPzUd-7@u;P@$Zp+dSbQWR&2T((_K^ z9~Yq_n3%Vyv^amdMsSBfXkjfUENcV=Xw{bJkQu|p4@>$z+xqg9|3bM4(&drST!{}} zDwr=T4WFUJOq=X7LWe~0Y#|JbUYgGzB98WFVIK@)0Lj54JAzSRbeF9?X)Ov16Wiig zC^5&Mdh#cJ$)P>gpzM8aax+FU2GS2WhE3h8##m&T1Y{MLrN7!LSjmNAH<{sLL4%}k z?Z#!|iSHGm2S%tRZ|L|@X8I7KLHJMs)*1Zo7bevev*VcazYkO>QlGd4zr2q&2;`pF z=YS_l(t$r6<9?)RRMgn6xM30}dRW@M8G&{(vs$5!@5pYxlXLb^@>cpZ2cbf1P|1q1 zzNy1uz5UndsF#?z1wiAN`2pr=25l<&E5Gl$&H?~v>dB>ffB#NHNwW-cGJ>y6J&W$c z;g24`wj&;ss>-bu8q~Km`#bL2Zo*x92XX75d z#;cl5r9BhkO$D0QcQRa8MG@UD4KtHNEH?=&+qaFrx))4G((3{@APis!pY<=~Ef2P9 zdQj{yWTr1T4Bdh#H$6NJu-@Nb`2Q>XyzayPi?xGM!lW_S{?WLKOR))J{0nWtj}mWW z#>C`!-`Jr*&Tl&HH!nXvdn=l~)^^)dshS~=+EJgs_lk%)9jJ>581At@EyB)XW7Iu> zyAcZ|mz>{?izvKJ^(@kIllccsV@QGG36oK8$hwt&VG!PB*AAQ|n#bOIEGO^bd#?qZ z9qqYHyD`Rs9t=Oqn!=kp8TFQ|TkZGz`ssxNs49@$h8wx~J#uQL`k2n6nxzdJ*ZYV< zI|Q;%SP5ue42Jby-*NMX?1`!$s^0nN>oF+j?CqHU8^op1Hrf#c?<0=a#Edt>%0+W7 z-cSaS67&fcc!K-(UfxIcE;bD?QlL|Y74L(L>b{L(&$tWOt5c!}aUK4(R_KY_cf}ho z_x;+;_NNn34|_C;gFz2CcJNc?8{6KJM@Xd$#fqPCDR0hPVa(pEwYUM}fI!FEYfbQ| zKCA{@2N~pdc%52!4)u`Hr^CK2u}CpU)^ryMJ0E7HQNGuSXi3$2bbcC&zoA=K- zstAtNE@p7eZVV{!l6(cdu-y`7vd?Kv%w;U?CXT~Xqf<}+7(|sj*!qg|@w?$POk%{QYMV+M%3wXsK7IM=*LxY= z(#F}=tXo`qr~ICI#T8d)@+xw0?f)YSp_Aj4W_;q^bNBtxv8Zb&=ikZ~JO+rd^^0Ns zy@HchEZI;$#~jbqB1Tw{{c!Uq*#m3mO_|^w65mT7e6l`SJDX|Dg`*sH$F^HRn1%1*De+=S%fK3>|6%G4#VF2I7yGHYR#1Q;AqUf(D;o zCOP_mKdhi={*drP9`{uHLg)9gtQf=Sv0Mq5;X-wx06?r!YOy-1g}W}@CX7C8)C=xP zH4q82I;rpx*{7r%@CE6LJ|H+^)kK{4IKXPT^3`E&$8*=r%F*w*^>ztX zL*wpV(wX}6OTFJlEY5YQ>A{QF%WdCrcTj2d?}MAFvuSn!s&P|sH=~y{b^aT$vhx%f zw#DC5VB;yegBPD{KlGE$_Eyc0_Zqmw5EY{rG4F=2WpL{lG2Yasti+1`R=?OgR6F@* z(Bu&`Zh6piU=jpy|1_coI>@=!9u>PX?|pE738hEUb2l1Fv2s{5y=Y1~H2}*JfHUnf zoAUjtu;DhiT!nRnhfrg7vv%*1UT;&lp~zgJnn^->^lYrIlwmXoU4Q3pOYozZl^}Ka6QfHtqeBNxIGP-n_mwNgPXriGmTcQtyIpQ z6{PPfvSG07r>-jJrPa~p{3Y@8HSh2)yqDa<-Mtb*bI6<$1Y0N1AKB&#BTK?Z+w^zi zNMw{?ira8QM>RKKJU8KLJ@Wj={sg?~>fOab_D}ndd`N2dgYx+v1V1UfZK+SFLW~6~ zdtXA*IeMe5xPqLvKbskt1NqOspP#pqetT-yHPu1?4(_{~aU5b?ECqC!%bZSr?B|6s z6+s)bSa2*+LWRA0-wwfc!84uDzI2P{6`smpiTm8@+iuU$Ny)o8bcZ8#Lh=hTGmh%^@DY436`UBPe;6QOrYQK- zIt-jhp^|OJe|@x34oRK;uI+5sG{ZKzz;{2-NcsvoS{w8B9aS4oaXJzW{dDEH>^9uu zzkQsw)|%kjJ(~$pFP+p<)vjM1oN<%d=_XyHswz&6F(Jo{AE|aMWetFmi-cZJR1s>0 z6(n<=N+W7La^`}~LIVB(`X9fMF2OC%)Lo;tnU1Acf9`5-5FdKGNe&n6f` zED}E>gWITYr~1Vui%w$2bHRAB(hd-fpR+grRP46`iOD*bicp1(Q_Xg52spMq?=3W1 z7=OWzVG$^Hk6Ne(asWS=cB>s}*ZXF7p3j^!P3GcAVV=FTLC7dyNx+z8JwO8J>dcGP zmQ;8CN~B$1$AcfpJSkM};div}b_6Ue9oChgH{7AHN3|t|bCO+F$B0WkF9OlgQI$IW z(pUT$WIN{DEGvs^oO>}BMVLS1wN>{nlCK>oEyW&I(QRQ!F#n_<3ix!FuIe1K1<+XEx4*fS;Czt40{1*M;CNdY4{&iDXOnBM2`SBhc183CE4h1v#a}h zvf1Fp1wjyrZhUEUJzCPg_gvS`IQ<7{j}dkq)sFTWubgrRv}zOy}r{k|0Es*?zw2GE_mbxh?O!jH?zk z@PR6HxA?p~?coRm9~xjYP`F|M>3@WN0EwBeA6hh<+^s%+R^9SMb7jXIkSLoF1{pjG zlx4$hys0;G$fkjk>F=FsP zDG%}zUX$x-VKxGa-R~aEXvRQIh?8y2O~Pv-u6SFuR7>=WWJ2gMA%#&99iam+pxK&) zZ4AnKomiZTE^d~wBk;#3>-Lo~4t_CS9DRM}M#yPCHFQ)!vAG;6dB02QOKb*tpQwDw z)<>5B3fD0`{OKX%!4{-N*7l6^nf3-`AN%n-KjVxK8JFeW5dDuWf#`GObCDPF+Nx4- zat~-L>v!%1g9swfeTZ8h(mzw!enGEsM7AwO^ZdpBJAGraH(YZlTJor+057k5&P9Ca zC&XTd@k5e9uH2hLKhtTlKZ*6VOZUZm>~+2#o!pf1&iG&3J?scF?~+5(ERv1w*;{?5 z#=cO<%W6MnaZi85%dAa|;2Z*P)TmLeZ8ZD>8LOK_|EF7n;oBlxL7^=hCt^1i`BP@w z3HN8yGTy~Z2rTR8e6)C@wHdUT!aZ~qxaN%&V9m9)0I&g^=dnFM2JpGxc_+`onnH%? zaWzzyb;fd2mK_LfhXLPQ?%eFb^;s*=TEEc_wKcQe&w{T-IzJ*|35-@Bs~Q9r+)w;U zqqRfEOKLWc{(^bw2*@ja)}OQsdXhoj48QcpvI#U!w1U&iE0AQ?(9tXZiBAg?8K5iJ zRk#53hroix38E+$Y}EkuMX1AAR|7CZEA^wYFuc4)up*-}xWJDfh#eglW8Lyj3CMqe zIvktS6i_LLW}|1bkp)i|lppuq3g^%?x>-XQYDdq8$H0~DVHopqqM3A0ACxJyN39P2 z+RIA}1aW5ytuuHRCO|Gqwy?GAfNpxBn35tfF%N=q(k6nfoY$^zfS#n$o+#QxLiy)) z!N~&xq1i#s8{J5tn8137daLy?5}=IEIUt*?s%K8@C0U}YmAU6{YBRRmvCm^kf>G@+ljq_6wiUI0?di1#ER%2Ri0KnHB-2-q|Ow!x!5a=0| z=j-Bh@K5js$NxWo^g4Zgf2}CDEf{%@Y18QloT%++;p*is;MO<%Rc7X2Je&Sld=w%% z{D0lhy)coVGWmLd>mG)>L7K)o&;Vzje(_at>pQ**f^Pt?VvrI;u4Gq7ugjivmutuu z$0BdN>_j{4%4JI!-%-btUH9OsyMDNM3+_)-157;QWQML<`)$Dqj{noJw}s0 zfOAnw4@B8mTT^J+xReJIyGk`beMkzs zeesnVr7(6qgzX{^dnyARDt6SzV~_v5@1$5i>sPYlm?}t3zvCqf^YWIKvlNg7*CX>> zb;zv4npz2Ryaswu{GU+%uW}H@a+qYthoT5SFYg_=q4PqOEeoS44}And?eDEpp$Bl% zw*(cL|Hj#`2Vn_+%1uso!|RfGKv@+_v-}ITpIMJKgX0Qo9ZyndJM0Nje^WI01&2XM zxIdmevcX|FqAW7*#$C68niglMmEmeTV=;<`c&&;olP znU{de;}K=S+|e&50U;=N4x3fd84%B6s0z_0e)Dg}Mv&S~2*;9(LDma7xxuQM5jNI6 zvk9&R3ZC>mGOV3uPx z;P8_T%ipm>7Zz8ZTNn2-JGJp7U-X@iIOR(cuDFS|H+A6G3A+iqb_;vClaC>s4&(SFemxq#(SCbL_KxoOxw><6mR_t}it?)Rylcf8jr#lZ zc@a>O9L#N(E$~HW5ioq=q(E=1A3qyUb${z&)qsbrA0+dEB*@#9nq3b*yQR+cyx+t4 zA(JLue825!fmi6V`85vOqt8N-K&=1ZyX>9^z33m|newZgiC?yL}1m_NiX! zjlE_g?R;~{j$^fsVYDf_h=X|Rcal5v^QJO->j^|<-c*!pybxEAH5QHf*7P#caVIK*f^Vc1}IZXOU^GjUP8e2Hi7(Z_j7$L5m4W;p5y zYsxpSQ$1Z=p<2J#ILaR`EuT$!O9tne^L?9Wc_wBYCcPi^bKP7)cM<+Ke(u=Vxn(6? zTeXmv`!}14hrBj1^b5iRDLj4_sD89>Hc8;b*AwEg9ftz4Uh99=oA1=A4^vdDDL8<6 zQGH0hPCe)0T@C^IgD{l_&K-U65?LusfDa@Ing()8e-2rJWnZOU-wOvlHts77seYKb zlt$!a+>6h(@Xf7CA;Bl+2K`}e;j_h@c;0A@oALKbn1jkM@a)+7NC5uwTAwT1&0wwb zdwVU!e$rI}6jS)TcK7Pb=uTaU@*-C6I~gY)LSCLl$9lZHh~Y^>>bQoJCe%Wj|AkeIIS&xoPATHSMDsLwsh;WwTgl zsj=SZ;zqbXojhN{{XT9kZFx(u|EsNfS;K5;v#)(*rV1Jrtq7tprLagcfcogY%*9R> zzKHTy=`k`)s(RD$&;ub{V@KcidhdC`47VaIn4eQT*15)vEexQxu)-?_TT{qa1;uB$ z+Lw&(fqEn#4l5G~0<0r>jwg5Rc~TVSVx^JSU5WH*tNMN0;VRYNgi)KGdE|pTZY%TH zzvOm3z6RYpK0qrRwLp_A5av|QpjuW9mRP~1|VMWCQDl)c3hwGTf*G2o zlM~)X1!RqtC7Ns!x7}b;QTe~932>0s3RJ`7YIlx1KtxOZ15b1FR%f2v$n9+zk!MFG zVwAU-%+K;y{J<;P>vXg%7kU)RajoRfhsZvib^%39GIN$Vjes!x;o?$j?5aPR;GD-@ z{FS{}rOElrd~iSVeyy7xdiS5-Vq{7b&9J|BoHw))`D8?3T9yymCQ@)4e^v1 z53A3+a49|?t=o}IbQM|jzvq}^5u4t;{A4n7cipwJ;0|T8U~o!aYg<})TjET8;m_V$ zOnbk&G;g2Zb!PE{C#yRwApqP>*AM9#{YV^9cn>6$<-{bM{et>*_>v1J7WDtY9(Cn3 z8Bj$!fsBbqt049}Qk7AsGH@iX3Ey<`EdhoP7n+FPr44RbZW?K!1so5btn4*G;TkJT zFBe!g5bROQLq)Y0dzvZ`>%$p9vg0nxYGH&P#)m#ef^pBK0v^3!>9kS_8)jEz0&?{Gtj?}Y1g7Vw`d(9Nf~nS-C$B!OBYon`KhM7*APCPeExf_o!+Q6W&V40 z^PK3D@!P{W6)Te>vrfhPXDJNBzR%$9>?~01oXgv_WsgXJRF%WpAvr~=|3WpDyXSp( zpRtt~+wz*4r9My!DEA>l(nu3a=NO}8F(lD;mlMyH^_RYI{e)O&%TMd5Mmg7ryt=^wE@03F4XG8oy4`RLqG7FTK#9}y2$18=-jvXbUKG}%DUH3 z6iQ3DnhD7qGOX77Chav=S%i!5F!hcbo{h`qHC1jIj(#}`yDL4`JdvnVpMi_LCN!gH z-rpvF_k2l>Q3eOj9pA2gv4aVu_>d@(vvc3pB+m;j*bf(nq>iqo-ues~slNJ(2&@pT z_!2!z-Mt~6dDf9T!4(ruxhoK#0OSYAOfpJ#_~=9^xDSyiem&OF&H|rS zmqneKZ!`5Qg)M-3F^93%F=UlF01dh&p;=)-?b_}Ee|Z(Q8Ox*R{|WLpSSNMW;$j~~ z`jv`)O?&7G`||>!z|R6dZKY$Ge2H^hDWGju-W%SAg@NHX{^F-7b1jb#)KYOEJKDw6&BtC!PJeXjs1=i5mF8Bc|IHnfXs`bj@bu(bC>I)xZkL- zMs=w?1{h+Z5?64m8k*0fnYhbM?|{qukYUL{H-GH%VBl=V?g}`?cx&AlxyG^pJXhh z{8qVqb61{F`EJ|8@R{j{{-NxZfpY3VwOCflQo2&dIaw^byT~lA;2tETJ=d(VYeaK* z@^GCJv<+Sa>67CZmlgI^nRgILdtD;8(P4{o4y~Be5ETMxoBfEBaBdKi_50mYPblY0 zy(vu9U>&{RL|>e7&v8)4dFP&Ff?<$U`T{Q8_jieW9M)f<2*S33d^8>tJ;XwO#>eU(N_Po=(tAf;U+ zdkxW>I2Lvt8&B5r)Mo~}fY2cuNX~})o$)^U^W486Iidk6A8BADq^U7nj8X@4Oolr!(8bFlFf@Pfh=Dg|BW@EzFkH`ZfiaY#45#lEdyuq?C;y= zBKDujhTx`cm5>zUqMMcfFzp+bU|)?T*vAkJ@kb2(%- zZ^xmv3<_-(WQ%D~+U)H~fQSI<3oV?q#|aR)&LN%M1P|dzFBl|o_&cBg(02HPQYx@N zYyM=kh)_0Se@LRZwW7XZA6auW}lo4WLxnUEadKNEV1F6qSH0%zXgg3XG>}hZ?0eG7_Kz zGGb~|MVc7yF~GY_j|oh>dP6F&;OyY79&QQ>RwpAfLEFK>NT92x+dws49c|$YmQ*{7 zhsj$&_cB)>=&VNMzIr{u;|jV)p8cqUN?JpOh-AUmaV~@TwPz25V%H1g3|=^r+l+8- z+mFMSAbdCcPfp9SV%m*kM7eYj$cjBTmgE_sFg6(=PoB;gJ4HEH75>i z@Bga+p)bIKpVd&YUKOBL=u!=O6^ei;xZAED;O6zf9=&bgVHn3`#lD_Gf&B)n9`{Cd zAe)w^VxN3j#@k=~Qd`A#kzk!7Iq`2632zTzPz8JLVOElp(XoLpolCDC=h(||Pz|I$h(_QehS(b&BibCh z?}CXlDZ4eJ3`x9lNuoC2~(IlNT& zFVcl0N5T3_|B2{>t^}%e(}&2zII?adMsG~<5&x6sqv?UwDnK{c5oXscdr1=m7^91Y z`13GI6}|D1>?q7I=N3|${q~!V&8-ur+BW&JSiuDHMrzFR!5mA$1%##49p&i*#VRO~ zIvNdFjzl%f)5s@mYpi_jh`BnU1kstJS5AN{p|zEzHd$8p!i_)d`;mji_ZG#;g2cU$ z&;#sL3Yt0&_(#)38%N-3*>uR#{$@Wc1W{=dYgQ$siK9ndE(3xpuxE2W0t~J=tOrsV zo*|SNGqmYlj4|p*7k8k0?a-oC*)#9FQguwKA?E)>-kV2L8NL0(8g8mvY0x<&5i-}JaRN{sq;T)-hH!vLqEGWhR z2j;p#5slr3pn(EHxY4Kwf|jT$rT=|g2Ce5=BxYd?=u553z}ty;%p!_z>3XtJMWD#x z%KS8XUSRw^ooANx@W!(W}c9qBz!yj}IbRlxhbysjxpUyf+w<7k=_$Gbfmp4{bcDCNu_o>7rItB;ch{A|qa z!vWS&e3%+DsMVdhV6+9sKZU$@N={oSE3T_aZ;`cPg)0O?*56Df%Tl?qr>sFn86Oc( zC^|L~H2M5Q{>w1oorPxX@}H)L`BN-5eX1w*f%|?>Zk!KC{b`GzUm}RhKd)|dt?$w0 zx1qSXTqx5@eR@Rs>V3-8^`M{LyxR|G1sV|K*q;%5%wEw$9~2@$=);yHXr?#-ExCT= zIm?-H(yPHJGs;EXg39PUk{6)GRI~?A~YgM0{fF%?*z{ zweQ0C3wH?DelZ7d1uX?0!FO;w`` zj1IsbUMSyARomUKs~u>USlZ3|QJ5|BY0k5>P0vqcCTU^k9s@w0F!##S_M4rrT@O*6 zW2dRe>+y5-f>QEYwJCT2%KbvxKrDui-)%|3x2HmxA7wVfC91B!wg~tcJ;73Bwn0bw ziRuHU*A{!u(v`KTd-f9X7DC?8y(b9Zs>t8+yHjt!9vr+)_9x&vM;tU^=VS1IMo0B#GUiaiGC9Jm%#+8q`)9(Hii?^N2Zo8BzXBc z;U}^tx<^N(Ke}D1AID@R+@kj0;SMFDlSwj*)_5fLlC^%(H)N^-T2WQEITVq;y?l}T z8}i!qF-s`?CH2G>PDI-h3Q+`TJp2>FsH1!6lU6awC7I~*=FKH3F*DGA`PEW z{C)(k_)(tWfm{$4lm!GaWRw4L`@lHWPLng>j#y~Nbqs4~h_D?#X~So^yBojbl(J8` zCFP<|`Qh3uZnXiVZ5=rXaAM1Hmt3`gw_$Lb?@OHA*C4#){Eqpwq-I?O z)PL>kGwIIuuGBV8o_TGumbI2}Jj$fzcVR7+b_8?yvGEqN7qs%yB}vYRAE&yO;A=yv z=weczZH_7;KUO*hcr1Pf2{7Js3`?TF0@pWSq% zkS;tgx$}$3kv6nZHmhq^ZH4b5PvAg$JpTtb+HYdsOf?+-j@U+L#j&}`+{2r$yJ&sh z2=n~jxx=c_5hs<52iO#|2hWC6Atx=*Z;e$CGZO|8Eg6JP;}8OOO$035@|mNt6H>sl_-dZZS+FtcGolN^T z*UO~jFMZFyP3KlPdG7MGj=;q`gpr>OKOCz%_b_B0KKeO-jJEQ;yK(L)xE%UDC#97- z#+MAhE0sv+L-EY!s#y>_!8!F>&d9GTuN~fs8fOT4E@83Izx1J|&u7F(aRqhuyg5Bn z@H<5|gy9oWePYpR3*dDQT>O*G-Q+)NPO#CxPmK{v!@T*bNd=yqKxk~^x)4sQ)x?Kw z8ssdVsFFV#MV#zOBQ;+LG?HyVI%{TJ^{?GqiXZ$_lU7Wt{XZf%s<19RAgKtOYz(Bx zItzj?uD=5vVZYWV^DD@M_c`Yyi{%-V0aihutg*b(gwBJeRTlXw{P+;oNzx&XCep8fid?INVfIrPztI9erz^GAy;Li9@GO zo)a_Z|0aucfD69Aa?!aq&N))Sb36&dS6idZjx*goy^K?RN{6dtaD#A;!2#q7H7w}~ z)_o}UDAr}bXl)7go@k_!vQVhVbV!0B^YuDIg56csvD@nW-k~$CASgrT!`E<+BPixg zFnJh&Bzi}p^H$%dGd(i#K(X)W-7_Cp;@7RtEpmPY&!4b z0D*4^X0!-e=#l6x8aF=^jEQ;}kGd0p0R&8+y6eSLwS&N8lD6j>IV0{BpQ`nn_x1qU zy05QB_D1%zXOAk@scEbruB5Lc{QB4g@ZDTtGrtT=)SLH?yDS^<{n3bF>Po}46w8V_ zNL*ZxvcZ+z|Dh_$^L6>9cpl{4dl7)Xda`MY!lz2-Z`{HQKH+*97+JBHGQNqvuL7(s zfGRpIK zQ_y7c*nY!grDR?BK8Na!mxiH(0>ZHy+YDSbFtcPnkeLKuaM(IS62own5 z1u%gmQz5HDKcg<=`#y`qwSbI}4sfyGsU=zraqhZh^Pcq9KGwI@oTQs>zWEje8>gWp zhD5ySVSE9IR+F|AEH|;yIp|>c4n&ejT`Z_W8Y{IXbGP*Dgda+BXf@*WAFiiA_u33| zv6yzL35EUHEQ6vQ0iccuR+f>L9Lh2`$tf0tMOjUWi!gb_i<(v*2vwX z=?Dtmrxznz0ZdK>0$2{!_U?XZPI1#@OKfBEnq#s2*qxduyyDRzLg!-uk^;7c1d1m} zngSP{6U?bWyi8L`@Vk`nt_*|47yr}gs-7+`yD)|nY!K}t{BX}pPbdJ;Hee-h%E(q1|&B+V8!=vHW3W?a0y>J?s@mb~dQ9lw6XRW9*nX7d5e zKY^Dx(&M_5oYG~pBda5w4souR;`GWM`2vdjRg)X1=bg`gw85aWQWTsW=(rHQ?0>TT z2PU!^s)CXyqRvPZQ}Pd_GC7A^JiWdgYI#gseZ|a-%DijSmjKE@FyLowO#FZV&&wx; zOiRWjbWHxTFivLTKr98_p7|H0@;8#=Kg16I@osFk_V-=={EqbQn1|W^jqGYKA{Fc{ z-mwGeF+uRvRcPIKgXX=#;#RdzDc0;zVM3*Rcn{vyldY(^PlY6d2B&aO_8)Zkx_F=( z#OwoNaKMMW%CRb^LUCeVFYJ5wG?kWSO}JACr$~QrSL*qXu*A;vBnCYcmO>@T_q)<18J+ki`v>3#VaG7b_JT%n z7{3Hk!)1x~C?u>>3Aid~fc?OyxRh$c8ug7v-5Gly`1929T8#%dCI7~SS#8G4{Jur* zbsGuU(fvaL_<0(?TZjj}j|+t@&Qqf3xjx<%q;1Hl5EK|Ut}YQ3@xT`#b%CI0`Dk4Z z#hrY?EpBB?-lIg3e9GzJADga~0rd(F#Y%|1@piJ`mjov1q!u{e>Gw@Y?^+gJbf_0- zue=T7Wx%H;3MDO2kNy|OH6?Mp8-QlgNZb>Vmmn{)HAUEAUlNNcg{toQ6&b975;pij zU)24eQSa$H6(m9K3ftzKzY+rz0rdVqyb!o>yVe~zQ!TR6alt4exm|ZV2)|(l7#Lcv z4Fz%!Eglp!HJqIIesb2V2D_^I`%zy7B=jGah##Hd?3k+D2<9K|ZV#`(Ps?to$MA-k zVYi@1ckgltyQaGylMv@iDOS?op9>UHUu5}qHQ%S3MBe?KU?8hbYlBFsY?AG9(?R4? zHWTe_{tlFv5+uJPck2&;e)z+-ssLFk^tEMS26m1>CHy1-524zmM3J6`Qlm z#1BP61q8wP^>(mi2ws%pANu>jBFh0_m;8qu6ML`lw%k{~>F{hO=3w*H^U2Od<<8x8 z$xX$!4zQ10$lXk+akmN`yJF$4sO4bhw?8GD)Dfiss3x@m)udc9)IONIa-Nl4xTW8v zQwi|*RHV_$&I@Cifwkzf>aF->uJV>!`r+HUD2~s&42oSGLD%j+Pj@w!3v@Ha2tAh+ z2*MSi{3Vu^&W{?3H9O_rNeCwy3w&8_>-7G`qEM*BZ%!@arFy zlb%h7M}%ve%G8`P#7kL8@1Y`W&rLotoYebjr|{U9GkNwI2N)ng&l2)+toX`0>hvY& zuid@hj2ssx4Rm*%T(xMVGCv+XkT#I-_AapC-fv^kvY356U;V!EVOXavdHbGg-}hub zy(eHlLb-t<76>yx-#D7#?e#c{+;i?Hk}=Y@@7Awam*Z(Sj+*iQe5f4mHdZFpCsS1w zSgG97Qum|PC6Hg_XSWiOD(qJ(F5IG@VSUY@zw_J02g)qyh*d-G-Xb&kEjGPe#3~B4 zn`stCdoIuT7Mc7>*gj{e@RbMLC=CK^JWfZN>*VYQgo3@$*sF)XL04$ObPA0Su`ZbB#}PZ~Bqd5!S=< zF$ITJ;5~AW3O;)?RZV$X_&qA*z$UpdfnH;I1-qH*8%8i@7IzJb?;risJBxA2T|$bv zxHj%hY^=LpDN^{tvQI6R?YMAK!<9oR_WVbhrnCL*v159ot4GyvY($f&I^_7 zMLQ~gtN%&Ws8W>GG5R{OS_t5DBC~1j8YsC%%(c6+NAH0M@UmWmd@N?U#UuP8w1!E( z0^84Q`5Ez5%=mZus`9K&KxcETa&btnQiEDjRe}<5)^q|dw!Rqlw@}Uw&jGFiS6LOp z1Q)mjxr$#TkI>_V>Ybms1@W*1XkwB>J0BBgj*iB2)jtvtcKjtQwcYcaX76m1VI)Xp z1>fhj|HiS8*(eQWdi;>d4ZiHS^Loxs zc42X8F3B7WN#$=y4I75j);BPGX42M{gu-ng|I=6NO!V?TjkZ=Zu(A!~@`G5nzjG_I z+bj3UnF~Ne?|@%|3q!+416_SrT)+fSLq$^y-M?-747rm z--0H`JpnY|$mION3UG+ql8GqCDFXzFK<|WZr8Og(#MU`}^8aOMR-^Mmb>CFN5??Vr|c3ubdfV>55tRECw5_ zEq>9l%JwpqIx*(F!7>(0osj6h`L||i%9szCET!^rP}f7k~L32Edtj-?eBkjk9Yo& z0#T!Y|KeWwa4k4|tOF(p&JsV!Bp|UJ5Jm2U{i#QA;lGf(XCFjERL7QEsZ-;!Ikf;G zlIG0ZnsO~zD^(1O{62T8lsk=Wk59TMVFL5U?!h23XHZL)bn z+vg0DBlb@RpyC86N@k8lKz6(46~BjOCerGj&Xo+8Mkj4^-px$QuL67|2llts&VtCS zSm2f*t39B)7nf$cL)w$nu=#}}#i6GT?yFY{9=CTE)0ows+=jt9a89kVO`XI^sQ{FC zrWwU8K)V6Sls<2+RTm!D(qj01hK|)qfmU?HK(4K~KrzOS9CuTgVx zY-y1d2EySJ8(VQcOUOqXLRNO-nZ7eU+Pmg4$)BR{o`K4a`I;Z9&11>%ei`n)N07IE zE5Pm1VLQN$wQ)O@R3v9qraRINyggEIjeJHZ^l`Xwt5@L)p#H8fAE z4#t(uAKNGXp7%oX4X}t#$9=>J;(Dbqzh}!INmoe6q*l&j`+hD;%+pe7!M)AvZMDk_ z8d=cBGY|Fwu;Yl2_>Ad}1Y|ecZU;OdUvir>3@JyM?gl_2p}&%;Mz_aKb1G5hLmu2i zVFa0wk_#?r?8KOy=eTeW^BJ)xuYPFYRAZu_XY~4nRAV!0_N8Un1f?*U3H@lh2%tR6 zeea(5*!8xyKe@k{ycO#ZBR*8LygaqKyexWA|HWi$Ar)X+7niTcE~c2mZpOeptdpP2BZu^2fRB-o5zvD}L(9YYS*sX#Gno)&g^LLKGo8 z6N(J~KWIdD!t?rHz9<5IOh6~1l_LMx${Y}!KJ*Xac(+smASXKIw#`Xb2u6h3$}j6* zCX{#h8IMLYU4DMjjaHZ=t|h9Wxd+BKwCPhYtI^)tr-pgN>(xd@9N+!(fF&mgCgB8c z;F9?LJ~o`^+c#Is@2*qI)Vm{HJ;(12N+~Ki6DWD_e*I@%H!A>m-+NN~DX**dS%4#= z7Cl1d)&jrmUW44Sx@7O8A<{GI z0Hw)z(A)4*eydX#Q$ zK(oc^u}spZF+N^htzqxrbVZPFMVvQpVEl$M-tpJ=LvKhgkKWM|4S?j-mrgVzYOyM- zQ#hVz5=h6zi|v@ddPIp}sKeH6J1MsCG5ToFGj@&-H#A)NPnusopaf(X>Uu2Q7!59k z0j;Q~$+t{yr$o#($CP^~gH*@O2nR86t+>%?s1S4Ns@q{k-;V~>Wvo!+FcYi_qs zZW}vK5pc+tRqxD9Gq&(k@)6J1w|qdD7GBz``5hU?2?8FJM(&g4ol7q8mG3SsD&J%z z3e%w!#UAsj^J9wklxAVzE(8eyPgRwiG5ow{1APi}8tB*hD1Y})(w)ZZ8GHLCe?$ua z6DeJbyfW+)u_3YwNb%=e1C7g+;17dEeCR>_a^6F}CrD-7`T>BW$b{`K4sTD}YL+CT3k6U8jk=PxH>w4@;54 z$F9~<%oM-t{CA?#1F$?e_+YBeQSu%^a~$;x3l0ms%j<6L(^7flKUJQ=tOic2@F_|y8m-O8p)q-lvku{k zZ+ptG5MWtLU6!eR?qrsoF1rB06v_C`4&;I{?uhG(Ua@3$d6}Qhs*)xUq&J5$?cGxTUQ3VqBgR$q}3awJZeWyT%%l6f0B#b+y=WTah}y*TU87dyQYUg?yo-=9tPlc zmO%KA%;SjvMAw8GQQkd*9JBzo=@9Br5Z`yC{@$&Cc{Y>KtzPDI-Q!@sw676!QBWYjV2&F(%N#3*RQXx1>;zkD!Xw ziLS-dJ8+JE#JWb1?Bv0h%{STLqVs||^+=3OKOmdd5fz5aP~MjS6H09V2KIx9&u$EH zLDx;B*uD$IKb1lG9OCT&I~LDJ$Br2gFaS+eY8?nzJ8`N}Nq@Qv3!g;u5bT%ay*thC z+*pQ$7h~4j&r*>0=|gT!H2V~SsQ#oBh^jLjrwrsDb-X`f9K#oX?8FQQ*BqDS`IK!G zR*=m^uN9%Hxp7U1f_NkGXI*CkpFk}CLe8p8C@B+(#rsHL=-PBSbQS1`K9u(bE2VLrt#=ic2^i}h2zbo z3;M`cgpG$TUe-fut|j$O8IuRV{UlzRNF_b_HctQ6Gy0;7Ei|2P+`v4&&N2J@AkK$Q zud89yRKxp0=kkWrSpc(jyT&)WALw&*$_U=5X_HivIcjM@Dbbl69K!C$g-;AVp^IFU z@V(u3eD7ggxB^)7k|G@>;2htT*_b{*Vvbqe+6`uzI0!`f1#Z>2IM852_39$S5A9le zpQ%V>({nLTwEVKD)OPUWn(pVq?o01dY5bga-+u6dIf&+?0^<{LmmI0NoC*w% zQQ79kL9yK*6dZNlQ37fwxroM;2Y7&zilaNJce(YfgMem-y%v|?`}q7$3ohWE zRT!EXCQQ%R@08rqX{{a5cZnau)YOej>73xhmj_Kr&uwQ3;u8D@2P z%XWHOEhfuY+~R9Yf!w7$YI}(9Yo?&==2X(??zi_jB;i9U+sw+TTfNZkCr$dc4Lqeh z`rfWx$COSLXecZ@KP8F83Z&Ck9MU78Vi2E=HoE6AAsO6lsu@!5ZhPPPS{uxI`kLR) zm{!bE$d|YT?0i@kf7rM|(wJ&RxgH=BY?&%*O<*AIrF{`AbNrscDP1&HCf|6Y zBtvVz4h|$tV8CwANoF4JMc59zRvhM1sf;_Wir?V@ZThMx7BazOq=I&D+aYoe?R%BWbBp^yUA*i}M?5WJrOvQ?0O`#ca=5=L z-X#arpZNff|3P|{xx17lvs5R#eSTu@rPbQub1ofTTPpI;y3Ixxo~+B>!5dG37VIeT z%*!8Xs*E2GT3!z83U?#vnp{ZeH->q!+rL6vKA-TE;X8E$+tCi~PSoMG&HQ3_DB|r% zS8i%qC?J*RvRBeN$VV?3!{gaq%l_!=*ch@gvGMliEu+SZ2TpZ`e|8@n<m#Q(l`X8m`phLbUwz;JgmHDAp2Z-w_x=hmc^GHEV@zzb{@s=D5Ehxofs6KOk;i*DO_)0JN)@L8!o`#{+EU|tTJ{W_zlWgr&;@he&@8=a^u?IB`&<?x_w(U?5=u`b*!i~vi^k$Xl&2FqcE3!^?J|7I2!f3j>lUu}m;H~C`3U0UbymuYp z^?d()qkXw_Y+|+eEXQmF^SD$Cpg}(FsDmviX6^y?1rcuS^$(-0T?47UX3Hn+%VBmY zTb|(lC7f3+Ee$ac1%aLM4jj{K+E5og_P+S}e!zr6xoY z>zp}Fn4=#3!vbXIlH_lR4Tr&pLXHd~)2i52*VemZoNbV$t|1uiMJ>iP%gW!ZkIAet z-kmBM84Gd5W`2Ep%0n}ME6T!a zxM(ZLP^z=P7h&kWJL$e5DZ=mYNp*k^Nww6Ty7BVO;%cgnojW&nmXDgWB7-hpu`#-1K%o$k^!hdA$%5nU0d(>%ae7L7CSJ9<^yvs(h23 zj!g_vJtoo)-*W2kg<#*33o0RfR(L^YUYRQB?ZZE2xp5ZSV)rJej1Qjy-!H|!J!i`a zXHk$v-qCt}U1Cm1{K1Ayd$3l^m$DLK>iX9{0-nw8^j4-w;_WX5l6bJDxIG!1-=oAj zAt78ni0>z@Whrd(;AE)0k@E2*UGnd0=D(#LjR5@@Ba6N4Z%gj4}-G0dQ9kK#i zZ!byYpzH;_s1;iS#Zb#U-yi%ZEChb4cq-*io5Ce7?uzLWxpW z-tZ3m4w}3SoA`EBv;p43c)^fvZr*_$-Z@jT=;~t^_OI1s@kq4qiws%+lYMEX^Md&E z%fWmbHu%FR~;))ci}zHg15cDxQ8 z(2KlI(bzzO`nA)y{Rw(EP{VCA3f_0Xhr5?R&Uzt?TwM02T_^fH+vOO3ai6V@ZE^b? z2tN#AvZCC*3VB=lPy6!BtBnmH_j^)uX=e4y3yKF_I#+J}>^wq}c=45S%K<)Yhcp{; z1PQu_I0f56c{~w(9-bN#);Dje^QWHy=faSbT++RljKy}+Q{JBYs4|%E(3Y1II?|t1 zY4ctsOWs9F_#w3^?2GQMrTne2d9 z_c$<<85rEXdhkbhM$3UzdGrvceO+AT+*NS{dq(eBRWM8vv71I011%T7X+bi4wb2a(Z=xa(=5f=FJO+kZyG=WTfg$F< zS2z&^EA!ND#3;MIDWGoH^eCh>C(Q2n`?a5JD5|ox+jOw24iAsK0eb?y`z)hiQ27Pr6t^)yoO(# z09z9SgUc^y0)%Y3yXSDDJ2e=Kq0>`i#L4dCVE=USK=)(@vL3d;5WhIOwPz%kwq^vh z27M$rZ77K!(H(Stw<<7(7^G6*E>Y|Y_Z%9y3!zpU?fhE~%nAkKq&41g=GvXVqp?s4 zDKSLsm!RCpe=p=-<36~x>|w>-S)zQD{vEtB|DZLctExhC;qJ=skukvzVFhi#y~s^L zN2LJoSWKL>6v5tjdT=hQ-{R9~H*zNdJj$~Ito~L+f4g@{p^S!b3sZ0rf z=4WtaT3kCcSMXbH1l=s-jYNImqWjDL>3EMeadWpD{{g`7dw#oY2c;PnpTJ$h!1t9GXDxBB&oiD#7BXFpfs69I zJGagK$v==2Y+;0UX-+Cy4rgyi;M{@#fpCD^jF(hv%EE8RjzS(pQqJNX2haWMREJ7v zMpsvz$@AB>+S4Pt>cYpRdkwbBmUbwTGt%6KLXE$82rqc9$&PslG1BBE zzc^SVpxwoR1*(IA_6n3-Y;T1cZ7x;IT67~>@GbK;!h7O|=?5oaddm#hf^7JMyis4s@{6<_ni&@RMva|;fq^(_GtcSJ=j3{&otQdd zmdE9_XoJO}-wz(m4cq>i52KXBJ_Qr|8{RGDau z4kI7BRg0o}KG_qNI5HfaHL*8DUM6%gJ@`?IngM8`sXlO0{Eay$^4;;nErZ~`YC+xx zD;4X`g)3`9N*98Y)NZXuQy~@IJ@+A8q`-T0Uk2;U5osTH!wa5izHvvuSeIO&yfn1! zG~>yo-N^`;ua)h0$j8$DHn6j7!J5*cE@9++R9AE<-yeQyc`52=5--}bG$irtcs~+k z@M>v-xIMQCN{HjnNr#J`TshyBl6J(Rrz;B_C(!n|m#7WC@)l)Qr&64`f;Zn)>2kE9 zROZq;SuT7g0W|_2$xSCyo&gG`8Q%TqOeIdLTN5Y4_R}XBnQ(V6_B?$OeT9O+vN?#3 zJphOTwy4NFnkr%+ALVuIT{x?l+<9ps8j>#Y| z>dFsE_1&PiW|nQB-KUlye@)Ni9gfR>uk{gB_8pTQB7CFZC!m?pb%Cm7RJ#A0U%#UA zqk4!;Al7jR?JDIpmfie1ion20o(*U2xuEHZz5;!g>Azo;((#B(2*Fwr-qIB?1Kww+ zd?Om=wh)M(snAX$_fh{Hu~4ZT;=mcnm#%`oLR=TuyMsNp# zL;Dt;hx#O7U!^}=ZdFOYG)*QLQo9D*Y|H=sG=#Z@H~sU#$?^ zEXjhcQo*xjn93xe|P+-`(L`$Q{z&QMBR!gw!qH4;qQdk zcmqhkSDnxIu(!upwOj@qlQQP>`tU5LxP{F0{b#|K);#3t zd(T&>xG-UBHYfYs-0S5RL27@lm-ZmKv0}Z^0e_`%V`p!HLI^t+3yR)7z_&E+Vg7?S z$QMZ4p*lgRvzhbhf@UD{j;DOe+td^N@ z1vM~@R)kN|!zCK-bZ@cmt5N!E=rN7Iuj}<+oxg+4^s0kT#(cOL&gUdvQD)l_M4XL@ z;PYL+>zT>Z^$S(Bdx(=I@rPlRw)s8eaXcp$ z&MMgOs)4B4^8A10@#jf}?OALTTl=8$@f4*(3k0K;X><=?_pr~Kj5!&mHs@S zXk{RWyIL954nWToRFWz1W2B$gUum<^VykU6R+NxP+K7-hj|nf@hJG%D&EbytyRn4W zsrS{|QWjR+yVmq$nT~GY@dG#I{|NS-M;Gy4S}s+!1wy4o{byjS;|8ku|L#{%1^r!6 z1zOer=YRdb{my@V^gr>PT`Tgqr#!{N=T!aS%?*s~NLpWDu%@WcZF&5TUYSYW^XetP zHV-p9JXb8I76f<6TW^*&4RTlG9b`c5Xa?+KWA8P&y&raODwK0q))%~)x64%g#7H`nE?y)Ku2x*!+RV4eXs1Z>rluf=lVTfye)r3n-dcU)%S$ zHk#s2PPk%SF-N&4+=h8`?By4-RI17y@5biFTsEx~kD1^H`NXT!oS^2PZkm zcBb-OD;DTXzrQtJz%TjWvZ*YBE?dW3ZpX>&1eia1QKDvE1 z^otcmwfZ8BZs#)K*`5Lh*oZ!!lglsmbtV+dDBirTzIOc2f-Tar{c$ck^ZI!E&7*&f zM^$`|p?<@!)D9_2-mlBCLz+!$6<3$fcS^_aHN;j~(anReSoW#jnd<}jd8Ap%{bv(K zvoWc}RplPZ5BgXMA#vTnns;<_ct>>%z6E<0n8}y|;(A5j!b0tAiAWCjm=F5c!~2Vw zeuH~Do^5S?;Fo3a#yY>J1V1o+%kV%WNbPV6hy6$34@md&)I^H;O%VrGY7K~Rpz8~@ z{=L|YOx|0&eMkB~a=71R&m0%U_6gGGR?J1W$M8I(>Fm+yQ+tvwn!eSz-EMpQKtEG1 z_Z1a%xIKRI_>&3kIlQ+icY7au8azuluNJ}8iv%aoO+QDRcMi=~wx@J5n21tN?(9(kGzn>#l%a5yWdMISqY9bR5RBJKFE;OwWvER?oO)?+#%@q(+ zDc&B?C&h$L4u)cuPvSni(1pcNcTM&RG;DYXHHsK|8KVyDqOUQJ-SXTAzDv-n2Np;OGsan_*?l}+)?;mZpsQAV> z6~7HUPPQWC&VHLGrn)wCSbxVHd{HTacA;!keJ%8s3Xd_L*TT-$OAhL68povaI9%ga zFQui&8IAn26_Cyg|cv<%YtiGffIH zc(yBM2l1AwChtOo&E2~d(c#jvrx1Ds2K9k&>ZSJWu+jaO)UZ(*)@eQuW=?RO0R_IE zFJsoQsR+-UCY{pJ7qu3OPJ|y;#MvA_z7wcchN=@U3KhfZ`;q?N#qyQV+iIxtG+qmz z%guEfJoV^&L5yC>1spmp7Zk8Bvo1qyAHYnMA;)Ex$y)j&X5z= zifb8Av%Z8M($^PlYlk4ZdKR5Peyyt8Buw`N=El9P=t<)E%AHFpH`xtdp~QS^?`0%}5k%jj&FO1U^rpX) zSi678Y#l^?31V@Qzp-!JQHAXhpi9;gPVIOFSDc=M!Wbp@h>!1xl>kq^M!~yu4($5~ z-#&AMcv#U9kM&cY+s|YvqWN59v`baq02 z-BFQpy(h(mR^g#I@LEHWMW;Kh@z=}c#gCYN_G|iDQsvI>i?Ew9W=NL zSBTDt|CN8D=XV@^de9xpH~#{MgsRTBLXL%Rre=csKOPoy)GfMb-@2fX?tY?MaT|lr zYeC%$Kky|G7sY*>+q+fCSBUNtU>4927JEv^j0oQG0+x6S*k3@yfg{-%($$wknD|Rny^;*2?f|u4r2@a;Ps(c@GpD0VO_H_uHPG##O2raZW$U=E&Eip`k3_cS&~6{>`&gYlFN=4y z4}KWhyNyV`u)X^8yEWa^yqeGY&Ky3^$DRs=iN@w3skwb`P=5HT1wP5) z>Mw;CCNe}T%3K(`-}aU{V6?HHh$!z#dC+NqABtceSji{t`#FXE{E#aruAlefyM=bk z9FRA#jtZ?jznZMla64tkQ67hrOVPTi@|WRfa7;H@Zn}qj0lT_-b@J_{kHvv|;V&b# z!^nk=&z8{I&%8L5o0K(O(UqD9!{XS(#lwelX|K@gs##83MW41FyT`APXW99q&jIjl zwo6Zi+EC77y%UJ3F;o-DR;j!1Z`t4P6~NwYj%|dP5)G_vu;!6F^Vg|OiB$mM8G9g7 zm%Ms3I=+bZ;Raa|Z%WmEWKFU2rs!UF8w9p>NJS44_FjZ-x`%eA)d*bH%E$crW;9?7 z?u^PlDPF zd?E^dr*y+@u9p3G;y*0F!+9K*HP(9vK}5U{ArI;nhrxf$jBhFj{SIa1q9HX8k)_l? zHtb>Io4MmZO=QHI-XbS#C=X4HKr$a!4>+c-5BRKlKli}+oMPBGHnEak5tF%+P$QLd zfLNQ|VZ;UEEMp&s#(Oz9P@MLyk~)HhyDDct3m?B}=RQz!*o~*6y!V@R|J6UsMgzh% zxsNU6Z{j?2<3y=1t9~n4f2w~=O#LGtAve+puJIGamI^^XU$X1})_rL1!Qh>4tJ2{E z1clSmnWN&?1r)p2Rm8&`ANy`6?8ciGu2+pRXEq2ATZ_Nfe|CP*sI>6G{LNQ|8T+q7 zapQ?<8LpBeX`K}w`R`P=Q?K_Sl{2BGJB70JoT?gHiJsch>XuI{6DobeRxp>h=91bv zLqF6HTI%Knl$S6>{%W_$`Zd)|~E z*Sp-?#s23?gM|0%+c$T1Iz?DnM!JULyAd6cr}Y_clU8dgCQiTpxy8^6G`Jij{VA#a z)YDIzG16GuvPVM$Hntmx_#9Lcy3b@R`rc~LjT-n?&xic?3V!!bofzEDI8(mIf%4~T z4MyPj;(=0V1#qyW*tSAO3rjcT@mfnR$HHSUlA=qxx}p~A7&m-)gl4t%upfu3dFW5S z!;ds%P*T;O?q3CvF{kMNU=hE1fZ?;>yNb=tAu;ML; z1_h0;Hil}(Xk#-f9x=DrS1Dktyqm(*ejeSUt!#b`=Qbx26&s&X)N>oL#Vv|Q1{Rgq zcYJZMr@XyEzK%~~aZ2k$-j1*mqv4tls{;6;x#2O(X>dNRmpD3aO);2xWj^d@v(V5R z71X=?^8q6vY}Ds^ms)}uvCe5N=!7M{vErG>j971%#LDqbF|2Iq3rzF5s{FV>uF+ru zWs*kt`sEG)jYN8l-RXAkkFX<**u^hDh50L|NM&MoGB4SZSk?4iWI6rL4*GJ)RkS|u zBk|IZ*(2jDPlJRjmnF~T5$n=^<>$wV6^r6c`;df&@7F!E2a%cM?%P7Bl2~)I)XO!Z z!_x~n?Z^7Ru{ZPSU2r)1;*z*^p~3ihtKU4CDZyr2IOwvDeEyx61M*5#Wa$|jXH^$o zT)3|y+pDMYho)L{e&r|e`2z{lR=fdTpo2dcequ%WaiX>WzWv!rNs_uKg{{)%yriZa z2lpXfR#rr7LVDX>qqRGF?_2HWY>1cC<=E6h2Y4e*?=uK@5=|r@T4IS;q3nKSYIgC( z{J9f$?I)60^I~C4H-eo~uc)SEQ`@iI4b~hNS3cvFCP)I=lw` zH^#F!-@oBBeyC_&%D&Xx>Uwt`{&P-Mm3gFd==g7c$NQ?c1XyJ*`QJQSqBXpl?7583 zrFr9roY5|BKP?hd{A4T)9%wr0vv5yE)|8sXwiPSao!c^isTXfaS|BS^K?U_WwGK|^{qaLgpi>2g@e{q6r` z%p(otDv#*axvp7_`n3|t)pH$o5fQBt3&%SJu!mPP!e00qmQdb@4`0>4yY&9ch4y4l zo0lr%%S`zsi3hWp(-q<)NS0ZQRljsW%CHMR`)G_z2P6>NlXSFpH0faP&Ym3W##aEv z(c0rzG=#{%rvV0>N~rpxS8Oh=po03f&%vJ1c_?qvim;&ERx2faFG;vJT$lNQ@@c=KL6E}T%Zk#NOUp5PR!gk=G!0fU*yhv| z{j=d)7TBmLs~>N|HLFk&KH|;3w zzW`<`2`+DDLBPhql^eGaYVrwwNhK3hCQg>7D2q8}z!h(aU@uHRRREXz{y)Th^1O_@q8U&K>_Y-Zto!?HCb9D+oIEX)siT>p+U);?I z0rCXfWzGfQgtAKw{lUc%h9-ZR8UspB$lKG0cmrFRq@zw}Ap7KN2=AK?8>?S4eF;fY zKT&{cB@=*-z~`#anni&No$KZ0q$`hyof$U#qR(&IA_J9m;Gy#q0uo7Is&N$s(Ow7=rCEj)<2gpUa0FY zpz1#^;)K_hNZ8+qx2gO6R5O=LXiJ>AYUz_qby~5cvJ?@7-))Nz?qKl28G1bHOYH<} zSdO1x2lrrJKv!2#jWx86lP-c`i!HqE<8IBBl(u#x~3UxN(n-t(bX8n5ilc(jjh~kC-m6j! zcmmfS*gcOStgYr!!;9ah&Y>>;-Z!klZW7%eb5@fUkaWTg1&%zn@GkeuQjG6{Qth3C z$p?3(;OAi6DN!7y%!@rl#^14??}E4D?9jbGlyw2(Tj_G!S@daeuo{4xxCVK=WXBF= z3SlQfV^>Xy;?|o-^^}#ZvH-K-IP?Ovr+g!>w}MG;2gPBRFQxw^#|DwcFX9sNEF+`P z305HyynY)hKLZaw5*5C)cm>z2KhfNfop+)0v!k=Me zH$~D`Sc#xn#&F-HbZr1FblDGHlWokbkIjWAkpKpd%l)Ij3WR_h= zdDhH%u$DL-hmkG1ir6y9KDXHyhhmw@roMt(Q<`cC5qCX+!=S51H+OXR*u%kg?I48z zMx#e_JR@3%kIqq$kFLa6GxkvY$x6E1G?bE>b~6^%u3UhzmA!!Jo*YQq~JD~qP2avPAFSN=~IV$Oa+Z?Dl$K3 zzYnm?m&1B#zEn`$?yBq;{0dBxKv2(>e+Sz*;jdZSTO`RD8EMl{D9-zX5U*Qwh8@Wm zY^xR-^%HiLab`a~nw;)Fv==+jX5@mn==qLR(z0pHgiPt{z$XQ(^Sof@D%+-xh0cCBNL!CJ7%^N$xoZG0qN>*3YJ6bqq zUoE3gA5xCoYDfha%7ZkQQ6pY8gB*g`w1fI3wfAst52%IDKk=#7Cieyd5H}-*7hkOu z_WS|gnz9DS83@4J-U^VaAhenNV>3FFqMK#Yg!~0~?%cDJREr?$`cVN)HPmLrg;Hqr zPv#vcu)J|Z;?V(>`tMJ(e`Gy zt;T}bN6v)K!oV6b@Q};0C6pc6)HiUeULsw`p;$=+SZ7BU8ZGf>uqFYlvEhtoWj}bp zrDvX$;_Mt0#`WNkQh27=A$<&bZ(F^zsQ)I!1@0@j&ob)Rd;5(8tZY)mzCJ@#7&=@K!de70(n-PZ$(jq2E0MiH@?Lz7O2mQW*< zNr~Nmbf5(vHo7~LnS7XWKY?h_AZ1fo`i{91KDGKP;*k&;>d{tT(mo7_gx1fMQ&TsNG?H^R#4Fzs*D|*114x(qE(L^{sx+$PSDwD zv$o_9yqCGz?+(n;t7VqMNPy%&*WlVV_$VYHLKdv6X(zNOjvX5rrS0e0>>!lBT|K-}jVq&5W%%|dzM47zRufIg?y z0IDglH}(MmOy$gix z^MO!S_lMXII&1yW`eg{Uk$Gj4*(6x`zLHiyH#KL z_SVcMa+)j^JCiEv`v)hh0A-3N#6^In!=I`3FC>6e`HLnTqrn6~(C}l^%^i<-UQ!ty zFhl{SUPbhcw50I?EJ>~%)a4ar>PH^D&xt>{+R!5$2+}$pWi(*e@0_-wys!Wf@lIQs zE*7u!S@T`BTTwCGh-tG_9y=F) zQIdrkp$DK4#IJLo%e{*|iJj-re~%pTyyZBl?@PQNz{L8H{nfYJN#L3JS1SLOtcTBK zelmya>YwH$_0=0)1VD7I5$U_YD95IjqqpRt*suH5%c~`1iO)Bg0g5C5N=<<}ixy%{(IBDYNVCWE}T+B8xSO7x$pKlpL_Scn#OU)g~KWz@c>|6fy zfj*4_bTG*>`Mvm-Q^bAX9vo`HF)2{iJH6D3j7#a?klf!owhus^>KiaoBj95!;F3AP z{QnL7elJ0M2r^hmF}{U?Vhc;@7sG&$f1JY|NZ$o!`NTY15MZOPBz?5AiZaUmZf*9Y z{%Se`U-{(<*$>*eiPnsHO__u&$@((}vRzgq7%H?3%;bfdytujw5$5YRpbHt^_CU@_ zts|T+LY=DJZE_R}wfj|YHCJ?10KW^yr71qTA8d2bfYWmkkQ=Xzc>?d-@l$UiiTZ2I z3Pc|ZV1UWG!QVP-!XGBJ;Y!e*f7-^pBmbHcx`h%4WjYrw>5}}~Yh`r8fO|-J&u)GC z2$UYVf;@%%z%iX8&o^|O3cz;T1`e$tzu0FueWz~$ol^6E+OK%D07SR}U5y}$(SxqC zx!}QpvCgpYd&CI7Z+cf!EZ|QxUGauOOlC{Dcji$`*~2beM*Se9o=cD81isRgz}sAS z1v($2z@9%*ypqu4j)3O=ZK%*R_!Trf{|FBhV7nSEZ17*i)do+++P>=+p!#3Yi_|>| ziYMY}|DPYzMS}@M)oEU!W(`Qv7KLuteYZb>SDK-}zjaW!@)J5kIdD^7wF#~}YTpiT ze`cbhQBd{y-yXR$66Vox0a^)lo&m+it~(6*p;4)=|LHIXVqjM2bKB?-E{zDda+;2S z#58&+ce)b|o=Uj=$5zKU@I-+kr{`4pPF?$NBW~BA%<$4`{mIPuewmMpguesp7YH&X zPUpC{u^B9iO{>V&=!#i@a=LV)kvQT13{T)Xl)rx_zoT5Eog;lN)^DTqq^g(F%*hs& z`7Mo~{5%yWmWYIDyGbO16bp6gc!ydYh^}l?1vvOX0=p-)eVMBCSvff7Y;8Ir&osdH z$=~s%icK@8t&v@239;O~UU?$4d^(JnO#Hs`FssV^i}L>t5+5im{`yC&xYF)N&zci1X`P0+i8ee{oE>@}j7N)UMLT(mR8 z&z>QI0lNi9cwyqhQD2D6gBigM-sXIy+d0|$BEKlRkai8!otfP(kCINJIWOpH56HA{ z>2sp_nnfjNEHV0gM3u8!@3YDTaCH3TtelU~S}UnGxw(B&gZ7_Ci>T4LhG+*fq8|{1 z!z4xhtP9L|=%+BrRC%rnv`chMW9lieXGpY4K-8FzdvbNJlFK(-%j3~V(;qE2M&x5l z13$c;)+SZGaiHx4>#H`PJv(m>z8n#GL%C}T|Ai2gY!H--q6hj6SiXP1ah_zdD);j+ z4G^A`4?dc@+7wA9el2k79#@e!iU8`!+8FQ!6mx|*&${BBdP-5&x)u>zQc9oU1b!P* zQ7mWm<6QW!t%y7531HwtTwvh<7JUOCmZwc2rU^(j2mXyd(4{2k7rEMO43uGA*yVLpX;QlQb@y`wLeA(#nbrfbXb0lrn1OyQ`RbJ&aye z{}&3n8hy3f{xXGp69h$`?cZv@r#}HSdhY?@04Mj+HgUdVG5h4rTO=M_ou+@qf%*~a zmpP?9`xJ^b8(l<&XIPvD%i>(P?W`V9-3^#6pseozUFkg7DFEK-FZCx8{q?*7#D$Z< ze-1uSX#3c-{!zj)^>(FT-0CcJkCs7pQ0~QnaRH*Q>;sn5w_yRLJ)z?0P4oi(h5-6_ zrli&UPJzp=X2TICm2`NNcRV8#)&p|ADfH%AVu|#O!r8pgnR3TG8m`njY(b9})8!IW z7-R@aKRwWD7~1+RbbFUAuv~jc715^;(yU3F*h}>s+J?68UUQ&)5>KmhY)qN?+2f$F z4J6|pF{8d6n0vjUs^9K-dgxwP!s*BEPp5{Zg|v?G3P*+mQy(_OlKB4-a>FlY-Irjh z$lT9cIrqJ+LxKZ*M{5ke4lcZb{5&QSs`@&{7t0&c9A9@)Qg!Yo1{JCc_RhPrK@lXf z)5&Z6V}8s+bfERK1OYPqZ6+tOeCu`p)CWGKJ9Lnl-iD!3y~g`O)zcfgnoL~i1|#{I zFEj=c7AGo%yt{j9KO=PHRMm50R|j!&*7NUag)igIDbDYYbfoPRvYwt5)w4m8cbQHb(DCgq zZKq>hFV4?ksVWo@mrN7}QA~Vv*V6sU4p`LJb_*8DDO1u}^G#29Uv2Q}WIOT`EW-8R z`k4Xuh2{#M0O5NIOE(l;KvVg>Sv>uxMUE?e&k=3j> zkR+g;$(~wY4bg)4#RCn%7j9PUPgUDmJFRV?235O~RHMt~7lB(01>=6#4CM1-1)H6E z)Eko<2N>bpRKq;I(gJho^_hGl_u}r%D($<|3D<*Lr$Y~b+Fq(eG#lbK5(nl)IREs2 zH<)_Pa@Y&v7$jdvup8Cr7H8{%ns%LY*0}}lsU}p9<{$)G*GF6fa-gg4K%=;{)4tY% zx@pm>IE=fsE3A_(n`PTfzrYn1cK-uM_1q7|W)0`H8Ac_%E@tjIytuU7o;A^+XkaJk z*7Nx0{Ca2`R0~;?=hT0|mF%kEw^%Q!<&ToE1uv2ZtjbA*{! zeHg#>cOF|oNHZF)!`P}MwZ)y--m*RH^?HfKletF_Y8e9yS$@KvNzncq(>>jCrzRbG zj}7yEw%vJON7cpkpT$bD-ARweP2*+SB48TTE#BLZMR$*!F%-!0T_j=+Y7bPMw4_In z9;G-hRa6AHCmY3qP+~zDnaCF=Q@hi@HhY9!%lRqPGVzFcqh4Q~1ej2^&M?b(BdOT_ zs3CjD_oRTrk5QAInnnl37B;Q5^31JjO-2>1AXf(s?`NMZS{Z%ZlL_VB z{*wlMG09Z|I0*3;i_bX@8jm&SEgZPj;lcH|8}V&`>=8Yn)s21v#JG)*XGe z(6$m{&V_8pEH)uCaFAh1Lb+zzsWf!Vm38bMw^6SCNaf?gvv_S){o)4D{knJ4X&Z@l zd%jl73IOsOUm&u5;KZI%<&O7Lb4UhP8k2+*2a35Brh-M@l^D{h`2L;!VPInSOP)^E zx01!9$@8}IZ}sV4`1D-|B*X3zU7nZR{EFpw8PNRCeq#BeuNeU_%B){HwP_{?>9$iN zGu_aq@N&O4O#N%p@l3Orb+zmn=k81OeP!sXP3#BoY4+9K^NJ|(5(loh+0h*76UV^& zT!Zee;99QMN6BhS)<=pwQ73+dY1a|==38P znvKH1i)|$0ojm^F+_!%j>zsar=Zy7T3SzI8)M{rK4^Mf2OIwPS>$IBaxgCz%Ffn+s z+FqI9w8HeS)78)%tMw1)2t}{j(<+PATTVYJa)#CMABrLopKuRjb*J%QC8 zSOjQ#3X>D}8}*Tl|Lyglk{qpUQhA;k8&fQk^ZvbCZAUq!WoUe4m8n;lfSY~et-Qz8 zb6;u#%6L`t{f(58SRs!}h^Gi-W0gCU;{IFw*xmGJrSj6S zyt00xqth+uY7}vyBYt3*uBpNqb8)gxeeidCoI^F1H9QLL*Glvi!YNlOuJ^T{pxr6~ z6mpHesIYrw?C07Hv5GUG+HXQMFLC&7Kb0ys)D#X-4ti8$&>tdBV~&h>NCaP$Pj^x% z$ap*Bjq1-`*>%`BpA9x++8CGh>|J3+Y7U{`u*v0YdC}2h(pTk-F+h|LsQu){EmE~S zhWB-Kl!`t#l0BS|S${AH@B0d~u?p z^x3q#l{IhXsYt)8zvKaqvKa;)~Va6zewJMUt701N!7BDDIHpP zg^PTF4BapAVa+zJ9857CqDdT;{9*F-6qWeUkKprs{U&#^+Jm>72tpFt7hgXffaX5l zPB{%cOF-=sE`U@EUvlA3uF6%HD(lYs;!N8I6=2UCR8|96V=!jc$Y({a?fE}d55f`b z|HB0U&`eYhgOSXh5zh+Bw86~?sV;t&y~Yw6D>(cp zv)+Ie!f$6deoX7fBN=O`dtO%%*?-#^KXN&PoE`YYBa^_AaH-+#&%J#ZO~IVC>%vvz z4_?%xZw4Xq(f|}YMlW;GFL@Hllxx)ahG`__7GImzlTxuLKwCBE24zhW>%7qy?T7x* zD00zmGhUKnn>=}U+E!Z44?g-cD+!ktl5c!y+Yf_5k0Zd+>3O|^LL$MHe>h5}B!iY| zuS>m9haN}8Ps_GVJGdw?E{s`7lrCp-CgR%`jFKSagUVeZracRQe;n?GT++OQsPV){KJ)`qJsCozl=12>lOj}yJYSNUgY;+avT3vfUz+)B7Z}Zxkv7B zoC(nfIL)k#;+-(BupMQh2kjugf^Z0lRVKguA&c3N5-0hC-a~H-@sbj~RMXb}c2LW$ z=o>B5K>+|TSUndGz3WqT*FW))LECKTafq(=x6Lwn+*}B;UJJ++;~VWR_7C9If(xHN z^(9o8mOG1q4|}MdwHsJkQ#~V3aSVSkAhw>WGwkUhZS4pHHg!RNh8`TrS|sO&F1dRX zIdI%XKWIe---$KI5;bS%u-dye)eTzt5_6V&6xH!!t0N8bL#s+6s{l?6b=V|jaNfn;3Es~8K>=+A>E{0GhZttoKmInYAo{@7grH{a+0K1Y zzJ#yk#t}nI&GztLB0z-$2@SG*(Z{taNW6#XWfYME6NJ>~y zdCtsiw&Bw%Y+SQQOi!DXx0jp32>Dz|yDPe3gfCQZoDF(<7I;?KjGc3Z_wkX{zNK`8 zvH$C!2q9%Of8^|kwtlPRA^4Cy<)#o-_}J?^nvjKw<)tBbLuFIr2zi2|%#W8Y-{;b- z*W6?Fw`A4M@gwAUT!88hu7ckvXACs>5cgpvP~T)8}1x{xB%W^>EE~-0dX;NHiEK$s|ye?TIPLOw4XvkEUCXv%;6$E#CBn5jQJNx)D)_$L^RdPhX5GpsvLIVt*lk z9o*cIC9^Ff4cB^p7mEt1U6zYyv;&zSSb~g{TIW%4M~FX|HBmoyUCgs07yy5yfc?y+ zuC>;`iDUz6=93_PYfb+bJM?%@<(sMYobRE8h#ZM3aQ^%-n3HoE2}TuijU7CFM14K18S#4Ia5S6k zcJ-V9+<`WUlIWKd#ARf`nPS-UJt-du%_qjAn?M?@nB7Q{RIP`O9~IwG}sdL4H}-5sm?B_wUc2-67wT!W$JnDf#6p z#-q7fJLWUSt5y7K=cIL7W8zs$cZ0hSO3!Hee*B1tBK(-P$IBL3a5kR-y3*s1jL zNoa+obyD#!*gESDn{`sQH-3~V=^0aMwP8WGH=c-TvfjD&RZONyceO+5McQ9BD;5iW z*Lw6ImlV=e~97^_~l_-1%Km+}T>|qoGpT3;l8Vr`Kz^HyCk~$dJ|Vfj0AJ)?27= z$aNI2+uI0aap^TUcOZl%kDWxSWgwk*z9d7Es`HI!YrNvTJrj2B^N}wHo~m#j#Q|WL zFNJhkI@6;8hfr+JiiLEI~` zH|biI8tTC+`O8{~@ekyJB3YIHQRm_!sMLVnFto#!PpOcY&qHMxcE)!$bfYMyGP6d8 zpfj>?4%ONH?BT3dPd$b_O~!R+e0c$%R)b=8{5N&3sAv+fhLt>Dg)@h8jmtwa0?fG1 z)=Ho}u~m7%MzJd4pfEbHwrTzgm~IpG@GoE28==IyVTCBB8uG)Wa-k~&1MdwCk*W_* z#B(oJpcAduQHWr0-VOP+SiOXSAMdhnfV;)c;QW^HURAF6e5 z_ci7sWju#-Q&*=ssZ4~uypnYT z#&$>pyKQI6vn}cma_|{fxy-58wH^Eu_0G(me}Wd5Rw_9jY%$0%_LX=1eWEfz zK0+Yzgh5aX)+^q{C_;AP%weeVD-S{`6KB0;Gc=ht9wY7VWm&$8vc)^_I>J;P0Ooif z#OaDYZjb?PZQOjCZ8yYjeXhc+n(0VQMFq9EVOa4i*R81T4JDi2w3}uHku`C zfZ-xsP>RI_zkJ!LVKTL#g4@}!#`y^oj<$q7DdrKx#-+j?R!6Kt^$(;` zGnCP;wkSTr&3M|QRSTX?t08C`@n|~C0}t9588oW3^viu74u6oYx`c8)db9T2x|G>{ z&1&r%G*{$QZZO10~&o$M@_6V81M)n1~zPm*n40b#Jljn&fqQ;?WMVi~HnYcykgiQ_0=!DyP&ieU71x*h4Qe8j0;SKkMmf6z8 z*!AGzHB`xldI@BP!Is6wy}*-UB-rv)4j@TZJUDM>y?9qsNbU%0GfcWC5=2vHpi-`H zN40>NUU%yT`O$siIb2WmbcgVZznEkXyfFF*{*t}wc7DjAIO6L)WqGYomTkG-K|b~4 z^CV|hsUrhV7Ls%4M&V@SNUM&phLX;R6x7y3f=if>aZ-n}=7&W6*8$@m?3@PRSwdWD zcc4%#6w(Dh%M4ibFfx|GrP-R;pSSEXD{KPgJ3{q67vj&ufcfwv3sKww;@GQ}pU!jZ z0(B=xKC_<1LxoP_00x~;_JttpU^1fbbP33@IpDdLP@|Ffb0>TkZBue1h(+TS5^q{b zyHfJL5U6}J9?Afy%dsE8%wgC}O2M;?&BdQkECYlSH^rYqTJO^jdi0vZj`P0EPt*l3 zg@e8PRfg}~8Vb3)Fl?2)6$92ll6by=GF{-n>wYaqVtjy^G=0}@Q^Z^;Y8>7{@=wub zkg||EAabuY=dfoDZM(U6_Fj3X)2cSyHTV(?5X_yE61YB9oA&^vm)W~W;B>Q`(azr@>x^HIR6qg1c#ghjeyd(JqPSSRW&*?ke_-H_ zd-B0g>hAEI&At1BEPGCPxoC}eI%Lxsjh&YDTQiTgh4XbI_tyh0C7yq4v{cqreH&M~U`xD5qpF`7%O6FTj!4%U$fcImP=A z@Zm`OAA?ML$`aR5U?%0A$%jvmO#>}H1(+doT_pxyDqtjWo6*C*aWNoKnWrU{`R-X_ ze_ONG7cD0|KjsUSo+@ffB-C);P8@(-*BF!gQYr=Y|fTQ2LMlpVD4Ui!qDm9^T z3czYsXJIRve&}g9Uac)U7j{zJeln9`ESa0_1P^SL%bDf$9 zCp*UAWd%OySY64qG~0%sE8hcU{;BI45SrSlP51r+xGI04e8?FfN}+{wSC@bZwouku zMDc1}dg*4b73)8tifX4npVdmJD{E7U3&D$5tL9!&o{>}=Y+7y}Rx&ysnFxBkuK-Jz z(_R}(EN2~9R>QD=Z{05#df8}+;6{TjG3>#vY(laE+I4|F*HA65>eOFE!S*0+|{Nd&ACs#_*P71 zlGP=2opUg@Qj6@nOp};_Gwi_0{e1YQzG#_VwdcRfr`_v=Z`Xx`b-j_|p(*qqB(8)%F^g$|iS`}p%bu%8`lzehAH2O9fJ2n=ZqX6o_1V)_Y8^BUG`DD)FzixgXvQcXUx5tFdaXPV z`YJ*8KtbwU#UJ5`{s>+l9?ELlEmrav2c1i-b5`+w>E_)0j>}6 z$mg)>h2e(jyPad#1tCMuYq}*vXKHS#vJD>(aCy9k?A1-zJPB^iLy$i&AW5!xBi5Vs zz;R#zm7D>3EDIGf-n4^+ELy2_--p}~qUP;h5E?X%ehne*S8Cl?bptlstlU!-}ByXIC@bsUyz`I2@6c1?SeG5;lRVLo5Cx+~6AWq8>m z9L%y6P!s_sXB5+0L^-iRrWR0+Mm1COD2x-{V+0f|1qmro5C<4(W#7ByVyEvRxOL`H zyjv`lID=%hy9n;?hstruEf$JFrkJDZr%ckDE4|8SJ)}!g*|k2Q{MsL zpc^{lO_niSP%JwnX}`Y=*g;i*9)7sW$17V0SE{t-%{FZ=^_mFj>H@!g;Q$k`)z41{?spv)E{1Hpo>kK3RYlW#KarFVi%MYPCX zui=DLhabAMOF@#TM04Kf>Yh`8#<~wPdF9YTH7z8bt?*)#sR&t8tx#0@uxayfNc}uY zp8)FS5?fk_bFW!Xspta>Flm7~DMFz-`_)8onfdssoKbl*H(V((PNZ%Nn%mXmfS0SH z5%kX8@yxD1bU7fZ@l6;hiP`wbeFphvYkUuIq!V1tiu@lzh7{yN(2*t1jE|mG>>Yp> zKj!Gbm7X8Bn<0wxGU6z>R(sjQZrSRkzm4_QYb^|(HhTvbbF3l>Sj&QfS@==fSdbtTD+ATa9K}7`iUubTL&BrG z*E<0TY&ZTxCqDNFb`Ii<_n5$_lr(}uR{#Y;UIV~; za%$*S(VXF!STU)QJGj1-ny#-kwUy#_Uvi-Kr~~W8Jyo1*anqc{mS(J+MuYn4f)`Et zN+)P>-{`s;;Qa`yz+KKHb@YSfu5?iSsV-BxPoT%saEJXY^VYFgxB~?@m2Hn-6#w&!&w0Tq#WH)=`ZMV(Ra|Be1$qp((a_=Ue8%P$3n8k6<5w z2Cx#FVzhkrwR={&JK$_RGu~P{-fM2&sik-bKs&%UU19Q2j{>iLpX#*tdtuXD>YdOr zX&Eag%6ZhRGk)ki%N+Y?DH0s!^*tgCQVahd*VX z+nYdV9W6sFKt`z(Ggs9Id7IONplA9}0G0vb@J}^!V2F1m;A7LgAJJoLz-b=96+|5n!so22-K;(}PaMr%#%gOpFh7RZshBt95e1 zQC7X!xxB0TodAt(4B{*_-!%&A6hm;6Xh3XEe?Z}AmdS0cx@i*Nf?RU|RSJMDe$-Pi znzvhR>XSEbC%-UpgS=hnz%*5vF8k7DdLLuwK=A+kokJ$bk<`SaN-bc(;54#3V*=M^KokdoA`-JvXE}6klqeBQS?#vUGnjef8kl(O`cuG zb*O0!<1}U^@@|ZhL~540gr_47q#HMMzOH#XjMi4-(-sZO-hK>_{3G~_G#Ca$mr5)9 z;bNZp19r9p`I1#4>uaqNWo}$1Tc<3t@GNaH!89Kk=2FjfPgW7(sVAPJM_z38y%gL3 z8^e#0XfyC;xc8&k_tS8|Vi3PRAU_0E9g~~R7Vxn zfZVTSfjqn@xSiLqR>xh3c?d;y+vYbRbKp?pO$DD7t$LJZAl-;C!RWh&Qjpq^uAY4m zl%?pARD_vSenH8Mi2CD#s={$TS=-){fZ;>6gP>8~X`8wd-NEv&fsy!3c1g#KcMu2s zr~h_u-1i;Natw10y@j!AV>%ss^jZzMdV}0Sk+L*r0A zCX}u)OfS{${NVaQkq&hpIXb2Y!DTzkka&)u&enD&%yZYS4Cro|1uajkE zO}|clADXGC9n=CErdjA|K*O%t@1VvVA_y_%c58lZ+44+HBg_@0c@Q-IVK!9j?r4@f zjA!a1+eS+lF-w=-uMbcU?bq8u!yHz358&(ZRZJ`0H6}a$mQ_Eqi>s0HWn(x4?H%ib z>_+j;e*i?|6!sUg8B-?PJB1hT(Y%h=S+Xwgdmxh$5zqo!jPNxzb8VOb)wpY%3rXg! zdMl_|GM_zZ{sPqsj^)j>D*l`YZiPblpI5poG#Q6>ObCQbdionfI46eJWP~?H8nx0= z>?d|ad0g<=Ggh6u;rram?m;&l@eiQKhby=KLTUNAzdL{#XFa%v*%aV1Nr7sC)dUw& zW+E(ikOR^8jIEny)PjcK_I01PpkrM!D<94o20!*zfEJxLQOfLHD>v=)03!NZUJO{; zwnZBLKnDVs=@4%M=*G+z<8RuO^)bvUnmX3y@=IoBY_=1@QL*5JrOsq3!k>#haV69l*2^M~Ky@!fAjT-mx*=2*8ToN}22Hb(2! zW8YEZ;Z_rQL$C8UR&?CoN%2qgG>?fG^6NX|4Ae|Z$7jEQgL>M)_jG|Z@n5N!5!$f> zC-qE)UN2V`7Mxp3E*fq1l!b7!`y-|tiFbibi_WxzE-w$av!2`0-fnWRe{)Cc#&^#3 z%gfuY8bpWdEWRmv6FRIE>(2!j3X}7_5Q{$sIBl~ZQw2LqL_Ahi*^EJPGjD`M2VCnk z8U|8(a>#n;!%|K0^cxjlI4u?*ZS?Eh2C^LuH3?O@1(&_1C%=!MY@F^|N`zIuvumre z$Z!C@)!p9; zBp-hHkmvj2-;NYb`G;}>V8$;y@{sEn7qsmFKJtGbH2l8fp3DcD!NP^2Be^G$R!AXO zwfB|}{nk19`Nc1QE=_N~!M(zzt&&|tTyR z-PbLVKD7?j@1}FS0aSr$c{cRGW*SaxG}wvOIo11wU{ef!I_KgO12%0?A_P~bVa zxXM`hu197wM?s{jvqH@4JjZokCz1FptO3`vOD^$DM$E(|lR)@zs5so0Cgi@}&0)}! zTTv+%!+>+^@>0f>ABj}51Wocz%AUl4Hdt}{WqTQfv0aZ?EmMTRyLHWuvEAd{INN*< z^3!`QheL}?C)+I};qY^w^EJ+$m@-blh(%8-#7aG({lnx!6O*+FJ9B(=ae3v;2LYMi z0+$xX<+{T@`!*_FjIR#K%jv++eEiJBIBY5?JReO6O>y1Tb}+%#{t9r78NF1p4xw^{{dPg;Atq9{@!MHXr=qZQaj38{L`&``2r~$=ITnLa4CxWd>j~c zi6U|7kciiG(jp3AbJP89h5VQEe9k zdmbM=46k4BdmxfJFSy^ANY+-isoIFC63J%|tCDGYOhk07!_KU^qeP`> z*|y^LyhqkGR^lHUV`g$ayHFP|fbKC4Jdh#}8Ll&jT?$)r;XfJDRRw4lue|L{&?&eX zD4_++A6spQ%ousA--k8*nCjBG^`*BdVFU3XFNp25c3*>B%C3=h$}F3DxG<1BsqqQn zD_dXG>%yhcox|8)zkZ%ar^MQ#}FYrMQw2F67S{ z7bG*X!Z}9Yx4x{+&4UEgF5U&DHHMm2{R!UxY^=^BN~|j!mnJ{pqWu!q2M0XV-6nqP zy#s$y=vk|2i+9TmySHTbw(Z~0=q)(h!5fiUHs@UMDtSk{xE&+D5F5Bx-K;!Ao@sYP$2z=+bF5*1GIVf>pl+}It8}g2)TCRids%NGD9cUdQMc67 z5v3xTN++}OijLlvcTnNH1`}J`BfZ|raq;QIs|wI_od+$4L2W!|zJn9SfnR=ia7Kjs(fzdG)2LH)~n|A4H zEB5y)8tO08Beh|oIYn}DgWlIT;(P5*MrL)FimtlKOR)CH*9YP@1q2(%8$&CV74|q1 zL<+Eu`6e>6t^A%oORfk;@B^R{|- zQF(b8m&)p#JE!iNJcAKSNkh-ve6(#EMg-~A z*98u}tkJPMo4c$?`$%0CIcGiR$SNbddWlQS(!-T{cCo(tntA&O&u9_3DC7BL_KHp0 zWoapAU)hc2@uJ*xOvr<>rUr%bOl_^`*4e9z@e%uM?8A5C1`oG!j+PYm-Df7k37oF2 zbhA#~Ra=O=?ppv)jIu^@mVjDIE^D>>q2RN7U>5kKTkebpGn(qO+*NUX_Vu3}@~G8L zP7fMVLndip#+zvcmpthfpBnHIl;0`ZUoILtCX1A}pQ9$_}an3tD+h4cVv2 znbI_Weh#?#3$a8F^UXDL!C*~Ge{}5KM7EQ2PnPmny{L9*r+Cz=dVa7-pgA6GDPGd> zH6dzK_he8TCC%P>xgf4;ELTHh*rq2{@vR>sUO|3OfNtANqR=kQ|o6vj%8Y%USz{`o{fI0tPz zTN~yxTxRZm0F)lGw;WV6b@7wah*-h9_)uF~y5n@#WXQd{pz96|yUl#jtuM^$n)HgZ z1maC6-3Jn7dL2K@+F#y2pSNtFuJJdAA@lWLh4;-LIqz(Wml`N$eUIdtlmpl&J~1Fu zLFv$``L<16`y<`tGDfR*kq)kb6*e$(`;FM3Mi)xpU`AU$D&~9b7ROq_dq-0|yD?qh zxiR(ZQp$B*q;4XNqIRScYl6^b}socKptRw>jWqwYmK`<2G!J zznx3JGR^O*ElYD-_^2Wu<0WI)h4OKW6B{^vD0=2PTb72X@sU`{8$O5uaAUfeGh`e< z$0M2{pnh{`J8;T)^rFJaZ;ehn4FyRlE`sQtI#CKgJ;}TZhf_sLbrtoDHFj+MntlB4 z_wMB$nUR-sW9ZHC{^jYIb?vgw%(GseUXEET%QG(%R(3L;yB@9$ z<^{>Dt*~OHnZM{BMg{Fps!`p%M)X7U)%D12?b1{eSojm$Ba)(JjGOMnyI1QpGOxgT z0TweuTCLdnNy#w*h{ts0wk+0}Xnv5a;xO)~D#w7FnVvf`9u%B!Y9QW@stBXr5??q` zvy$1_%asp^*dVWZmXOmuRssTG4w}*`IEj?y=%m+>;N9+*#@G@96!0y*H<%sxPnD&acK}w&&*g zb$jm3edBcF%l#Ou*>UL--?tyRZw@S_U0$AE`Qpw!r&ROVKu5^CrmV5syg5P4*UnED zxcpt_>h;o<$FE77m8YCx+&23)mz}%yeJOp7sMKxiU+Q=-{dG<4so0uFdmctsy>D0- z`tEI0?aJrZmNR|N`lG_VZmsjPSw^4l_FA5--uH>C`SFyQJIl{)whjOES8=JmuifSa zKMouzGIRZP_jtj{e_7RM<{bSlJkt@B9z2^h&+aX_&cAQcr=J(UP5--S=ka&H-o(zm z_CoYmXaBrYd-6>7zj$^sH|FlAe{<*sx6VsfMrwZY zTHsEA_cd=mOQwZh%eJ`JEN}ZO{dUFPpD(9Q30=DQNy(eWN!P14nTLM)He37m)myV8 z*Kdxm_;?(6cwyb{HT5r!)t@xmbN{AHICp(Ku=3SE-&CJ<>rnip$x;8V+bbbeT0@Ze jN9{i_5gz!z`ajcCyUy!-ta?C4HZpj+`njxgN@xNAsaFq& literal 0 HcmV?d00001 diff --git a/docs/docs/assets/blackpill/blackpill-pins-labelled.png b/docs/docs/assets/interconnects/blackpill/pinout.png similarity index 100% rename from docs/docs/assets/blackpill/blackpill-pins-labelled.png rename to docs/docs/assets/interconnects/blackpill/pinout.png diff --git a/docs/docs/assets/interconnects/pro_micro/pinout.png b/docs/docs/assets/interconnects/pro_micro/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..7e548da515416d061b3ee1ee2908280d4a094204 GIT binary patch literal 492581 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

o%}v_VN+$)tSdSj}^R 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%0A;xo;n=gy`dVyk?opfT51O=sxp5_ow>_PxN6P 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 xt?Vun71*z#umCY=b< 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�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 literal 0 HcmV?d00001 diff --git a/docs/docs/assets/interconnects/seeed_xiao/pinout.png b/docs/docs/assets/interconnects/seeed_xiao/pinout.png new file mode 100644 index 0000000000000000000000000000000000000000..74a1005335a7a01a36fd611a318ad69afacab9d5 GIT binary patch literal 495415 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 z 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

j?PE6oU6*SKejimJVuO^b#Wm}W?T@Jz}FXo)3 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

MVl_QC@oa^&2;C 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

P0e|P#no3X|HJ=gvOV0h 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%0D@RdDvbN6 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%0A^x)-JUaHCoE_| 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 z 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

-A*d}}yJKXn#nj^?Qc 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

#7( z6Y`wR;CR7r|0k||*0b0=`v~(3Gd$_aOPT9+&|1*e5-kHp1fpPxg}_w>rYgXeP#1){ z#FdlA6}Yac@-bmNq?~M#_XqSReS~u?Pt9`h$=5P{^_3ia(Q~o=E$;o$ZKOSe%_oSm zLbyN~JY|63hPY&k*juu+h3~cTsX`74klSbyq9j2~wF%ZzIf$gjTkw&>4~GaU>fjN! zW?^|Rx;MpkWpPH5*Ph9E!emrq>yn}>!CI6OXeAIKMz|VLJES)#sSzQdyh91-$bil? z2v1p;#0Fv!P*M^l8A2Jf35cviYhjUA)SWHJ@}Gci^p}{ z-@ijv%Q^#?GK4x~F_~2pm)bv+f|C*@z8Q&0Y8>fg~ zkI7_{)_B;AAc&ohAn+2TZ@LI%3eK!^QL96B&mDZS{8gU((jTMSn`bZ{plyXkqK!le z1KwgojrA71Y$~Tai&s@alw?Hh7$&Fr$lKq*XFqm7FPoWV>FjaJ!788>;(c#rDWKg?`Z5T?4| zazN8kF?E?Efp&WyX9B)-)V3yCN*SEp=1AcX(x6?=`sRev!{~3^^kU!!;L|(x*JG#7qDwJs@ytpc6V6Spkl&?y$FQ=)@^))1uW$(P^NXl;oqpXfkF?NanR6 z3KlDBq%o-RHt~g5Fggi!ae{KTLw{l@CVh;~2$ds>6I$L;788`nSQ!_bPaKJW(L_*1 zn)xd)Lm9&}|IzbUdFVK2jy}S;m{9mYnsu;sj&l}FjIRsQD8dVgt3Ap{=38yD=?=x( zCjC*4_mG;Xspd<^)Kr^J+-5i`IrYd9;w)oo|Aow5eKk%%CJe+-6a`Tfk)#RLus|sd z7HXg4;vR7;!k#~aasd%%=vE6=SlnPj>Md3ZRH(7k2xl-VqLhx17tCF7m^)p@$F|Ng zHNVKY^DB%ah1fU4{PJG*FYhBSOU@iS&iUhyve92BMKDJ|IVdO@?`(-QKv%${5>^a! zX1iSRlxrEcJM@Q}932jbI@2s?Gt3;=gU;HlJn%WX(KO#VZP-`lj3#43njqqKLmEN_ zu>otqBoJHta1}QmQnlN}K-jm;=(FcZK6$GMG@}3jAOJ~3K~xvL=e&@1cM7)GnA~{` zHu}T?5CRvcsJS@^HE|lq>zHxTr?s}i_xI-cOkTlHwIgQN;FgLS%es~{ouzra?1x8pIG6ty$4yo=Rr7q9MTTWH#?AqkhBrS z2&@BH5%1fNo!`e`u+7Zu{8uj8NXeVu{AQl{%x8X8jl{Pr-tmri@bZ_xeD}<>i(L}2 zi@$+*9xi_kJn-+I(0@-OiIU(vbX#B91N#L}?sCP!gwLHUc;sBksnwD!mb~LHnxL%3 zX~Vz!;pMNm#-5qxdw${fP66;cA2|QDlZeY-(_HtrI9}a@SFSZ@>@SCC&l1s|uPsMF z?X3NcLggJ&DT)%LZ4SB!-H0NUMLGeY1T6?YLc|sxe2^=yIK)Hu-p{Qo|CYN7(nWA7yEFky6HpC}!hRpCbRs zmoO6>L}!6e=Qt~n)J*)CIBJnxa3K$^TTUFk2Vn#%?XkALO82SP^Rg4?Q6|9^BSLVE zg{|{oYkcrHYpI<@S&MKU=K}G<9&AvIPo6+xvCfm%o?r{=@rYo-BC!NCIe)mnODBrZ zZbWf%jp@!oF1hkBS8W%h=N@9*A4A%~h!~p>FxFFDd==y2CTpWHmCRr`WP4 zL#D}*B%>i&spv<7Qb~HD1C*HF9ARsNPrmN|VCnkn*f{zSliaeI=Nx_T0hH)4)9WG< zL(?-Uu%TuhFjC>`KoV)>oMu!*?Hr@cFd&J&p!lSL>UVT_=gCKQn+EhdN%=*gI{G9oH0D)Q(_f;SelL?WnrE8gXczT3AvP)Ko4|4*GE7T+`tQid0MTq(j-?B6chMvxOy& zKkx`2`S<^tx$k%;mp}bEEM9yCNoN{ELXe6yRTO2(RNTdmHYoEoRv*2SmA}4?wNKv1 z^voPLOivMg@^;u*fg~mP8X*Og1L!Ry@=-&MLJT4zgg_lCjClNM?=OG(%X!}Op2w?R z^{U4`-t?`Gm%j9+yx|RR*cDOlVwXhh;>%$1J7MtIC!~*9o{t!Q@TrUo_a#S={w9PF z-23}iu{pG~5=oXcq+{!kpF&=GraKCwzj~YW=f8i6fAvr1scc}n^EJNJ%ir5v@3#Ri zi{Q1>@Jm~Nx9h%kx>@@hgCF__uk9>pZE)oeEc(9 zk#>05bVPLOVeDv|Tp1#v@Tw-@@Jc~lpiR3O9p65SM^V=m$!r(#>u;jkIKzckTuyso zFJ(1BXhU9=tln}9?vWLegVV&Vm{4l0^C(pjVMvVS*xHznKjlWQ`?X)=k-z#358Uz> z=(gv{FMJyMUGGQAnzYrzq|-=6Q#}?EMAKFAfzMl73J)kn0OpqG@ZRCP$J!d4#fLzV zSJ-lllZv_!JTx=U`1Bf2y5s;adhL(!R}UQLt^eis_??Rnaam`I+$pSVQh&ol!SX)j z!o{4jC4PO()Y_1!lQ4VnWlV@Tw|bn><|f6&vh8Z>cE)B^AcUtQJLIxP+MM~Bj7R?T zL;Urheu%z<&`xO0&N6)TJW8xF5|Ee(FJV-cjh@4Kl#&=B(L!=mLcgwwm7=tcS#8+x zj$;I*&`4*|-gD0mVZLs*OLr<```8LgGZEg7DF#E5?i6`dP)s~hD#Z3Cl`>52nM2tM zpJ<}q9IY%R4ubwxpK)Dctiz29Vx>UE7^#?)B`QgYVoy{DCf>5RxP+fnte-x{AyLwO z%H;S!%A+H9E#w95^Q&B;u*Fi_ECWuWrA|*(@K6_6)k!#damS%9?_Jn~;i_a&DHf^<*pC z9BK;=wHA2blXr99C+_5~`B|neJIKPqUec_K(F%*hZV#BOt&p#-GC6mK`D~i&_bkv| zS%VWNz)cA0UPRGHC=W(~nu4$i#zGZAltO=m9*yzB)6-vD#boc^y}ai=@8Q_7WBm4S z|Mu4;y8c$eO*h@d&-~2K?B+o1VwXhh;&I^OS3|Y+ghrdvSUzsMRiy;;Q|5pAS|?L< zvac=4v)6tCZ}I#Kn(O>F!iySvdj8$kSMEqW-VVfTr@ye~HwtB*gC60aaliYjz?PM1pqJ7yFOwBBjPAw2;ZR)zD z%5&^sjluadoH+I{tM@#_qDc6@y?fcSavsi|CZ{HNNvZ->2uLf4NO4${vQ710C79D^ zut4T5Woc<&b2%L@g&=WtO>He6h=bz5&;A_tmH(3M-~TW8|L4CE_asI~I1+3C={0B9 zx0!nKRXp{{Pv^-`x|TD~`3`!A4zO|jZi?UieWaGCb{DB~tN=nIMh!wDg&+V@NW5r* z@y$W2g%*U}>?-BYw=EojlFH))e)^e*SWOoAK5f9>KrSEQe%hY$~X6xUwJ$ zH7JFPB7~3_6EiF;?zrs}>maqE{z{WOu<#yuxK7+jYO3FCH79%D~qg{_yD9=FM+@Gr#p)zr_O&Jiu+Y-NvoA-pbu~-_5C0r>LsxTjn`( z`0!z_yY4!k^PK1K9pCXCTz>iGpAVkf#V&S9#4f%%goG!(4vtKJ-5i^~u2}xwhCqmK zKS9`wvL+PnKlQ)7M&hgCny49Jy6l_axluosR9%+{A2;ur1iS=MLl6*0fQM875z3a} z0+<9h9-;1gfWz~9IDBxKm6Pi{df)pwp`j465xF{rw-!I~#8t_Gc8h0aEoR1Jc<6I5 z*&?sO%Lr*C&R0lkLQn+hfEq%Cm6kSwLB352Oq4`eN1hMxGD16x6Mzy3X9+l3tu7)> zNPgviXEhoj-}bwh{rkasLQqKMXe}@Cz^$L;_NiHxx*b9!=w?^Io+XC9Ce>{~5WH)0 zFKCE_cQqk+2!f#GP6t9Dkk|mic`P7(MeqVA96~B=SwLMAtfkH!ONTFEgrkG+DM{>3Yq3`Zp0jMEzfl7pA=qi=sZK}v4F<36^wH%JJ~q|K;_t*b__;ysbl zi6+ zB28LURfQUj==NsW8uz(j?;2!$71t5~qZFl%8@H^o!ug00MN|f?D` zu^^gk!}eLGqL``H3}gZfP-WD$#q>8}Xkk)7UcqS4yvDfG6cMTtB{kFz;Z$RVTa25G z2%k3l);UNr;w)u=!cNA-$rE?^i=v2YuDOP5uDOPrZ@zi=EU}AS?2?Foz(nGbpNH;M zPgo=IO^M52^KCQ2^yP3_1pjp&{%{0;F#gi^uU`rmX!yR?H%>(TCI1XX6W~_5(4?&f zNu!HUO&7v9hlOUW$u#*9D8S;aMnw?1Q;6+#7@uM>nrE>!1MMbks>lsa1+++zW{e?* z(FnG-p&U`;@kTdG;s|(xYYbk5rb#0f0k2#WZl(pTqbDGM(g}XN1?_2Cja%i;MK%8v zcqVuvDTsq2RTZH$gnEJto=CO!co&e(l>yBhzZao-q1uov&mfPVX562!eDPr} zI&he3W|^g>WwJYNLB`;WLl*`gXLu$k8Iy&Iqi45x@{c`>7hL^J_KP;Re*A9!>GeGy|NTj0GU%VI(ZO!eAqZfrKrR%Jx_k zX@{UDwwl^G?4+WU0`DzO#2BS$b*8aCkXLr+S_SQ?9&)hG_UTg?p;-HDjt`pO{Gyk%Mgz|LVVF7#NjI; zIAoGip4vbNL2_z^==DDioeWgF(e3CaM+4lB=7MGfPXr<_Ho5u&7y zyVPM3b9x=h0<>;Ml}w7qA{Zku&HW$*s6*q%BzGJcYTXba1f&rRbL94bI0R%G?>_r? zv5Q^ol8C=EEPf|UKLw8b_Sen1>F)*eFKAqtz70gwj~6d#Hy?KtaC-^&S8&Qge@8pm zlTFv+NfF!-e`9hWz8ZqJ2){!hY~BzA=Rk(0+YrRg0f%OkDKB@Nn=}HCEyn0Qd$CCZ zYiE$<2)VrqQiF*}1dYhk*3EiS;+&_JH9>(82I&>bTci-U5I}0A4><2ovPrZKMUBc5 z=w_66-i7$!`zZg(_aeJp%pG?yoUG%fXGm&GJ|5uGHra)jK-Qs>f{pk85%S&dNAH^l zsZf&8Qg466f~oH!i6_Jn*-@I2hX1- z{m6hM?NZAK5!b}Ugvw}Kq(Ef|T9k>;>nAeD2~a;B_~fkLRlK(IAT&Z-pEzuNK^3M+gm((^aOkM>>){F zjEO02V6eHu%KDJW_9|j+g~@0{ZUZYvP9OqEYmrMclqa@{2LqCA z(x-%^!=YzBoh~I^?HNZgQ&ZEpx~7w+WUUs%&28!cf&?J~F_I7*MPZSu;nX%bv{GoV ziP8kA4THe|BP2o!HrLkJdtez{$!I*mw_Eg*F2i6+Q$y#nD+#Jbm{zlwL;&N#SIr)) z+ztVbn{lDV9vnYO`p&nZpZh(ikGu=QgmB@tD3=qpGh~>dE(RD1m_G!gK1@as$B@KO z7f|_T?N~R5elMD@8H18BD)Tt!2qq&?5J*wm8+hT6tpulCV^3QLBs&B_iss(ncXU%i zKxCS=%bo6u4h@N!?-4?v@{Zk9+Fk5o7rP|l?;7zuT>0yepN3QK`qmn8TK?W9NG{#? z5BBZ5KKbS(2#*JLFvK{A$0BV3(l-Rc+olyD9%CEfvDO6yM-UpJEt(Aa>!>OqWCA8& zO$TK?zP5O2AB&p+1i>{2RP9ob3Lk2mt59mk{MC6t;;E6rHvwD#TH;HKj16sL8NB8u z^xP7i>HWyxcpV!L-Ad7$Vpt7`ZH8@S3Sd2>fs`bvjGT%P+@41=7NPw zFQQH|j-5UY`Iw9LPO-4CjQ33kBqm_JLr8&?5tVfe&z&RyuCAG$+k=kMMx3rB^=O21 z73tI>LZ?k=pSMl;T~$Ev2x+j^bMHrQ#k36b3wxO4hH9VW=;t0_@&3;;pLVF~2{KI} zL=@U$@)E)pKFWxDi+twf3a#}G2K@n#ocuIdD`8JB;_f>?#p3)P_U_-u_Nb4`CwL!7 z+bJqCD5db;6GFft8s{lxFepmZ=sHHj0ehF{_&5LNmsp%%pw(*fW&+@GNYv;5M0S`a zcinXtKYsI1a^S!|g0-Y+LRs3TiG@c?C~QqPjTnv#f`}O9mT_UxCPzs_=@i;TM3KQ5 zjX^OtKf|e$XBm_^wN=P->tre-NJ%x^ge1jFjZPx;Sm5@~VeN#O*?BI#=2AFw5|Jj< z?UX8b>bgR;Vze;`p>VlHMiEjq8V{iYRy1UymY|)$29L9XxNQi*<6KQFJkvAtOtyy% z1_Ro)M@K1fRT0VwW_FIx-F_RFu8rulcQgT|Y7W^_Hd>?FHwS;6H3Z|aU-HEVVQmBR znGe9yLL;g^@mVkd*#{0@gqcp^fqP)?iiVI#2Uw^kVC{|(fN$3IqUnMM3)K)}3DTod zPvHVeD}pPD#}XnwSc`xJiML zYWI1+i(Twumqh%%Al=uDI9>FrCX{ab9@xGch7Un`ekZ`^8;E2XI+w!Kbue`;WQUrH z*)G0iQH+K}-8ObyQx0Bj7;H7%B8d@JpljKL zT`Pf*DIqw#7a%O&JCtscu)T@0&wL*f%M;>c3R6Zf77GBrX-a;@GK+?{rijrgZ z+{1&%R`|(Ry^85}j;lOU8=QAY0a`=^0YzDm5Bn@Ewis?raMh5=#2^*HRuBTZwS?3$ z!IljNQwk+w?6?_$5|YNb$p!Ryz$3Tc$NsCI&i5Jg{&osg~R~swjx@Z#ny_tcC2r0 z;7y7!DRqAv9i`MdgD^$~j|u{>Vk(`IoL^^Q(x;f3r`%X&HlL8^Iey;Yogm2!X{LDe zH29Y!x zrT!WW9L!z_ldYzsq0{CNU%D?4e`CJTF>nF8-G*2Ua)<*si$USBM7C~-2MVELtOu<% zp|A*@Kor1LO_4$J1)}eEoZTV~W!|_?Xa&~dV?~H0CjQ%1TdJzs6;|(J7rP{47he(5 zK>L#BW8ceme;>Q}d&5+_!(cQdNxSIzgAkgKFSLT%60Aq;B+Q23Q9?8a2Lhn*c8n4c zps=Mws|a+C2pXkSb3j5NTulf9r4p>2Ys`G#k5^8SxDBRvX)jF2M6`wFQIMjITO?NL*iRZ&7fBAne3SO-+F zAOu0G&v$ZU2m~C8fVU1QQ&f`Bi4Do#{j98}B{H7r={bURoLM=CF-;M`RW<3( zAs-;p9i(yu>9A!5cs}ys5AjnszncB~4-mB?Tvan3j{yZiA*5$C%$Z+YVtIKP?`uGz zR6wZ+X9GHpkhLb(4XKEth)G$nAQfI|v=Bs6;bow%Jk`d4c9K%31>@~?#BhWZ0Udx| zOgSo%d5ualf-4B+kWe|2$g!st5tV^5N=V}lj8~b-T8OeBgg}HwL^E7}KV;%H)7dmtG2*&s z+(>-t6y)1r7JwWIfT|e}QZbYk%2BhmObSOIq#hTTgBL^BG{m7Eg52p=Sl5KSQ8rx# z)7T8-b+hlnW1U03@VS=Fp0Q&PQKM_fC)hg23XM*(Ch)EpLsbC^8O0Dlc-Ih+I%)`r zQLtlM+Yl7fv>fwMlX@>@(_sk~H7QBkttWh+`gXE-J$CFE$BrH2eee6i#KEq`>n?Ul z#4dL6O^n?N)|W=`9%*aL?0(#3Ple=NJ3?v&76by4w9#5mnv~^6FQGtql$1@C(_1tZ zA$Y9O=o(bmNk&u=H5Jx*A{CHU5o|z<2p2p-(X=|OCkThvF;W^VC90?qNJONY1B(SO zC3WOUYYpqCVP%_bCvee_xYpQqN*qVXkfI}xj|4Ke_%Oz*77~wg7J)&En0&oYe`AZz z@)9%sLxl4+%li&dpMMx@3({5#Efvm|l*KkmX|nbV^ZPHLDlMiBK`82KjEM~hgAajf zyxNS#XhX0y1ez+pw@9Utp&?^Y6qC%hNN1)9lN^y{Tyy!wWZF{w**j5tBo>bv3xtaC z#RymCm@Fd6_A~S~^~x&KbxxY~uuh<}n5(b5o;2&A0{Fb5n|4_nHzXk-adp5+hwyrqDFy+e9Ml{aox7)2B%j9egSN2WD{v)c@}wvpZwB^u>wj8Vix z#~=i}s+%!5onWg9qe>Q1O{5)RY!S1IFt@<^sT0gd#U7nueMz2|4A%$jU0!5svyU+` zt}F?{p@T;XgU|uznsK1o<`|Qr2^3Y)#DoB8yMsv*9(v>$2M!)YjE5Zg#974jJfSng z$+cD1Z}}6hd+2j?rJ=MV;xYxN!E~AtAxGnaHW)Mq{qc~|kG>jz)eVFcg1QYV0g*$9fPOlPyxZA^D#Qgz2AvuB0e8GjUC5Na$zH`trz~N5>IKtH)-0hISk`)lfAHMl^}KMbV5d z34zcCDoY3jXoU}rm7|gZLQ2pz%BiLzPYogLjF~8$b4ago5*!|<0$zBe7tNta3Ic*q zml&aOLgJkVC6G4YRUkwO(t5J3Eru6gg8TX3#I>fV2j_9;PhnSvgw<2njg$C|^TZDy zr!&_Ecy*1z*)l%RX`3CT&FoZz(6+4Z#W;yd_S%;A(6+gwhebLwJdk5+!A$K@oyT8Wy2 z8{;iDj3|pfv(vM9Dd^5jv#@XwDLkX`CN_AAvL?w|IDeK-w@Yx2@p#ze4g}9+JVa~V zh}o&BZ2(arRgDi7PiSWs7vB#Eeei7yLmfY>$eRJAMd-V;R$T5GIx zR8@ud9zB$#S&KA_D9Z`bI=bCCgjS@THdFI^NKDQ0-f8N(W^-kokrTK$!Fz#gxACKz zSdR!YAWRRPC}vbadqGIb{g)$t>X+%_*rW`R)UJ7rP{47rXdIV7G$xI5)4aapjn*7!xNF zT0IzV!H&&4&VrR-JRjuf~XNb!V67^J!>b|@vr&M?EB6a1D@HP z>bh?x>>1aNP+P{Q9%1lvKZSYl4mt-H@LnRV$Jc@|*+yP{J>BbXq(2@K>x%Tyh0H{X z(+?hFv~dQo_)rlAg-lYy=lx|Q&XzbTg7@gyAXJ73>|{jb4 zwWo9iUP(H>ptW}|>suAKe(+Cu>+kQJog&_|pG?P8swA=jwWDWs!wKbZ z%%YO$B<0$x4luiL5hCd!jHk{kv})n0Fw!F82=_uq1RK^!7>SG|3s9C?-K~x{oO@D*oxVTn_O%)b(O`sa)_vCM z)hE=gs=ceuuKm9IeV(Vq%5a4=ibwO+?|5_8^6@s33`rqKrV&2Nx&~?qaxa58czxVc5TmMjD}- z6CB!mCuqTr$NUQW_wS|Mo?t$m;G`X=F(Lbq-vvVB9Z0+Czaqt|h=HvG_QnP{>rCR+ z`z#!H93~`0y*r^h1xtO%2iW!|oHWGCdl3_@+8z3&(`x7I!@X4=(-^`Olzk{IMKGkn zqh@9xNw{rsg+oM`Ejy{&U1Ya~Zf8t(y6hWTcHMO=;jU|#@iE8GpFn0x*s}n`6+~ki zqN4VND3et}_XylXeH~DBVC@A?NK81kAi{gkWtUy{OY2U3EO_4Yp2yd}{&gYydCIJTwFWgR5sN+aQjZNPW^Qwbme_zgu$w41Qo8R>Nto)bX$*)2*u~H(nCJrS#H%!rL%`iE$ zm1@*ubk`Ee#yPZ(NaGBLqY|D>M>Nuesw&B{3@rpYskQr+k~n8cB8AN(thOj&nVOhF zp;$V!z+hakb8Z{X8;U|Asc=}5cmm@BfeNKSDTUM#21lwByqAoMk|b7m=j)XSt!tAv zAyJVcNfNvZXbB6u@1TFj9rO?E<=~+iY>4U1C^om++)`AvWl4URGAO+65bO|bJ(bV| zU*N2vk};(V*x*P);N*v&#c|D;UEjWzM!UfSPCE_j96L{MP?jY(UvmpvPdJ$kGc!1w zQ{m~Ff-)Gq40PizmIUX9?3~#^Fntmg*l@}N(1|3N7&BgA*EQc_Y%C9b#>Gsvr?};s z@37QAK$uP-#Hh#-nkj@4#G<}ek}fPRLGLi(=9{q>K9v}-wxW?VSa``xY5nc{3A0;q z&pr>`oxr6X^w!Okciu)QB# zKR=VH2Rw+K8@ADyXyJfnk}(?ekx~*RE%xu(#qtf`;k)1YD%tHnfFUe!#b{`Vv!nZs*|}=V^OQURWAZqOvB@#4L6=psGg5X1gv~G6h1`&fQ7?LLrpKs}vhNUbQfT0p;F1N!o4x z?vtP9j5Bs}$KrmLdzSHhRoAo2gaSvBrbwj`#R%;*wx|f%1U?GPZ=YvFbB1fa@Kp}n z{(Z#s24>HE5GS5|8X|^fqk%9b)|CVtK`N}Z7*i6*5oKASwIb0PYaDS3!g!)Mrd;)U z$eJ;GZ~Xy@PN{64GPhV?fe=h}H!(FmMOBqZB2)%SX|#wic}W~6OiZ*f#*nC}mf4j8 zt!vVLnl>=rkwgiDr6u-#=UW6fV(Fi6p?`Ce9S?sbcDZ0-*Fh2_q#B<$DTPFvKGIr* zhzYG0vUI4bf~H`YNnF`s*RH)hp&{6E;%08T?w^s12Z@3qZFOtTP1$EW>=9JVvNeP< zrIVI~N|9s}#7RJp4bFQ=8?1B^f)6yLqtlt9Ecz%>P!3k;-@KoVXP=9fp4=~U_4mKW zk~Jui0v1;(f^~JdQDtkcLN%;S=i&$vjd8Z31R|FcRLazIo`-qLZ$OgJNhONANu{3h z00OXl!IQE7&r4~3@pCYL0*C_en0$%Id$O6W3{1-B@;=?)zKpXT`B*m3ZCx{>Grq(U zAa^Kh@Va(apWk{M+mGMD@*^M1u4}I5pT6`NP9t?a+#K(D&wJK8V;$>3#5&e-e+Cfi8LXcngB4WmT0L6C zj_yM1bXCPAs?}Nis=!hR;3YmvajGI(so;d|3_2~Y3q$nzujIIgJesW==8z&@otRjR zcYq{IW3*JTc?YMRbuP?j5HPfl;FOQV)r zk3YpB6_AwOPwsWgdLw%u>#NUD_C!%i51o%)F?_F{HQO6zL?q1A>6<(Q##_(otPPmM zX(>g*#~1_V-~HJ?k7_@#^70}j@Uq%0UeRxt6cD@zwF-pb31|&mOC&b5(ZY;Fh)@FN<5{om<(Jn7i-W_Wt$eHvpI!N z9K|qa2oBm~%6~3dldEmC2JCgU!IA|?V6f@M9>@jjSaE$NXtG%t4z-p%UTc0CwPy`c zfFfA<#Z3$zk^(>{@yR)kaPHMKaPP*onF5~v$&(#oLHHm(!-^6kgb1Ow$%R(3tAD$35tg#?0JEa z6*1#z@8&hC|d1l00B znGn2t`;W#wpQo5k_0NGcPz_J4@rxFegBO$JCu$Hf77>s)>s$s;btHsB@h0K%znH`O zdytl$Z$P$g2Eij#Qc<=j%5GpbsO317K8P?OYG=OUNAbPP#(ylp`ei%vsfdYj@aIn7p@gwhLp{(usFe`rT zqw{uZKQZ3tV478o`^e+cdwarwk)!nb4In4$9!XRg^G0Zla9uD|nb-NXz^9?YlxPd4 z<6r)ZVNt57tZrMYWcRSbnHEqWS3D_5b}YlLznqmfo2cc<*gtA9PDn9}sFe~b$AR7Q z)j3D;gW{ySL2txG-+tGrl~k<$Gnx6(3M3O)f3eO}3o^b>9qq z{v+_rYRrC&e5t~Qy`A#nMa#q{=BkPWB@)Uq>R$w71|rTsir6?OKQ6apy7$$RrpPR_ zlUkIus8W>fMRXVD-K@_uIdv@Qr6il=tn%QEdpR4#g0C$?B-x~@D`{18<-9Y0cAjB0 z8~qGe6Da;+j2DCH(O1GyOlM$bh1RZ3783B7?;7-&>u4FN5|flkHg(m4NKr_3DAC^8 zjA_qAw&FNpS7+?fIsq~5gL-1ECwc3=oUHfA+v2kBF)M=3Sy)E|I-aId zFBD&na0Us-WA27lwp}k#&m+`g44c(>Rc(zzVCEWz7B)W@5|r*|dGZva0BOQq!lEH? zfD&vMJ#?LLXfQ}xY+l9^)5CA_RILpi4N=`VEhHE|VCQULx#1o1I=l zb|kca^A>3pMbHd7q4p3;^d!5 zNWw26_&~Ajw-rZ=?QUOwSD1gLvRO|D0BaMiwc~zC`+0!>P52A5`L<$9@VYW`Q-I_f zQLWv&wclaRvyapHer|t+miGic?K$Oq^~)@v)_e2RV-NTZOZ@DzuKPFrr+%zB%XL6{ z>dEs^AFr!!tM$Lt+*{}Myjh(b@4ZUyO-h-=%SjmvJG*#hDL#)!0$O;VmXB(0_U=uhwTxfusV*(8^m??sWQj4ip)A_24Ij)>KWty3a&I(I%( zT%WC@A^F&~23>-M3S7hnj(S8QA$4IIG{sT%1XZ=r(h#W*GBQ)wO;|limpLA&m%c~q z?Ir_qEp6OPwBg8>GB#F-0fmwd1c_$Q)F=``&`r%|4(qY_9^2v)t;MX&vU5^xrjaFew~ZUxMj~f&+wlgV+j60y?E8e~pZ+I&O3H&OiBBzbbu3ZXT;++TL=rLx zLlvFPDl0LUVpSOU2Tn^b$!-IF(ozawr!$GZrp#yjA$}emk!YC~R1KIU&g!RN`m03P zY6GYpmaQ1?(#F>9530g?si}gDm@x5ME#bOni|@iDV4|)A{Ax$cjMPX32@Fb^WyDeO zBwv&o7cLrVtI}uF_Dw@ASR+c6-)VEj!wya?JDzwV+J0 z8HE5f^siDorNtgj26bK%veJLTSF9n0j3Cjai(|(KP$Hzk$1MtA<%1+AgZLjcy2oy4 zviUx5zkagaBzsNlmA7`EygX(amC#2uu6Hk zK&uqGk*mw?7gGw&Xls&5a%I20eU3LH)=-P_Sop!#JYhly+fgz8vTa%@zNX@{3jHU3 z4S1E_$_O6uVu#mGd8Ro%u6EY`EdvHjvTg$N+%jIdnB9sH`I{WF#j=*$*<|sVq+s;E2E9K?}X* zWu~2l4pJK>BiULoz3L(~(7#tYr$P83%Lo@v)%YVi{DI}Oe8lM0S1g#% zZ{3X|34IrANlSrEQXMulg6z3YKFLJG+8V8|If*p98If34w$3e(?jJI!j_cyG=Sj3* zI6Y-d=+J2~6icp&4q!2ZuOKlVi9DD(H(poKfJ+#PAlz5;UAJw0|D~Q-+j%3Edsj^P z?S2(V5F7lW^W}cN9f4g{0y+x@zw2n9zqI{_LNE$*2zc;kE#wmDzV z8slHG+&X;Grv<2o@;;yQoX4rl@NZ%Jg5(L@X*`L(ke46XY_E<9zB(@p22Cy-KZFxHm)FL=mRmOtQCDrKn%Wx zS6l@%(;vS0s<|I30`U(66MkxW*h*B-abt`-185w~ksmJ@$%Hn><%25Wgh*TqAd}Z8 zq%5J7%Ay_?6V#{i~HZ+4o zr5}m$hO5G-QfLt%s-O|4m9k>7&<|=k_#JoyT1zhno%uICc8xTILXk*V5?%T?Y?RTT zkfmc-BNmdZQ2|+0+F+OFd6x*-5R_)l?B)d4e~ZxSpO})Uqj0!*^7)|I%cBw~?*nDK zX#ODU?nFb0PR!xy{1|pm6d!|7B+2l0FW==_BZ>pZVs)s=ke(PA%0!6>?@_u*;+2Zw z;C=fJ2H~ZsEBlyR#&OV)zcbF{s(Gf{xTQ(S^;v|##*O2|1gZTB)Yl|-DNXlUAqAkH z>a(j&v9fUN3xdHZuK(?lp<^hPNiJD#pCaE~xc9vJdH(of;puptl#ogGJLlfw|EKr1 zhee1Xf)CJUc%J%@Aa}knTCPA@%c~}Xh|kfBw{-;xOm|z~va*u9UpFuHC^c*Me*!&x|{e% z_~yBuhrSn&qX)jP59c~=tET*|Zn^+>-e&W6Do|)M^YhC$t`=|FIrl+e;V*6hJnRVC znl>Z)=!axxjmNNu12PgTVwLjLwBiD{0o8n#6ekYVMYNpKgEaB%$vAy~koo{cf0-E+ zDM_**y7Bb%bh4~;id0Y*t-d&~V;>0?)F!TPb82Nv_m71SWD*#TYx%fzhEXW-zW;7l z?~X^V+WQ9v(Yc^Q&UTFB7eOOO;zlgU#H3YbG_0w`Fg!U2wW5d7#6fK021vSupD8Rt z>%!)+h#>ZNNm|B1Bw-Fr1KGo5enjl0do&5DVo-gXuTl!BUab1p#I8YjMJ1%l+&?GG z_#GoTi@VC_R!r@JBfy%~;x~T#E8<`Q*x-+uQ7%^j2)UmyY!2aM+- z&hap~SyO+3&Mp7e+fmHNvzN_MNiD*=BOyN>c8qt7!vUQ1F&I=rGX3yxB8hM%9LXf)3QVCNFp6PVL59WkmQvItDOlh{9-&F7cu>e;9MDQM4MsA;RCFk) zP#!*oSC&vT@h!eVctSWtZJDi1bcXw49Op9Fmo>4w8xCva-@Ho->f@j$A;w0^Hkq|Dv(;m8Wnt6BUw8SEMGl-o_Q9Z1gG8$4 z?pg#QWXbQhjqt~U)dYw^2B)rV)Fl1tjOyzU`#&uJbo@A6@wC6Jr|&$;_NeJ}Z~sj|K)3Maa+e1fhkb2zpSzB9I91!9@7qT> z(;krjb?L>A@Lo7}?qSsKOmSa!jo@YGE%rbdd&Yh51E8f0L1ft+bIwUfOm+hoM{=rMcR1X0r=f z0~`4BwKR*9ON(P62?Euc7s^pHjd+HkC!eQ3=~ zgoT)}No7Qr{zxQaYK^EY5oe1=#gJtXDdA8khwT1G%8DC_3=#^7K^!Bfo-5WE8*4N! zsM|o4oC07gW%1BUNjT&W=pxav;X&ldK||xPkH~3@FvR9&8F;-)Wh2LFG{P>R7$9rq+CmUnJoiH)l&h;FQtGNxi8jf1DTHtOvEu-kup z$CJ+)7)wvxA_0ZqGmwph&o>$pX^ln*++`HEj!g&z!g++C$s~ixBqfr-6|8BkotjxI z=%inYh;MIiO)S+W`YBMjkQ8a$COT`al+UY8XFZhG*TL+t&=9=xR^-((7A1ZD>A z%u;Ue6M2I42617}FL6EmIo>P6*jTN`!{vcBbl!o(cR~_X_JJ81v(sCR%q|$)2QFdW zZh33g!oN35gkF6Ct|yRLoKNmZ#{^|>beZ#NVZ#@j@w{)*!gbF}3@%08V3sv?hH2uQ zmil*qtVTSWO`$;TUP&*%Y5;cn34a1B6_#VwNy_aQnmjRcOKFw)7pE@XZaD^evYem_lIKXwW-Pbos|6i z7*tIr{Mo0)3zc>}tTSX6dEwAMcy@4*pv6i`9W-PBQksifvdI(8=r}}wez6g}q#RTOqy!y4XKXFa*Z^@UE}#a* zfrk`fq9VtRqmAk;oIgn-gV9Xe$rc=s=rb5};1GjG5-c%7Ii&Ia@~<33JFjGHI^z4p|d6q)kEm!Eg3ug4=NPymz7>>f&UewxBGTK zeaA%rNg0adq1)Nc)tupYA9Kb+n^lai&TtI8AoZNs9~Tx~bU zG2%i>so~*;4J2YJM=D}uu~`OsV+gk)#a=yokB`J?#WRjMXXF#u0IGmVR%HbDz4l(qZgM_ge-eyjj zQ{8Hfy5>0QK~IEuifCla1*hs$ng2`Kt8eE z&Z53ZUiJSD-ux;Y=~mO#yZ)(Km+%pOT!lY>^cTOvONgOmaTecFW~JgSDn*%R z1-Rp5z{R{-K{5WrffiLX*H4Zh;UFR0)e!(h#uhhDF~~vau|h+S;8 z&mju3BE?p>tOeKLH25Urb*3=jF2ADX*H=gwxp{|bb3Qfv&ed~+Zczn8AJeYe!rd_( z@sp2?hX?rTQCZhu_OH|XRjA0zD^aVB?kcl?!Gqd=(~`=j=LC9i%@lF0fYZtTU+)06 zw5HmxK9Sz`%#k8e*`n0|B5LVirZ{Bqi&1;Z*_az9sm0Zu;8&#jwmO+weuFk115?&P ztTehf#nR$M3r3daM7g3!1XSf92Vo%x4p4f_jM=ETWGa%q49lnw)ax7KmdflCu`B_p z6pEC}p~-A{9ohj z4N1)(l+u@<;XVmeNtwryp&GONyJUN^cw-ZlZai*?L1IHeKA*AWOKK^6KVl)O*^;y5 zcCG?_Eg+O&bxet8H4F+E`g! zM2%$%yRVeNM@3zuniU$R7eOY|+fi14?p!D*6MGyP?Mo2DFSs5RDJbI> zkwW9_TWIlA>4-#3qLNKW92o}}4T+#pV(HfoyhVw^$NC_T#tRaalvK=IgP(y60?Qyf zt{UTD;CMAe+EI-6!$8e9moW?OGjc z`qPYk>cI8)eDiaftt*x#l8R9*8v~OA4QN9Yj# zS2fMd%{iYBlG{&8vo0E^^&T32e!JIPt(EK~z8P&OFTqI-Av*o9KQ$k8hIWxMqxvq>dm_VZ4LlbSyb(qFnvGukx_rLW>lu zB&3+HI{0*TUM~IJ)W`_Znnnh-XgDpA21N)N0z@%nimacrY8vKuUzn^m4*!!(<>i~c ziZORcL_Vl!9XR|NwacE|4)SKZy$t8grGFd zxR!bROlzMEHUq}(2{}CKuYBqJngW7Y_laXsXhZ9BKD+{=jxajX_bMXstg0$ z$Y#W&;o=ISNh6tE?D!Gr0%Q_Kws}(kX|vI8j>W#=L0TP&III>jj$%#?aPvwnC#@BM zW>5BjS{lcqiDZ;BhA5MOb>tG0g(yThRRJAsi(OVf#I%Ta5D~Fs&pZWRnQ*{6H75MP;DhQ?~xI{EB@8y*Z(N<+-Q(Cm_{nN4>LG;N~y(T zVhuL%jG%JChEay1OnyuE=qr@qjK%G9dJNd2^BLrS$4PF+R%)6lDiYw72rwgwqz7k3 zAYWmGA5@kd+=KPxEMAm2{xgNz%5`rgnz;jCF0t5+DI~xJN(tR9G#ItHBR@9DbLUk2n#4(scE-fuBe*Svl6Y7ufb-Hf$m83p#>kv=1^gU$B z+ieHV&s}LQabl!XypKA3K+@D#tUahJ^;yT({dc|3m*rb=|2y$7<_W(d#3fcJ>G|2c z*V$GV5Z(5oX}t>MS<4?BeQVDZTBx}ezX&93-AugnzkA#q!6NH}|x8t5-9h2qk2CHy)^4Vq$&Ag&ywObg! zzoa_~W)6#>sHn=J4-Gm3V4{QP1i4?4s%-JQ5ofj?^SgQeSH3`BCORV{!)!ln68$eW zeP0^Hgr^+3Ww!ILHz;{@(GZ129T?gOlb95vdktaKR8-T+H6ojB-E5D!$mU9QbkdN1 zWy5f$?($Ki&OiVv@?^FV^cz`Zm@>;-13fdKjfEbsZ0ry z7Hwu4I9}>;HO@C_f0OZ#Y~v1mKwX!K(3U-zOE;M}`>mPvc17@~ntkqdJ)Xtgf`7IY z#^!9+6ZG$YbC^w~hJPWE@sJbCX>*d`g^+kXc}!7ByNIl089!bbkUt;!g*!imIY3#n zjyGQ&_%~!dW>z(JXM|?C{<=i9bLuz;A;WYsSV?Xdhf0w2_YJ^9W-fnhO;{7A5o!{{ z6YpdTSN#6NIKdplWZexjX_n01brZ^piz8^2jZ+|z5GgEzTdgES8%hOg-p9ol*0ecz z8nOMHvt6)i!;BlN@T(A(AF0@K{O#?H7YGKMu(89SZo;eIoALL2HD#CDP)r8GX4h|?)(>< zm-VE!5=kKqbjxv%Mdxka-kFnT^iaO+ByWlDKxvd>uUyS?@C zPu2--KR4t3A8kug4m|x-{0aLK{rKnXT|tkxE=xML#lR#9;Z@DnB`W_m^jv8=U`e$lLebyv$dN~`kadu4-!P@1WXoE%W+ zEqxzN%<7_wYL0e)9NPxOD!?r&DY zCmbA{3s+9Ft=rj3p96;obl=?_E5Mnen05|9wmw1=GGN86Z)+PJj>Y@*f7oK3YN+J< ze6KN#KgzCDHU_XiGLthxAC?%bJLwjvZ`OBG5uj5B2T~41R^T!sMIjuCA_&*081RT5 zg3!+Ftg_Rpy7M@XZA-ryv?OOvhyM- zqEF`O+xM&7vTtv_G+Z6hM-__eAA6#U)@u{qw$D7&;B~T}bUZuOE}!0tc8KFUf}gwL z9pV2{tM1pD2t&X-d}Ui++HlqK7?_M5xVmCgMCTow(|hU&Mbb|qlaZ0BGZ{mDd3`U6(vTy$><9|N^`<(}< z9%`LFo{t*MCUNDsPRQiA&zn9`TxU;CPM)WMOm6x1OW-4Gf7*-A$jvpgv4Nky<#?sH zr#Nr9-sgH31~a(HJ;msXmZd0wFR1+yhU~WdzPAq(>y+lk{r8{$2kxYq^9O-U68QEb z4go=_UTvfC2;%R}i?@k|$MQZgAzKg?zkGg@X8kF~t;cz0sK~lBTjz*+9bK zbQdh=WN>0H(WTqjYPz9$CWHEZMT43Cb+*7EUWA6Z0+T+JaKe7#aDq5tlDa=AHcLSf zO`dc}+waDm7-1FPw6CQiFYpFeK}m(0W;Dp5Z;)w{5aN0IdG~eWYAwS;iuYiC{4v>R zb13m>ua&CyEjv`ns%e2-5M$EE_I&qwI8jeT40X(vd zM{0Yg<3FCrGIS{#qw{3yXcfNPsFQtmg*W@sk9hX_+p2k-H6Q+$ayBA!@37x)U91#r zE7317Fw6lPf^Zvqel7~cSb!?2bROFGBabIv0 zQtd_2*6ffoc*5YZ+ilo$vu`+neZ9(Zy=Z_ZnmFh6AR359mls>>wjXy{wiB%Tw(n!@ zVnlkD^rH?k!<+wZvrgO9hI7>s<}Wx>R%f^uyVefvb+}6i<3Gu9J!Nupxo}&&uWYTK zLSRO_o^&?;`j4X4?hm!TItV5gh$Yv{ zXurXT19D`n~@C`S1qBu(Z@#KV;*f@PAy#A7NQL@0PUpz+p+i^=P;C zu4k!x=-ZyJUgWNqmX_u=#CE;=>5ptKgW3a`N8Y>-U-$9Q?!0~LlP9PD;7%aVb^(W# z>)iJKu>QEd^nv;N_22E*T6#{-=B4Wf7G~Jz!~Ina5Q6lx>&*1k#u$h`gt8IQux{T8 zf_nlAKBV3dG}=TfycRPVuo$@DL$!>m#1=s2T(D~u}0 zX%J2hLaAs3y3jHQIi=sIF+~7~aY*VbN$Ep>d_exX^Wr%NIcVGeFSSJSe&{=TP4VC! z6iU>8=hjL2vCGZS)iqT@&%@k|-lS#LpC>DBA`$tFa#gFSi zEd^K44XjZl1j);H4M(HCZ`wgg3aa23t3U({aSA75baA0tUNyy!Wl6{*qYA7UoYarh zpH$kjyiT!`623sp7KjJi8oX4dltz7bD=ZFYgcZS(iE^=x5FVEc7iE+E9Hr8Bk7HqN z2>GWFa|O|FR%{u@;u#+)rP)y2_p|`+car>h`cu6xB3AIV)^4r0q)#iM$np#Vz^_FaJzw%Lfe z1*<#iGD$<{w19|+;pohs=^veE1h?+z zW;(r3T8#&u<6i>Szsq10QvorB8c{~5@iJ%{b7fIV_;;rUX7ZP!*8FC91v3q@aX1UN zb?}~7sPcMIDr?8Ne%qcwS{9#*0W?LWdkKKy7> zVb%3K|0Xw4e3UW${JrP7)fxU9I7%)ri{~B{TmGJw7!Ikn`U8g*?d??(OtfMf zh%Y*8CpMD($UVVKlRExgHuFX@F{0f<99^^nhs>Km-nvWr@75Hz;1PbT_jfC-tvqMn z6_#;kEMjD#KjN5}TaT|%B7ZouAMtBLoqr#BN>Bsdz3E#8sq-Z}eSN|lIrCO?%kP;e z;C()?uTe>KF>_~}a?T@Nq)~;Q;%EKmqKbd?qroCYLJT>!TbRsR zyC)Te36F2@fsX{rsjka2A}`hr$z=D{Wqoa%lg{R}Vr_Gsy@J-K~8A}e>)i($}$%P3#9VQz{Ors$)zJ*OXBf*WcT1_ z)iJ^2; z&Z-fI^jii#@MhCoxrCBnK{E)J#xb8e9TyJqTsPBZJSX#uZ8=l+5lBBakf$+}L)|I-45+k6a>?WJs&)c<9=aSN_WfR;~i zFU`odWctC}YwiE|Y%)AY|LWl}5PTOIgaUVRQ&dqshu(B-mbPI+1+Hm##Ve^1d16NH zX%;CODJfl*$_wH2mw1K_7cYMwzY^RX6i4&rhT5US{NY-X}G7sruY0iV5J zFf@Fc86;A%%D5#6V}t0T87SdkWYuB}dt~??nG#&x4$prV9+X)-TYdf&&r__oqnuE? zs42a`{=~In%UgAee)vNcExle8`Vh1=FmILMj>?$!C0V@n+*-6s1zc(|U&6uZv5spn z!l(Zz0pm7<&n}#1ha0_lwj(4U&|jRl+OPaoWAy%V|8`f#FG@XhJwiAQLz&&n`?zsy zo%NIdt^kR*qUBs5TgUrwWmgqG=YWunKvh8%sgBoo;<-?zC z{si2}vPy*XS398T!*K+pLqFTO;yF9-fBb_*bm@F>Bk;~W-RfR%q_;j#{s#v<Y<6*QfCAHxBS$X0prGK{rHBz8=!$}a3=9kavaHFn zxif|wNovtw0NPbKEIj<$_fzsj2992x7~Bz`g_U(M?i=@EwK6fdXD)DZ6IMiziHZ5s z+Fa{W8tThF47iPect+qlD55A*)C3+oAph>Ua*vo;Sb{HKRemjc!cA#$`(J>8ffZY> z6)A0`8n-c;TKb>JIAeMvgWskd^z%)fH!|joX-Ol4!y_OtadL9nSM%MBk}jOOjyISb zP37D!mugiTRp&fPgcv@NS$o;}l$Dmc!Np!=OtHHAIlss6r*p&s5^uVR!+}Ice6%oP z;Es5JE66{SG=4iBPRq3BROib4)uQfXDNy&0tk@fXVxUrD)^YbR>KZa8!YNJflrKI$Pirq`t zJi#Gv?BHO~TZq&MERZT#{f@62l>MSd*lkzob1c6%*8-ac5I3KtKK|$%M3k>bc%0Z~ zL8x8op=6X@>;eHT-N*z{(JM8tZGt0+ta@ydSMs{X&UEuL528$R4xF+Vjdx8gDrwjk zX*Z4G@anXdLbEk7(%vsN^Gt|GfEs_wD`LZFoPq`#g~ZHj6SAMbD*<@4feTJeok+U0 zO5+J1<12&qD=DRn)f_bxyX=GrNd=#$VE05_S{Bb7OeMjEVxUf2>MTk3IEqFsbTPr_ z48sclVj3FnGqw3VrA_}RT4rgm1#9R=KflrS1Qaq(;|;Nhkh4O{zmqmx#(qQWbF*L1 zH8U8GtrW=EuMR7IS|gO6l|Y+WN@cKBh_TUucru3)s;1krK0PyB9{vXId^a}Bk-OFL zj*@T6{-dvgOc~7uHkisOiUbPWbgsl!ii%uGGlb0pH>orF#_J?saU)(SQ-DK?5_wz+ zM{jU{*)RU}^MkfZ-{=Ka*A*2tc89dD4{{Q zumfVAW>B5ju_Su6Gqyf|%9PL(DS43`Jl1i+b-CdL!an~d5)MX3a7)U8PeYr0i9lDC z^zuLh)+wimWYIXK0rZHjy9{MGDLqMpmI}XQ!6Ox0|5;*sU?rE4xLb^9#t*zSnrJ8u zXYvp+Onk)R^L^1}niK4^CJQ=F3+$xkh4jQr%v&=!hg$%%T>B&A&a_rc?H5(Dan$z~ zbOU(FHHv?D1q~i3Qs60)(X3U(tZg$Rw7rCR`SZ3U2Tsh?FeSq@p-UK@3iG+yE43)I z%gc|&q3Uzl{cw8(5O#^kBEBY`VtN`j&afG7kzAS#s3=hci@%s8^htH53mRuCZvO$! z2u>D~7^W|=*O&J5zb|8g{CY%sbnmv;Y4z7gG*jO8#T6HYGSBB`{v$T!M$)*a^|WK= zq{YE*bsneHT>IY3wKy#mR>Q?$c}+9hZFF zANRFiri$2t0^;v&JD}fx9~T}SXrxMo7RB@79{)|{d)f(>Z~yGre!rmftaG#TN@++{ z9A^7{4z7PzSVT={u}&K$!xB|dts&(EQLrEZo*O0cp1$q<90^aS{oeH2<2#SG(ixh7 zYfg_EIwvS!-u@@uGDcZFE`NQf9r`3#8ZD`S_#fd1zOSAPrR`&SNcNCny{P?e=i3k^ zssHK0774n?+Y=VcZJGb5!|aeoEKLIent}qkthS6@ZZH3((2~xRBOUo<&iV{AS8m}Z zeMYA3-d~&?wP3PIN%tv(DD=pp^^Ahw2UKUj?*~7v+4e?@#xjBL?5<~&f*17e)gG*x z2ezR?DjyF_DQk#m99o*3dDz;D5$@-c?eO*kq?j3H!od6SoZ>NP?ZR=DdfDDMY6+Ot zB8XY;%D96o@(g?|ovDY5<8*yKIifVScU#-hZqiiYfT;vsuwZIr1)c^wo16)}--QNO zU3%P2`Z;cPqRBbB2!m6qc^Vyyh4onR0FqEu3Z0%ObnflgT*@B|BGSDfX>9Cr(rPm7 zN*3NXG%|&02yJtx(vELpAw%(A%}hp91_64$A*W2Ffg%=Ei8dR*V-fbb3lyF-k{J6l zzQ^(mJ!8<25S{j(ycBarrgg~iY?hP-kw`q*!qHo zh?{+DATWfLKBUHnE#c{G3+h8bykptAK#hwj#EjkX>(1qdG;VPF1qoaOCid)J}GtMl_ zcgzn`4sl3wv}GTL=_i$hBlE;UNV3aXPRrC;JUdk-9{_s-$`l7pGuQbPxHf^-NT$TT zJ1pu+0a^Nz+aB7|3_Ei~UxBp1Pu^i%vd{&O;lwP&IT~g zaKb2hdeegfX>sRU@ZD$s@ma!m4k2tVWo`#Q8TNA$R}BACu~I&F2&+-%`%OG-kMjyv z0zG-ZPv0(;2N+?8j}FBWlJ|{j7jZ9mOwOP>R5ThwO8oo36N%Tzf^1@9zN`e^2|Isl zd%aKWmC1B8DowL3Fs~I^Kp$RhwF0?!AMD2f%Hmw z|6^3W7jH_m@em&?s4*L{Tr!VEaFzc!q8bF#LY`6s)KFNs`G)+r?*Dt&9dQsP#b90L z1-|v@Ip5Gs&{&E$F~@9@)z(Vx4BT!xq^LkCk3Dd#^{=ILd{g9F`;6T`VA;8)7ilGa z))+{;2FxZh$;|ET`gewP3x-~%Zg`!m`rI65VPhlTA&4!!@D$%jq6MpC(*y^ryo!0* zwB(jD!r&2l1uc09X}EB*-dyt%GK-R7Y@*NQ6Yjr?ut{@r_bsrw&%Mo*#B_efCoU<- z*a$~KYhIRNZ;L$q{K@FOkKl3}!lO`}LCS=v$pMfyq!NgH1N9{eiHc{>7+>D@alCfn zR^C!Sqowfoy^$>;{6ZCAh2#x7zMaA8!xBDYzpNOKB_sN!B{l=W&xkX>@8DRsxDl!0zdv6RO*N$V<+-@ebjlkQ`=O0wbL7462WYNY(`XX4Qp7{qRD{=><& z{jwVE!U0CyPSU>_*eKRZRT-ae$3^iUYlmIV)4W*Qk4WGDL)^?eh>OP2m(@XFRsN4?LKI6^q*?1P&_VE8Du+KJ(qFM%hn;6=?qctqHF8e0pX7^)I(3-e1W}f zP|{L^ASw6^+B6GN0&X#kVZI`XjNh;$iTbq56n?)5scVJ0(Hq!oVSx2i-QCe&Ywyh* zmiq@4?D7XEUePTP6k!9q8N>KV_W3=eNxnBlf=y1LSKBT~T}d9fYi?MTXV&6+&WhAY zWnRjwO4HVHi%YHfEG&!ga*9zp6TR_?oVLuba?YtsH&iUz&arWSjK); zwMz#o5ql|bX~dM|>8Y3gwRFwi-51Zx{}L=w=8Cy&K0S^DFj4~C7}KuP<%fcgTaS*f z3XBiGekjySQJLWk=gODN!FgqW@cKAp0BhbINM<$i`-+MM58AWA%e?Hs+> zj40fL8*Aagnw0Eyw#W-K27JuKLH*}MPtkR!Ho&?G=4ki3o#e62mfgqQe1cX{QSm%8 zB3w0-Th=to8dzzt0&_j99rCU+v<0yyUXkQKVC<(uIYR@UE_VcZHU3%TIYFknfRFJ`pQvfAFGh)+8vo4(UcM^;xGBM=Jd>ecf+>0XH z=h{GpS|X{r#421uGoqU^P@4Mz_2AypY<^AYH*uA#ZUvul{ieS7dYKt1J89qQ+V=og z6&{O@L)KmeFT@sCjDf|@Xw8m9-pW}1TCf(!%u4eDs_88Dft$ZeqbNUo$Y(~$LzQvWqTeDEPz;Y*i>V4ymsf2H+^%8Vj%w-Gs^Bs4y%7wZm?r9le*INStsgtH zp0t)Dz74DgB>?F?d1OD13P3u{qQ&fnyJQcQo6wf2l3mvrnvW1CCW-NOdcliT_z~#J zdRPXRMJ2R9krHkPQFg_CIBv$k(i%&_$8j9{%-mY&*ugFz3P{!b@DC%l3P8ld`E9UH z6qU7$F!HnAm9rREjfo_m){?9W-)Wq9shvy-X|V~gcs!l992pmD8b4o1R+LA~*IHI| zto%~Hop)MYv}`#;-9s3fYUxs@N|UJRm)EVrkK@;GG_-)f2Of!{T3^VD?KZ@u1wY)- zr@~+G9mOMF+@Pk&pp0+_5%P#rKX*l858W+J@fe;;F6*m&YxE=K*e@xc~8bVPa_(FwPx#?$q_wex8wR}H)|L$P%>X_NIBb% zm$wtuiBMRR3NNruJ$8+{CWFGl`%Fc&`US%Hh%~b>HhE6v zF>fZ7%zFq|k%uxb{SU>&^Ra;5*!86Vk`AtDBd`)3oxKG3pv2`)e-d_Y?R6!eKeIm% z6Z{czu%>lGN1m3}&w<@X8&jxq5V($AkB&u69hLX}e5ira?XJPy?Nz{IM%Kvv z7lD>YlaOlIaUfV#nuR4q+hH1^^O8aPb(HPeCC^!!p{Z%`>F>5^5KAJ92;lm+lL>7V_?_0yTL9x*EAIqij7% zL-3uKdPY8pkZ@2zW$IM2`axM_=<%@y=+k(=TMlr({Oh2D`ahT6k8Lhv_Bw!~c`&!R z#}N6FzJD&;TM#-kjR?SbKd+LL5C}JV(}DF=Pa! zrAR1eTCo~dp!>_<9hsC-cwQcuWkm9{yv#5f3Q`p-k_1-2EWZPCSM&Y%k8cRm=M#m$ z{nht!rGFTNRTQv(ygP^EYil^|#mREX+{)P!RU|j3yxH!JdBare5aVwOz7Dyd@!rMI zeN6n_gMdhE3{FA|r535XQ50u*!OHVJKH#J&pT^E9d|k|uuukjF`UuJN>d7JI)-j*l zLPn@Ho>7jhD^&S&w$>Tf&KAT_qVe2&NNm1)#!AWm>6)zPLcUS>@^XN>LhxUAqfx36b#U+o<|;!qBf-Dc|%PXWOR$4})c-xn4E&Nd-hXb7p{ z;^fqQ_e$l$pffo2q)_r}Y~h@7D_K*#^8)$Qig8PkGJalGlav;{!~SD`S|Lo4aBIAz zRJr(U)prY%KmDEk&tT`3A|1tcCPGwnMT?|jiroEibJc8Vi5dub5Y%{oq9!=Wd!7oh z4Dn11U{Q=aP4m$Kn#|M6iO=ZH`mvHwtdzyX<-QA|Ecn)XLEemmm(Ge}A(d%BbQMW8 zpliG!P3AP`p^|vKAYe9)VrM!@w9jbIBt}zufK>MFXj78mmD42NVNa@hEAy6L($SPs zCPd=8{9cC}LkCHdO|->xl~J?^XCas77X5`1{wk>U1=(6w;RkWw z&yB%(55~fe2Z2FHaLU~NZ3vS%G%ldROTXnV2t?Ypx!Omu zPS~6LDS`>xea1(~<>^5=5y=m0NAwzs$n1*YRF3XQLpi_*PP>AG_cU*Pk3O2AAU z@=iG&q|$TxvT^_0WdavPZ-VYb++-4Lr?2WXogR;*g~leJxU!YHZ6;`hf= z{y3j&fwu9uTVCs@4e^7(Tc3a($hm7j&NReJ&s}damJA9IZihIk4gG7$CN3et1?uB) z{_EwC!ks&3{F&sA_~$Ue_Na*`fe|P~r&dPqxFe4fL^T+m@h4b(9j6Pqe_s3i<70As zEU~3794`;!N1_6Y6>4b&*`U-Kb)GnJK5jjQ8brK^Bml@=HIVAa(Z6Qqp7Fs1C$4aHT^CvNTCCP+HN;3LAXSAPqN;w<4&U@f+=x&RYM>WORyGgg zH>H2u%jj5v&d80|RTamTP)k&WCJ6*|YXQ%xu8Bg#IOA)=naH0PV6g4sc)m%d7n8LV zC&to>Xwd+7C5tF(psV<}-JoZIdEX}E%i@0*^i2#3leKi!6HtI{8E}*`24bk|G85>E*h(5>{|Be&2A7xO#bq6)mfh7dfeS zO3s=)>EoIgazTNSBvV+I1w__qCnDn;ePPp>kO7qVvpy@pM;$H?oZjG+^IX6c?PGOH zh}4|b?5Z#Xp11xK+uF?qbMvw6D3w(qwumf(jhJ9^OtO&Z%(R^(`gt%#ps$aV6wmFh zHZjVAm(qSVU{)~|i6-<&yDq-7Qik?YKOI)6A^b7~J!zj0>8&yV1xSy98Gsfp`N;I^ zv5MDjsH?WPD;nf!R`k7hN0mDkd_~zy)Y^f)dhBs;0!g=icfMFoa_&Y#cq>pyF;AU# z2|&01vrh3|bwl8JoYhupHH3rqO)W?}&(N|5^nRJkarkG32bl}wPY5E_+_D|#GUHp#%SFGPlZtB7k$7?#%J=_nVja*iKQwvOEF6oSnDJU zj}g-UE@S_mTn@D?XP4cbOI=g{he5LdesbFl+}bx+W=$Q&pyjqr{q_j|(ZPl<@cfTc zrQjI20$JjU;gE}R`<*KEWJfIA^v@}v`spy5eC}r{n`E~MwLDhk%~jHrfmu#phgfek zqi1Sf5v>$N6nQTp{vcP)Z_z-nt0juHM_Y=MKQ$~S?u`?SKF(h&z6Y!Bs4Yc{e=o-( zK60APwh^C3-v0I^Qo5G=Qz%_wCVkCM70Mptrn39iee~`(osc$?UTdPyOH7X4;*^ci zv!X!urud2fO>~Y@=aZ;sk>UbzoGWRFV40sz_}@{%>__E{LSZaqCq^|u!L@N1tRb1d zhDM|_ve>J;VqhWbC)ABL!f2l$Y^{e-PNz^t|CT20gWWGwEI+=qJ9r% z@{U?{-UWK`kzr;&9irO)jHN8{%kyOL*A)^Qjw55Sw^E<=dHYp|@;a zGhhD1yy3dM-*Rvn>qi!KHA55+*(YHcbiV*C@Dq_LMXX{}VMj?Q0S^RmuD2PR;~+GQ zbN4+eXlPpSy+Wx>^}q@*8*a*D;}#1KuW;`8jKcW=ByJ7;rv`J)9{N`W=Zi&LdF6l{ zjSiphkC!U+Ps=BZA9nw=3qC=SJdfPhye~%u zc-~L-!1v7mYXP>~esTV!b!F#(-1|R#-tX5uE<2{eVPt4pWDr&F0%rryibxX4 zhrxMaRf%kS=D$am;tfvOywIFNLv!u~s&5TJOj{VJG5#F6GnhuKpHAs6H==g@B-e%Ux>2~-jatO@{G zBb=struJ>->|&I} zXM_}tE930!f{EKJd{Jn5tc~m9EB=T0zo?ovUqs%Rhcp9ziv=QY##m7-Es5aFj8RXS z)yxv}!DJ!)Ku`ix?J-TI>%jn`Y?^&z?nR8sa-4@Tbq zRa7Ra?7@*bqODZ*6+656%E_7twUiwvZy^Yxtk=sQ8Bf58=DW|`>jR^Bib{{6nH(A)NrSb)S6JS|ms zfbNgCYms>c(vm+h4;>-o@$wR12NE|y(~Bru0bam)VRl{KXYpiXQs&%^0Hq=L})L5a|vP(oRdSpL-1`MB?9d@!x9Dio&4%{*9U0e<2;@ zFaw>3O?rL$pe=v*_y`*RgXZ)w^IiW8Y5yoUqDpsUGaW$*lc*AS*Ok#@ey%m96ob^W z43d5gpg>#YL=-ag;%*kE*gJH$cQ|XS+a2j7Lfu>B#C6SR_iMsjOE0HZzQJVKJI-Au zBr9g-1k@L%&aaAz*j2nD&*_r=oMuO-gwR{RGdjmVz4p~I`FZ=}vMhf5@uN3{Bfc_; z{DZBW7@EgzW1%3#219}nrMDJP5n|37M12L(L3=K&=tREmoFH8k)5*~hwSc(UbNOi3 zOQIuB^D`z$LipHC@w`tnG=yf&<#L@YV@T6$Px>X%;CYri>BTUga}bAvk-e-Swr+fc zhd%#<+wU%RRAe;O#w`A0x`YbR&%aRCLO!Y>P~iyX?(b`=TfV3$zm|FU13LFu?nwZK z6Yd{Z9(Lk@SUQDkr(mZxbHNe2!82esox3}3Q4GCI=Gb(nI87A2OnAN^NnD=7n6ad~ zP&07q5*sH@HF5A>bdxuXwoP=jFOgc_T-wCG+}{yOT85^#FA3@oX5jo%yU2iWkuE6} zqCI7S4tIT^phY3j)zwv)v<5JzLebPRK!f7uclau*7Bwaf4k_%ql%Fe$_O@bZPWeP3 zB29>DZk?U53bayomJ&nTo`Ze0n}m@DuZmmAD;j7b?!4SJEncqq$um^_gt(G`c(azf z#;$da`Bw`+2_y7-h`1F{X8dZJNQ@bNaQ4n)YG_aO>wW5Ovyo4LeEMvrW!(6g{xNYy z>PlVG!92Q9uHs}LTog5#Wy(gd9cEMvpkU)Rcv;L)@Y2U5&La8}FKzbQy5QTo9x*{z z#&?L7iXkk{XJcLrqh6$yYJHoxui+V;LAs7~yxxR>pi7TLhgj2DLsgnd1a-&1MLvVY zi=BQdy6@utAH;zH&a=X);JZ**B}yiK)QDU}nF?iWLRd2)d2>sn0RpW_Lq0DMNVppP z*D;j=Lj?We1c{i~mXX(r#hEcPMBQiv#|%tLQ@0Q2^Re;&u62>o(flQma-VwL|KNw9 z%J8F-1_HEq@K{NZc8Ic}kU>rq_d$XZkdjitNMFxxlJ9);O~JK>Ibj!uz$A_sZdJxi z8Am#dvUdZHXkt3AKR<4nj@Q&};AH>p=!9_=dvnCT>m8b=LFvniX80&`GcU2B+5yzzPR3bxB$VTNSXNISe%`LtWUNghGZ5 z6+P{)f!@jwSfBXfYT$cbzx2>?iZUjS?LI?mPXh)vSTrmM2GxsA<-qE{Cgj&!fxJzx z6};4mVE|QhFL?`H-jaR%3pU{6_PU&)9zW{3s(uXfK5k#MCFU2n5$#?AVmw)1i&40@ z9_j0;?A|Vw_H-K3H>nKMCJ{Z9Z5fF|sN$8F5;)n42mVj=gScg-VqmZ0Q?w#g4gX}4=p=CAB{Wll45xn~zlbQER+&jB z(UB<63CiM+$d-ByMPJkJ6r6ckduGUteBtVn3!Od13nCSi*xeRD3C3)4t{{-aQ%Y&C znN7INs ziN`zsS#TwtNbxP|k-pPK75s9?`IEne7V_lLOLmux*hho~%+0BlETBK~ZBPjiFprtw z5^Ex~E#+DAP3uAR_rPzvSd}g8Zi8@y_2YQr*uk9_((nkzyrnm+Ph<~U0_$V9MHlbv z^YuyR$5oG}`E}){?_=@wBd$V%-CIkpva+eQA>I1Lk_gZt^eSiy0P1jAHSowdv{cwY zgKsFtMv*;(u3_|f0~zevRuzAhFI~DG=`LUBZihU6ngJrL^@;2{)pT^cTBp`uKrmhJ z%}p0rbplc@H;9EKtm-Q&Wk&3-GxkA#6rT&5y~d!HFWf?7kv3Ry)i%?wcSFw`1LXWy z@GdtIk9^%#n{SUT+b=28_;g?D_-?c%&Miqyrn&pJYyPJ0Je##V?LqLqcMqYiCTp9S zEq&f$yMCZE$SY}9p9f+^DK$T+D*ipk%Y%T7usX}(5`0Su=+AQ582P7i$8aP2VBcQ! zK3^;b7E>3C^rNf1eFjkn-2Y|LppXWbL|4&xsx>K7WHqjWvOqZ#XB1O%!6&g)S^Oxo z528=2_gM%(s0dxJc7J?E+3tm(>PeY7BY(#!_l%Hi0HVbdT%#07=BJ`apz|EMoop-I zNL+d$2aK(@|9nRIb81$~!MH0Wm01iVX9B8*k&5$(lzuOzSarH~#r_619-&b4(4#V( zLmdFZ(LtkZsU=##$BqZ@_H7rupp%pW=ptLy|2M#Z_(1x1sR#twi|ajj1s ztJuV`cZMC!?UC25k=Dbg7QUy30?>X9$8*(LLmykl7se?18LG}{bB3l+_wuA)b61$< zn124{uzNl((Ga+I!>n$NR%;m{l0u=;#|gPdBPp<7MN{3i;096~jTa#66Zk+frS_Ej zCS!{dWDaPGnd3=&cq*P7sH(XlYo$38B%;b|RX$3h6__h7fFlv(P4a-VaWexbCEL46 zModB^ISU<~RAEG;Zh^S8G|aQC)6}@m>2Og4CDgadGppFdZA|OB!b)78Dx|`KmRAkA z$bgupKpq>? zYT*wjPv1t3Xxt%!#Hteyi=>exT2DvL2fEBUQj^bmlW$G4X$H&bspplE-qs7tVaxTA zK^@(ICV)FPQOFRLK+yjRK(B?Z{>Q5H0o-#YJwB@hE?O4yhsvCqPA`YI%4$Ah=oeBB zzZD?75E>lxYfR1UxdfH~sFrH|(g4_JA9hAdn3z&R<_Mk4*+v|)-FaJaxnQeMHi_JcnO}sqLm0kQJOMQ4Qr6(G81drxM zUuGJXfhp7z9^3u=D-9WyTxUyE7JAK7@1@Z{NK*4|G|y8W;Y(iE>|Sw~l< z`N8#VyRmH!X#zpcYfRVh?g*p({%L0hTJ;C}Y!CQfV_cnNdaFuce*Kt6eSAzEjog5Vji18s4~GYkl7nyZa&KGVU0G4cJ%{OBjh(D|{&* z5sN?M59zvrT;cM644nCOZbNj&V$Gn$Qjr9*b1vGD*Dw71-CdGD7i0Fq1hZ1XF`YkS(baZzBrXrO29(x0{W*?m5Ou1d}1(?gGrz|^*$eIR@ zIvQ6DDykfMUZSx3w^{u_p?Pv{Wk8Yvs$_y;B8h95lTkct(Zx7vRWGEVWuR5*34USN zRfV>yMI;JNqk}AE@$yQy8YWkUzWp%kAWYwA5+!wV^z`X?t^0x7gNvym&JP{Oi*XYM z>*(W2gl`3zw=KK7gzu1I%cBEV$r-ktX+cF`j(=n_yV@sJ6g-nFIYhF)=DyGooRjV( zMwH|j8P$ueNX?k|O@nik0T%KTdpXo-Ey4}2+Fyt%-T+p9mK$?{=#{%o-lt8RUN5WyuYUwyo05s#{|(eYSmy@|XDq(@U`f)brD6x)lotB!6Vt63!{0N|xX{3ygPqbDbRPHmb z>r*k4AfphbooH@E2O;pyat!KPCYER)7{=@Dp21I3*q4W)IyX&0Br(6mR}0T* zyx%pK>0ccW?muHc4{u}s;BoDE2K-^z;k)!9)R{9f@`(HvzjA0Dh0zYac$%LG7)65%hpniTqv$T0hE~VG;2TNm zUxoq~tF+n&G^wx11)`Op7-F4wuOPuhPulCR`bS=wMvMO{CGbdmdSdJE;3`FT0uFN! zU36PR??cwZ2!PSLWR#&v=C21^B6>Gf&cf70yEckod)-R}6-dN59A>%Pun63;@Pdq# zpy&`j&zppty}S^DowXLn`Cspw;~g(YGX-l-b8`Pw#UL)FD-@+d_8VG+U`eVWx2P=B zfF2s?G=LXLz8`M-{w*N&qm!J9Zk+PmPn^4SwT{Z)%5gIQl2kG9A(x1RYRK-v;vk>F zg$(}c@{{eyE8F)d0Hz$@yB%Lk0`LLRK&ygQCwK@b_FA0k@=^WCeLvnAH&O;_I+ z?kIDd09M2vx58>6KV&~nfb)ay1ZB)d_sIih+Dzgu?B#1#OuPxUq+e3@vsZ{;;{Cl` zWdm#DAQ@~pyBvI(oib@g_}_?>r|AKB$y^%RcpK!FhKZdO?7?diIXY~}093dfti8fs zo<-(UK~3&RC;HonRkhzC3r+cC^K9Rt>t(N3Vy(U@_hi$e+W0T&7Tv*-qe-jm1{8;) z4I)NH#PiOSUPE#-DKO&g94ptD4m}l0tX*D*k1Az*Bp25|QPk8li+b5-v@YefHHXfk zk}B;aaGCzW1_4J8dAueWbO%O{z{h5MCk^-FDF{Lvo6#Kxw|Uj zLMgU>8!})0f$6l;XH%8n487DUF6(fjfp$o)>rc5w6LVb18drSV=0YrtkiSgtK6ic( z9M$Pc@I&dbM))0UmK{t11LNQ*nJKlCgh++Egzd*}M*)M8o6>Vj&dPSjeaXpZOlT_M6PZi#LJ&4-^TF)PspC8A#>*)V0a4Jl^K#z0|7z%9_r7perV@kwk=rBP}^FQ*nbVom|nxjoilGW;tOARKwfkbMp}9m(14QA z*)}Pl6O>k9!DHU@dx@Kqr`O({9MlO5g8Ey0zXC6N++`lObQ}3^PE$AC5N}pH@mp%8 zHGWVK4_rDUkL98gh`S9Oef>au?t1=uXUi?FquCx>*3pknUX@obH#q|kN9we@pvy0l z`V%Tu!+UQXtsE>VX^ewfSx}3#&#OgS>03vWXBoN!h@-$ND?167$78XuY`-t$HeJ;` zaEC~gE^8DI4B~R&=sAWHSRQn0i@igc+-3V|sZzIUO!v!UI1xHBpDFs>Da_C*t+^5< zu8*Fe{}O#EYb=#SQEwy9Jh-$6fjnI?dU?F*ilNxae^wnbk4r$~KDRX4@h$ z5Clke5beru#8nu5;HdQc`RLvwby!hDqH9iqChAXgJ>d)ob;c=Aq_aa^;avKYSbz-c zuP-`ZHK6J+SqBaLd$c1E8u^wMe|bC!xI^B)v84LkAYYG3l>P1m^ZB6W79$dH4eVJb z^ev!--DTQ2(@bCdR2Y`{`10!kZ|%Xd`G%@eL69d@xD6kLNxxf-XtWV))nXb$blrJ) zGs>VSMew*=Op!~nz?qh-ae8FskPC*P{_<(oVIt8aS z0>1F_9qR4{`tJd>2$W43d_(u|>>*M7ld(f8LZ4K!O~dEG0$B>26n3l>BmW@}iL0Lh zH5e#3GMSR@J%*--VWb**9kL~heJ_GI5*mwJa@usskV5OMlJwY4reQi6y=>Q*)R61) zFvR4wiKWf&OuAY+`=iYwlo6%rsCn0gBi5&&TnA!K|FPP9e59f{&Y4MDuo((}>97h1 zXSmV>h+CR`7L8mS8xn>}r6<(R>}l29hsn5XSEi5Ksd!AD(hJ}EF45W!zn_*QMH=*M zgt(ZQn_6a596!dAI5r|H;qE|5mTHtt;<4&%Jwll#s?zxt;6cGer9T6haPq*3A=@7T z7O7dsj+;g?H8 z!G8O|xu1|Vmb`JX03$8zuSh|?40mAx{=o~l+w^2idl+Om>>P0=3UQO;-IEk&*0H}3 zWE%~d!!*_)5||GB+Vr2Ln@NJq2!rh#cz8>lIeQvsMQUXbj_SSmtY$tsYR<)#!W%W1 zvx2q(@d(x%NYyl!6LY`)C|>F|d)V8U8tT86A)^dbQTEk(T%rI9Tq>T6Q$fY@e;X)O zzHr~d*z#aS<<>^=&wk?(pVe(__+90qyG9WCT6UkZ*M|902-07#G>u#0H&m9akW-7z zGbjG`7mvsCa{(ttw`uw!M;&#ANDK+0e+(K1h?K7fu>O2bwxY|QlhFGSr1##`KU8gU z^F+$3&C@I&InO3nfTA3az^d$2Y8?20ScjmxLTnvW55+%Eg~u-nNvGBWg_qTkL(I1!7{tStTPvC;v@RLopc<5f*t6|ko{UWu^}&A*%(C4~DfDF*gQq{V&`XCF;vU6`a29DV;h~kKyo%)0 zkc{5p@m!!DB5cX)eQDZT)?~$JM@W=Ox~%K!z5Ms-vAEm+9!=S64lsGaWRpN4@$}+v z*iAQqjCB$GzN%I1THp;o2^lCQ6a4?06BEU=_7((&xVPhqz)chMc2W6}V4V~Tz83R^ z0>FB=JH!BCDEV?Ibx5dMrrO}MLCK7h{WJO>2Gyo4fg@Wm)Ag8q%@pva;@G z_B)kX`^6$|a1^?yd47X25ku2L7P9O7dGT9t{Go^AN3&hDO-aOTI0++F7HI-(-VG!+ zKzjQ07n9WJasaSOF^j%J8uNCNIKI(x!;&&CPitho*G(_l zb-vdl6b+9HU~74pSqc^&PHcIgkZo{Ok|SXMc=F81*;|metN)|O%gJ-gu%)N#{qQqf z;-W1lr`aKz?m`i{2}|z#w=jcPI>B~%RF@fWoT@UV(oq#_8-oK}XXi#q+=vUycH3BG z&*RxhC(v9mKRs5#;iMgub$rq)1R3@VX?1@1i zDP~hJa$y0)>%ZRD7^W`IUxOULmWui3{6Zf8G{f{Bu2Xq z3w8`4EQ8}IQwKLA&6CfCDxawzx%@NMM&)-P z`_UHlDUi0COTlN#dp7^z?Sx_?8!EDPc&oO76pvRn-5F)U5Iqt%#04|Il&?O>Irb`F zNOG*G;dXq@o6RNDm5Im#@WW#ujJ+%cT3~svw@k(9flzpxY^#OK zcxY_GRznSp+&yEqEq?uXWkaN#F3}?DjA)d9=+5;_H)o7A%9b?rjGwzxGFBlvF?xo( zJFWeS_(I(F-fR^asL@dejL}G0Jxsq!@u7E$n^-;yB1su7CuciZ1W#}~@gegg7A z=;OJiMlr4W13YT-ET`c1^erzQ4ex8ve32}SM0gi4X#j>HAz6jmXwzh}pqvOr92Qre zl!JYF?G|mml9Nz@$Bh|F4LNZ^yxBz8In%bn4bj?vfq<#GHUlExIK5>4@M#2)zB8bEZanq-0Qp+^QZv7`?*C}e_s!< zw*W(X*D3em}?#8YL>5R~`S-?mIV+ zC-p5a*Gjm*_{tCYH9^8FDZRZ@J#Si%-bbU$XDrR~BT@Kqk5F8g+Jd+`@&T8eQzt>F zh-!$NE&i7*FwOkhUm^=(Op{8Bhzn5l%AAL&;?w89lq65e`FMFQ!y*T@WZniYqSjgW zRvN(|da!=z`d*1D1^x|hrCDac6?TEHDsZM!s>`ZUZv_0B8=cQJxu=D~heaw^FUyEOs4wjQ9Sq*Es4Ppda(uPA`rkz%B zrF!IS?LvcC*R^*g%1Rxb>z zCLC(t<#0oph#dLXIH-@JYf&rPoh#Cnqik}si^ z5MmI0^jJv8^ZqMQ_C1Y}wBbZ6HgK18T5y(N%93{UDv{`c6uALI7GfPY2nkJ}RPX9t zX|1E!k|ID}XEXe+mVgQwS#!XYj^R`1BT5y&L}8nx&g>max>De+f4MywcfK>!$G8QM z@LNY@YuZ^fUHsr*bhoH^I4RL}*B@#sP-8c5bhEIdbxC%KXfoAvd8zYNZ$Zuxz*B%~ zTTjgfkj*cseoDjAfrB_U05a*9g^ClLCx8eY2drVJKYZbALqD;opM@jisy_gEI|6p- zfsqOCdn5%d-UiFq%L_#e{~I8}BibP$jeN{-eB9T;Im(@x;u7?x#8H5iMmzZ~e-PEL zPCf}!iTb4I`*nC4jPi=PIBz}MylS}-s>j0+#vYG}!7;p!B#iZRLB&b|yXjcH$JP2o zo7CYLyCq%}L`x_A8{H6gh|K?t9S+|$u;_VS!Rc^gncd}-d_F;3BF`to-8TNK+J_~L z{^+wrFTd*&&JL<)5pvz20gE(8K;h8@1(e+>w6r`}6`9&~j#AfH<-{P#&cP8T8;*_| zSIgR%M+M?cP%$^J?6ix}${DZp2!V=LD?GUK6+d}s2^;vrCaSOBm`N=mpC>Wr3EXx- zx!4JSywV_%Ai?z?Az<}rG>C9a& z7O`!6Ho6djbaHib`pjc{(otI{KAU5ymo{b|-(AIn^k7P}r!W9)Jxu?TC~c`MNItndcZie(H2?_7t5!-R8EKuiXURIqJtSKlW0!qxJZ{V^9trurfhSd7CXU!(F11g= zc~g9zch#$cLM1&Uu0-<3&A7_0cIXg{620RK17!P`d@M@x)YALdBRtVHcAizdidOUt zv<1e@{a%)-tL}u9W(Q4XLc+s8F?xHm(o#OA!NSmi^LXojM48rzqS1HH)n5Ma1sQuuxOC7Zf1M;qSH&w832+Q4!B4mm?KwhWD$mk(Vdbs$fzPMH_N!23Nvm z{<@n%mkY~AxE{c=mOFC7Mlh92&*vl^}_V#W>pF&CJJvSX|sEeus!=@{jqz43t-`qij3GIT$!)E{Lqkt@ci`ycYHGIi~qS5&D%`Kbj){Q}jGr)(erUdCM0^#}@zIi*g zhBxGUTQ=WOX;L>ZDF^)T!bSsCe0j`HatR z2Q=Fmx_v*Z-{sNa&gnayA+=|nhK9+=J+3F-dQNpkKKwrWqn7D7@LK#QUqXvpB+n6) zc>?c=c$F>Ml{vLygs#B2@aoEd+yeIz8Pd2ka+;+D>hu1GV1ji_#{VFjB0qJU6qZ@ zC}cS2iN2F`Iz^$>;L9L)TwLhVR-i;!Xmk0oXu9~_5jm{UC0AFSI41UknExnyEN9)2 zfC7DY2?Pm|6}UwQgj5s$K_E19rp7?f7Y52GHb$@Iv0+p9%q12>1LB=t`N^<~m^rDO z!!QZ{vB_unv%mu0*KrF1pDU^O0(F!raV!?1G`TX-==fk^w@4_`0v#w>kt?FayhcAN zspa7ir*HjAvT6tOYJMnim-r|(c_x`b2u|GCLEp%@4cs<$8yQvmlO(J}R4@^ybPYlJ z)`?oQyz_J1C$xI~wgVGV2>@Hl!Z ziEI{$z|6wDUer>@7MA z=nj_fDQ152?PvcYVZcbLZpqjJ@*CMUOSRA*0XIQ<@F;s|9YvH%IoUpG0{(*THQSHR z^vkXA0Eyup2Bq1&az|sG-AJM1$WCQEjm~ttvBkPt`{bxq!hLvT&&;80&&2AM1FgET z!|ho(XB#kj=jw!M_uRm!)l^OV+;NNa;QHG`50Z_C#wIzKPyulydU|?$(BMzr2kZa) z0gve4i+@sI?N`(^w5?40qc5a|b^s{tErLvVAz9olQWl^~9F7AGKd;VU_jzCv%(2;f z&9gDQjmDAJK}7hQSVYj>&xva`%07i~u*j?P!lMgBa(cqaZoRbOfBbm79p&6T+P3;e ztH45S8EV*$QaX#agHz4d3f3-M26pVyk#_Ny!{GX7eFs{oJPb9jmoxlweK%xkWFtT` zgpXsb+mWyDoAmV1?>^pJsNfWNmXAKucUhuFy?u82U}z|l1g>xv=*KR_ zrzzM7xP>WZc1rQA|l6H^l!N<8i<5j=@+N-?zz4C8t5h3KksZkowO z1I>J!{TE`6PLhmFVqaAqIaF}bUPgr|#$TCeO($Jm)=ToGv~*+d ztP_3{iB(kNZduxZky&js=K(kD|A>d~P@#v5=*r zdIP@-uOf8~AenoIGE_B}8FIfyduLR6K5)f^1lXVO_g(N7{m2avXZI}{I*=aW)`*A! zRmkv#<9D2J;CDV?@VmTqc;CwD(~NPh5B&b%X}OZ9q7m z*uM#wG`GkWLdD+n|AQn!p7N2!3;Ug;&bbOY8ELurH{yDavEB{i{jlz^9}9L}yJX=# z!lDLaV9O!HABd(ue+rPEF0b0aG_CH{#|^jQcQpBv4T669v&M~U|2=`sH|Pi^uxjJwdvaxf((Um)cg z&O~X(mUBdTfA=Pd*Yx&umhXOzJ=G&tZSSSN!YIrUae~c&Xrs;QuE%5xdJ@`vw6tCR zJREy+)@vBBd4G|v)mP@zf_1hz{Ffe$4z6KG=#WPy;)of~ANC^k>UMDeZ-*nbT zzCO78&4B#iT^`ph?1yH_;j)@m(R^$y4v8IP(n&dXz`i*%k-2wl(eoFCnVigB`jB5t zxQ!t6g#UI(AT&6t=iAd`I6B5u-M$CA&<-pkj;82-P{;Qn{y~$Lfb4j5qz>oOew_F` zC6K+lYLqyh>$;lC((25u`_)$d+yq)^#`NrliL&FKneXk{dw_vyhVKSjo`0>+LA$2@ z518lyv9N6a*2Edc)cK8Q<--ScJ|im`-Z%r)^G-?kP*vz3bXyvzcmv!_ERtwHk5j)7m&LO952;R!N9!1Nn3Q(Gji2s&yx3>^mjN$`vks(cP3RY6^N1`+1-cmvq= zrR$mJcH%R3r8Z?#)T*?Ri;rYIoO!+2tn@5)u6deI!{-{ih^7VP*xj%ySBwr%IgeX) zZya~h9Wyokaczs448sL4B1j`<;%*+f>2#8V31-622e*%JbDsNK1L5A4kT;XLV$bJa z-k3kUE5QN((9cW1vtV0~Z9G>n-`|fu4Yx}8q|p8!g)Y#9dVZ`wevf#lg2`$E2qWBk z%>WDG9-vRDjAskIQF&E%l}BHJxkg=9?ZE5}|I0_0?ys=Rg`(oAlrGa2+W*5R05X<1 za(!dtK;U%R0f+nIeY0!G=(1Sw4KO7WEa$vMAmOL(G@}zn9OD-)gZe*T$ z>?I>Hc|S*<0)WuRH-60jOa?72Ll0Mbt{c8ECBF}$JhPbsdJZQTYE>faT>ZcP9!r$+ zbEwFWaSgC-gR6!ZhE96o|Lc_DK12sPNcW0)_zUs($2>S4n+O@#fDYxizJs-Y{enoL zz*f(kG!9CEQL`(K4^}3KhU)bWulWeeD^0icj->PIJd%9ED@|te+&s*Rcox%^oh0&n z3{p|ZAL*p1AI!3Ii1|b4?dte>m`}4=ludvpBUuB*X5B_&hn8GAF0 zLY!)l9dljIP8Z};3yk_x9|jrl_v?pFLw+EEu*2WZAe%2@=#B3rAf=}!JMYXBl8&vF zqdG!yAq&ey*{&c_h~G96TULlQm#nf;<^(IjGoB)95=IWia}+4Wtnt(WvFn|B^}@RJ z^)Y<&+&mfyfwEW#vk|tgYBI$?4zQy3=k8zDiDPx9i;Yk!Cx60G{?bscSRzXOxTn;2 zFbo8F5$!Q)Z-v4T<)zfKjg;+f-%s3o(yCW)wRgK0ZaPjcXYLgOLRUBraT$nXljH={g}Lm3S~05d&(!eK zNoAyY)U0Ll$wYa2D9t(YSj}O?_JxRk(ipz1i=wfZvhkFe)9en4_PbZ3?%I|wuZw&9 zS)(%EB4k&u5|ak&>fH?Dc3) z%oN8E3p(xR|bU4jo%Q%AFX68*i~V*g@g|hmQu~37j(uOyzdFUF1gNp5$5YS zAx*$j-%(PFx;^yy%&QB?Ka=G#8=XT!Kz679y)K%`G8F<;=P7^^ggg2QYgC@J?q}x z-HmGH;gV@D&QgU)B@aPuT2~pH;?qPg^Nj&%ao=@R$Nu`bn>V3`a4U$kT{6nmX7%3b>0jr zyB=;}8O$5^el--Bk>^UYXn>N4#~_`JA+UXMR}{PDP0AoW%5EzE4f zX7m_ws}|d7M9wZC+L{&B%0RQ1{sQGYioi^7f?SHYL1L1gK_myO^!h&PG#N4#{CXXW zfq?&zt4CWjoZR#(HEe=!d22~s+Q;_XGT| zH1rya89&n(r54RT>(h#n{n?~FJl|$^Vy+^$#=2Je3v-1R?1oY{_C+?h>1u z#Gp>w5KgGjCQ6G1viNOo>QkB^<<)&4;h3{XMVK!qjY3323zmsP{LwoZS7^2D$iheD z9s^ECNiqh0_Jtd+h#-ldeCW*8E>tx-Im*={T*!sF?bzF%>%N^B8zt?~VmVj5pLag& zo#THu#UHYWL84Uw`M7UFCD~#Q3L%x2m))^_gZJ_xS`x-!%A$Y^zHcg| zbKP879|;qUOzm^8_CwVQd&W_MT5eQsEI?IrP-jF#wTw(OHp?U~2$Y@S_fP%~vJsxQ z_*%xWY0l*SN$72uszlHn!(WI%iW27@ssAbzTa}~gvrH&2gDCmVgT*nzVu$-3j%I8f z{Wj6t1<`}Q(EX*@KtlftzsBumw{-X8_;TyQ(e zEBh7?wG3Zl&G%VZqwT>+Q!5f~6!^ei6~Er=>+5z*?a76Og|^ct!T;Gx0F|yfz-IX= zf*qu!;lBeb9T>PB)-Ie;dkLYcLCh+=+dw+~d{scPGi z75woTP`*5H&uqi;x!?>1d_I9*lJA#a?WJZryCNJ{pK%V!gI#x7a=d_c7V6AqMhtcA zkE7^&-)|opl0hQCB|Em@r^}u1ibG)3?s@!nK3OS%Oczm2gNTG0WX-8IvT6ijkx5g; z$C)J*Ax(Om7mXH_l6fcUtvjyG3hMlheS#pMEAPr@bKC$XJ>f zqE!1Hb- zt&^D}2bn)qeUKVly$oC*QlMz4GgqIqSoV+JTb%;KcxUw9TC)O{n}V^g(9qbw6>H0t zYTMQHch2E|_l;bXK?t!=mTrGvTWwG*{=+V6igbY*+NGA)yXy3ta7^FT@3r@X{3-Z& z*_X^(zC}CA8*6cdw5vEmv1o3L-Qdqs<#o_8L;z0WPH9e2b^o`)FaKiogU+$zNw!`-yt zBq1S93bjTIa&?6}6^P^-#I%MJ;!FHt9B!z|(8?0z3Gey+Zz5TdL^;I3clv2v=E+dE zyOd!lyw?~-hEEa)K{ElAD>|SPXMoXROJr^h+qSPiz>=eEhgQWt>cXn=mef>J#M(VO zD(GjBDBcD#!X~MP7fiGl8tk7mN1+StR!$0GV}g(PJ&Lu2D`PkBwm zvLABz*?a5#3X|1x%lhy3?Sl$*6?;|4pQBM}d&{3SS^}qtkLSTc9)o-T0HVV@8Y%F- zO=3eOeK%p4l3@c&|e(y+kF$LFry_I~JF7doQeU2W|E%u}#( ztR>HZ*5kg9NRY_Llklyp?_t$&?_%ALZBEbgVMO;74%s~I^8GzOSElYTM3H>nz9$f! z-2RV(A1KKSy1KGWf!h3Cej!RT0I<`XWm^$OpMa~xwGZ#_ukl?cARDU%0KMPKHF^Lf z%YZ?weaq-Od^CU89pJjWM`v44uQ=w_ijakD^x}l%8L6%=yNJj13;eiTRlEd&%>3P* z#e#`)y3e%qWM(dh)WoyUfjumomFr5mwjo+I!piiU8p^jGzXw=%R71O~NDBfbB#R6K zz6on`W{$Jtgr$2OeIC{ELV3e1R>td5V0E0Qs8Ox2=ms$_h={|%`_n<%Va6Arq^hAK zCddjV`UQujBh!)U$Kw7`6{BS>2s>}n&l3HJTjjOZY?iK#jz|Xet)+3j-RLURHp)W7r0fXtb}U0t-p{DX~8R-dMH}zVpmb z(>W`XHnhe%6+D=NJ`GuX%yPc8g1z(zTj>2t7{Ab!ar<{IL|)IBRB0g{Hzx%l$oW$S zDLLlsBg&UE()-EaNxKk7f@LpZDm2I4L+K`A&ogodKJXta8B8_m1cCOaQ?kqqipyMO z?0?;A$;Vt?!Nt06P&b465Z3X=aFXDH<;nFfKiQ>XzQ*|7d&pS3U*Q<-vO>Hixq+W$ zuykE$5+GDZC>1zh)1?t;@5yD73-P$VYQ7l};?ehZA3m2O^G=NaYbNHeW$x$3oaP0d zVsZb*Xf;&TTdESqFNj6wgDY_RKjq-&Ju zb(84!r+B!2#AapN>6S5*J5D;6?Ji*Uo-}VTP(lBA4nWKN0V$2{qV~!O=i6h|+weQ_ z5NOs*)h$6@YJ{`7!ev`kv{oQ#PD>cs{Zt!Ax@6CTSB57svPmtuuJfLg4ElKw4;}Wc z)eb>Q3!9<4KqE<_RC~b5P~JU>Jz}c2_fpnu1u!%BKH~FMqTLHh-eaF^Xd-2GKrRsF zXxi#oMPt1@(zOW9%6}{4{)s|CZRV=yAdQ$pPlk!ff>ZjV zhZf@;f=FGsXCC%Iub0to_Tz{M1!ptv!E%W-^E@2Q&?+l=K+cpI3meDSXg|IKoAqF{ ze9gA+NklY9%=BPLf?~0pw{;2C=!5U4=>brhuYIT@rF1VOgHHKq9*&9p^$p55kKaTO z+((@cY@E+CT`Z4@M9i;#$#q?XQ_3_B=JNS-MTu^sb7HtM(q)CI)?g!CBg%_kW+rI@ zkK zY5XRcI>?AG)1uC7@>mH+WWDG}XZdSQ5xskFfw8u)2uiMR?j??%C__e@1 z&GgdVlh-bwf*h~X6S^VtXus>Q6h!ohUD4#7Fz$$FOj;i!3}KFd3TJ^F(#_I>Fd3G( z`1b1b-1LmJBp@UiK~y9!U!zAR8mNOwzf_HD`3(CvSD@MZ;(Phisie(fK-3{I`4>jr zp(2KbT&IBe{({EHZm~toomYw&1v}85|DR=63psUFYV{f`JQBzx>unf`=V9Vh9r30k z?xatZ;hgXbw;?(brp~B4EfF?e&<;?^pqsGOFr46)9C9eVKSj~VV;s?Z-h{6IV(SDE zx~>bEZUo;6VZ~NID!#i{%HOSf3-P&}@*h50>OL)J89%%Ww4wzc_tAK>fr6K<2Til? z3aE8O`+?)BX;GcTs56}XvXuSN^)@lN^SW>qKpvTjze|hTw+YU;jnhj@X#`&mls>hr zpJcxtWWOelzC5kJ2?EF6kO})N5lHjQD=4XE^b$L?$?&9bXu~lD<~Y%{g?GN0!pP1t ztpzkW!r5VpnlMZ1!9`Yof)|0BNfQRcYaW6>%Su~jk4Z^qXuA1X7Yb3{vSM9H zHEa|Rt5Ydf$DpcV*=BBx$VU`UUf zL~jRLfxeq+WSOju#;_}O_syVbu>J{g+=?o)dI^EZx6hif#g`nS+fYb`hEgEC6{I-wekW^> z^@*8h+P+%?KA?~t`g9hrozjTdU(_S-nPlS-b#Ooif>>35L)yBOi~SlLdj-K{M(u{I z5o6TyfkgcE`)BxoFQ+*=wy|DsPm5iztYO)&)TiLrxZ(75@$2YpDjS!5#}y-j>Mv&` zEoWf#;UjF@rt|C@tM3(BBC{6Li4f}W2|l6?VO9ht$32u)dXLYr(4+EYAe{IMK-(O36xtm9yy4E5$27stB- z*kmom1h3C~LK8sI+u_i5VV(ZNwj)u!eG4OD#Q5jSq59PY(DMRvt7k01x3<&P@CmQm zx(>Y)q1SDpT>!=VV7_pyp-*-)U!$F@XD(D^<*%HRshyru(DJSKB9$4(en67eE7Z9x z)VO6)mE;#SmR!M&=bvd-{1t&6>}OGw6`VrBj^Ni^6|God^ACxp;$cvE%Enhr0?FQw zrycCF7{5<6c_~K_COMGwr!jAAJun(}yp`!7H42O>LPE3Gz?%o3jJ_(&`mX(1A}jcE z=7YesrR&CXI)4J<2-8N)wNx*ST-L&K5On`5KxUQNm>|a%mb@G zv%n?XA&4;AcGS$s#^$ipRR&*H2z$xlR~oNIxn#s^ss`gY%FO=0 zq1D=is9N`u4?r3xVLeKFZF8l*-g068#z~;4fy72!hOHl(RNa7uDh*`C)Utr@9kMjx z##E)Q|JpChRu6FiSIbTr&W1{++$%zXi{iq~o!@f5-Wk?)W9o6C^cpceqdsLyu4M)f zg@us5D~|L^%T(-LDHAT+=Ugh^c^JoS-)5aP0=xAiWhdi>F{`y0PWp8gj zIi{8b%E|ru{il9+{gN@~qKyA$TMc^74@N}~P63DG-IVNLp6akghlV#VfrEt~< z!y2ehdPYV89G3GR0FBw*U-vUK-f-Z$+Cd)K;RTu?xSAqd3Bmsxl1Fbhr(-7tca4%v?q+i2PM;z}XSn?ZQvW@Awpq+8sBwd^7- z5odS4GCedt%toPu^SBV%r%;wSnssox%SMZfX5CcOiTj*LdVHQ5#VEvXFhSeMYLcmZ z&B2Gm2vf_Fg*3fM8j?ON^c{Midx8)aJ@uHBVkIKXaup(w{eC$z?7UrlqNjlh$i(c$ zgoKKoVwmVJL0TInHZhT*G?gxA?BynhA?%wCVySbFAth7UpcPBOiKzKS5bCjE%Kj+Z zEP}y1Bd#*KzpqL!SMB{KGR-bF4Dl{Nzj4cKY2o3Y=(_@(;uKMa!#mm|nWi@Op?OG> z%gxgyilorc(7zBzPnHxCd}cXmAXXUl@WceZfuaTam6wYCxnb*XQU}7(YghTqBeHTGXOnuC~c`{zsd1GZZMv%Jrdu&I>N|FNv5P`6d_~J+iLWE zQ))|@D)jfbYr8|GfOE$D2XC&*sLjz|^?Vqq?KGE&&+V9U@dAURB^a@NU%pZwI;v?hprrGFcz;nDe7~#SHF(8YUSRQ5@`pGwP!Z89BZonu)&#xS zJK%ouW7v#ETJd#}C^t;3-56N#Zr@_cqLxdm#{6a0)k7O#D%=@A@`rlzE#Zb7XL>9YG#jp#XGG zFt_fkam8l4j36$Z z{?oN5*DzBjk|R3+5Jtz|KR9 z+c8Cymxl^&I+*H6k}Rcl+*CwwbD=ifC-(@QJNc6N>fPNBfRa=UzyQZtRE#!Oe3>@u z2ZGR~*jN(a?X9wW!l;=PYm8HQG;Pr^sf7k+NfvyNN#IX+KV4TWtPSYw6r?;-Fu5f% z+S5HNblXPQC#^mvt>|L|oq2qozhNqzA3lGglh)lG=t75;@|nGgNQE>+f&3^9Q!fIz z(wWI4Shb0?^yRmB5kZ8CX~o6gvPRinU?bzrwLdn5Gm7dle+@>4-JRy#k&hdMj$Z_B zkzwK3&sY^kPyS!dYq|hSrj-}GB@okgt=|~J2SVuc{W~Q(G3a|l@p{2v`uDqx^St9s zD1tTTYvA4@|6Z$Q^C3?9MM2T7M!#lIinX1Y6-=JMNNYHge&tNT@i%N8-E<{G_(AG` zKR8qFZ`-Ej+HIj*iArLT3c%hf14x{bWD>eSyz`%{h`Rfru0aIrb z=obSiwZSr*k$DhhpB+>Zg=Ui%K~y~spGUySN|W8t0M@jPGY{w%+*L(#j@np^qS=hsp|ea>k4=2rA?B+QZ5ko0ytL=Xn-=OIM;2 zZ-1AdRE_~0T9B-I(Ey8;X*|gRmc*WXO|=PdZ-0V8`fz=!3*0W+EtmBdt_XKuVSQPO znqU;?Z8jfkyqRnaH6H}|mtIpdGbLbs6XJlM7~m^52R9-=HQDbBqeY#GZ33>!=fTS=ZUC8Ji}h2Y!atHng!5HP0-ozuk6syW$hqsjF2pC;o;9 zjL)7$mTvET&^PA{MZEV+^;+;PZ*&AfRJ>_rN9W89EBj&8^aBuB3HHya>%QpLA_4qQ zVWwZd938I{MEgVME!g^m36CICC&m!!izNmW}3698ILvAbVp*)$dOf`Q?>0 zUjqhz;$!RIZWtoYJ;qEAu!hOQ=CSAgo7JeZ!Vwx`Cjb|jk!xBQmN8}>?qa0q;BoK- z%gHlq=O;Sa#Rq86(pzt*q@c?ntED3S2q9XJ{CZg(K#UHjs;0tA<{*mSnDXl3wlkc|S{ie-6 z(j_w$Yt*OO)SHbr$QVleW}W8Fi*YtPUGu+D(xu>b{NU0mb2<4*jn}E%mqMA^Z~B1{ z%||7rIWh({03qp9Dm0z1JXvJ!x=YG9YOP|B@Ju9bh-mC@yp8x+W0ceyyFg(XEU;fc zW`Iht3BDm8e4*I62R=<|O8WNsEaX5p<$+^pTuiah5v!N^NTLxY|K;QdJBwc^}s-GMmCVSy2ea~a)I4jZ4{ z(d!Y-;^hT>*t5hDRkwiu{v1F1CD`^t$m?kVwA(Pz^E#`$`L<8;oFk9!B$F`c^~!YN z?+!Aw4m4d%z&MmTjL=xOuMDUuzZ5;+n2TWG&CInJQxFf zdp=H+is(KxQ5M8ES!Q8qZir2-KQ~7qC?V{UP!fwR(Hs76 zXw#6g64gn_&wa&awtwZTO$am>d*Nvp@v;@0obcu+?coa{w2XnAFQ~|jr#~|VGMKCL z;w##`CE1@HBG zl}$8fLPGa7j@;v>OjjUEvgJ9uhPYTR-jg+%tcb<9Fy-sUCN3~1U^44s=QvXYupbo31M*t`kS9SCVU^`{m8+xX!z1)V= zn}+7~0e35Xq^vy@uw7M`;a&|$5a?l$%S6>(E;g>wLE?u54j(EuZV<#)|H{d->TxLSt;(9<{AZn|PV9sWO}20b;J_I`y{uK|`UBP1x{PAbjh&m8twkk}=hqT=?Boua~BBT4ssuNG;%o>O9va6Zbg$ znoSA|p;dvoX4Aw)Lqk#Vy-YoI`pz?g1sxvBYUQ+{fgXW|0@%qNa!`g5d5_j_+&Wyu zFge}PB|6fZQXbM%Q**1Ts<7yrlr>~!hc-5dPn_GNEI04Mv6itNW*6(|$q>bgii-iE zQ3vO{P-D%8EI<$F;{ridFY{=)=vXuu`@P!+ICNrTQT&Ma$0o36(yxXFYe82<=3#rT z0&m9yhVpUbE=?)x8&TWWv}8(3N?!rosz}?>LRImajbX&WxB1mNQzct%gnG==nXS)F z)kr{xxn=$uTgLt33{%KMADfkjXQJ86FaZToI#h-s!a5g4nzbMX-3Vu;p}L*cOhhwjC=PQ+D>m`yd-c4_uJ#b6(E=lHmMt`1Utu*YevUjSY;~~hmv}8 z9jK|C!wcKc$QJYrvvQxqHgg(0e$cE5(>)-&U?;WfF5xei_mj|w{ z?f&?u9#WJw)&Sfv4bZ-BJlXN9v?jsF8gZD665czgvM(!Q5P=t^xyW3lt?uq;grx~j zU9M}8v|6eyG>z1t7f%@3$)cNS>UufZ4hv!=1lRa=FKq$onIYZjbKA8>5a?n({A|Zy z@M^K)r`~rgsx=M0eJq4j+0y)5Kh?wL*XW9PN7AOsfo(0bE)5?I{^)^grA8@C>}A86 z=Cki*PJ_KmHE-GbsT%DzR9aU9>kNcaj(#aQft=xYdt1&3^@`v9E$nouEZp-NG@Cn{ z*M@GVYr2G{78RW*yf#Jq-v#o7b&YyIweG!H{Oj+R4WQ4&wKn6Yc#}?R*2hLiGvWqA zy}WC^lm<6Wmg@EbJee?wF{d+arv5hz;N8W1XSnCiX~?t2uh?)Jjxz!Ej$kV;bmEn~ zGcpuJiFE7mT7Ckt(sRCL9&fI-yRuEV&DSZ)ZUfPWfFX&f<=BtEmzbR|C$^u?fygkr z%KPQ0>(|@jz?T!h4Hs5y!*^xh2Ov|Ggzc%)ae$I+zGf;js5PlXNyJqUfJ~ErL3Rk@ZmlV@!IG)lS?_ofWs4hY zmWq-xB_l(;xCNr;&g0xlEoHM6Gd1bHvOwcH!vVN551Ypt0Fi}$UoEnB?n-t(|OPO=As#-Ok@C(l|Iv70z)lFA|F`eX8 zRPc{+pa*-p-k4q*${RoP8Qz$PKbc%XW`?mdQH8DrGAlfUeNA4u-lHChZ4BC2lLR@= zjc(xXb3VsFP_Yn(HGk1UMIXa=nurNh9me~Iaj*i zqODf-=xs+hFwqfp!*{#2m)}5Nk~ajjreB@)`(xRc37bZ z(!VlYxhUzPiIm|q(e)*+mKDfQl9W28y0d?iWsuMt>Mc>PQO!-#ec!^Klto*@9q~D5 zm=@~QFT&)oiR+z}-gUBx3 zh?m-ZO89bW(PMXpKajWlBB#iDRoYoISoZYvRMH5!zfA5L4HkOVw_4dPO1Ignu=PAr zsgy^M;ZXcHT)**H<3k~r#J|aQ4_pOb>6vc!}O14?)USOoc> z=nl(pmtn(n)*itCF^tHsgvpwmm#A%SB{%}Gk*0G7g+b3U3S^H8#8A!4Qe&j`iU5>p zT9JUnc8&bW)=LX>kYNQq0wx5B_(W|rXgzxrwI=76pmPUi*9-wTb>b3pn;R*~m_VXQ zwRG~pG0H6ovm7UD?`A)HRJL|e*5R0!;rfglY0U-;Y!`*5jSnUPOfRI)7kB1qx2FTC z8l)cUXH(y02{<_21v#!$FHQHvL%8F|6$?lNu^cA?E(CsP6{q(ZXcgzVlTsdcAy8>$ zJJe8`E}xaoZ#d$XOXg2Kd9c1s0xlqbU{2^O_~r`ue`_~=;KlRU<6HmlHSu^KPe;VvT~|FNKnW0NlKP*>B3~JVdMa`EVXJzdF1vi zGq0GX%*Dfe4*?D-wl+gLPaC4t&mhj%P4leRf06vw>+F1AIH}{$sn5NE+We7X zM8>=G(<8im6B1f6jiN|gk@uc!Cc@O1IDLa)qcw&l@nVfZOslV7wD}ym!96oLvEf*2(WK%eimrb`t`3 z_&dY177fiWw<}8bPr#7ajbN2d+bwrf8ruLcA65hcW=fprmr@n~8Fu~h#%hPa^jP{) zfhh`mc;hyq;Jo=1_~cAqfi@tEA8z<^H$g7BrB?G1VF8IqFoGoru#w#5zTd^m+V31pzC zudnaNK`_{Tx)j-uTqY$wolN2Dd$mxnxI11CI+mpYqPjVY#MD$AKjQ9MdO~1Q)uI76 zYMYshEBL52LAEdpGTBsTXz%aBf)r3N5syJJoTaw1F-RW+_Y(QgfT6Zo-D0M>FAXj> zww{|?D^>bseY;0`chjm70Q>~Qs-g|^V z2;fho9|_rRHjSc3hrjPsYS1#?8_%>_X*?--veZZV0CX98;8xykNbS2ERXnFpx(|uE zxysc1xxt%bwq9&MnrsGY>Hj{AyId{-y-RL}?w0=H#5bHtejXmz;YMH%-vFp~A|fIt z&47ul%mEtpP&0j2iFvr1ua=$5^euFv>iJqMKjTQtUBgpRa-fpFb~ox|-N;Soo%z<} zucl&ZKeetg&RN`0S0o&@g0iG4s)DY`7cut{&7T(S(*ICHsPa}Irv`#(KW*#71;VpG z#%9l~I`Zr&c_(@`375AT*@aoR6htW$ZPu)G$#^_*QNPU79UQMkFSTUm=;=dY@*>&A z!RGTDfGI;Up#2RIYqk2zFo#+RtoXhpuu%@-Ec<#*v**nm0Mm4hC;DV? zha++IbcEGkzJ64QQdVTryHa%uYFBEE>Ej>`#m`vXm$Amt7N$|+xbV3W23jRG&~7Guujc-KW*O;A_wF(dxYmFlhYBhPVWgnU8No7`@i0dhk&FnODjE z_H%PXp>~oZvrNFrmwzAUlDhv*Q;RlRfrc?wUn8q(j}YFNY_FG%D57~*45igVkO+(h zw6c}F&(}PT+1}*c_c;IFK9{vP4>1q4o#t=)ryztn$@e&i!~qimUnMOi@PqG@l+sMp zp6Ev9XH_&MArPb0T8^iwSk$w3|17c(!Uo8*Oy@Kh>hn&GQSCU_InA0kY z8r0HP1(TwGx0*zauqL6$tHmxr=uCC7wMVw`o$ds)Kt$+JhPU1)!pkwWA^Mx-vd0sP z>Bk13)J#gF2Fx$glBNoZVoM+cLZw9v&L38VWXyFUA~0Nx^^!r2y}Z> zX_qcrXs?F2w{-2&Xgv`$pPB*lRw3H|zM%>X_n=91{M@?%>IIo9CM43owZ?K29(Un` zQ3QPV?*j<7Z@0E=%*@^I<;CkirPqI0)9N)EMl(eU!l&ww=Y3zYYhTKAUk`vK&ql5vyA7k99i@ zgPAML`Mac3iuUOT3kVWoO6ZH0tg8D_xQB`9KMm?}@v+n9gPOej^oxaOt;qr;myjfY z-;peCljiG)`d81Ps@;!+vi9fMUBb7fwuSq+^$BL1DCrUOCmXoQVK)Ea{&L}A^Jsl2mUw?o}YF9lsEc+TAa z-n|LAfK3S9&P8?=84M!&?mS6_h{5)^JS!Sn$F=N2!N|C!%l$IKt0 zlQI5DeEbQ6B9o^YuYaB(+)q+Ea#7yXM@$WHoJye%W{!;`pkMCHg}R;7BQS#EYso*0 z?ECy|%ONB9R`^E_R`!p846|B(0+bfWXc|SFMrMnfV@1>)G}ZM)c)*1du{I~lRQ;JlJ!!4)qK|Z$&pt;Yov}ly}EsMdz|T2AXFQ>Xp>_`f?XdNXalQ>c0w-cIiErKIeX zt}I4iTNQ@rz8ePEr?;%?NJ_V94Sk=tQ_>o~hJ0TRdlz$j0F400v7YN~VwPJekmxR} zqIURgUE`an)=qXN)yN<|uVaWIII70$#chjw7XY;n%&2|_@xFJK{=H+{0ki0KB$quP zF?<#u?gs4MX>3%McR=6}&&lE0qC9ed(nA}SjI8@Bdi*vSH->5vLk0_WacJI$_?=OF{%%Q2 zbQk43J#mPVSI%Tw9IrsN~ zMNFF?0+cOyGa)JX5ZNV_XSwGrX5`rLUzVp8(mAKhW<$4AI^2m!6rk+deG!T%U9YF4 zfSwlx;wKYRMZ5b+6~7$WRKEH~a+%)!S={;ZRHNN~##;KmssVY$C=?aeuDv#97l0H2 zj~O_G>WGdy2SXyGkxQ;7D9RJS0s5}Gh?>fipx&n`Gc^KNK*ohxh(5Lp@9)o2jt(Lt zYmR3t|CY8CWju~U9%oY}$5kGKFi9qc{k6KbK0-O zv7H8u8%%85w$aA6owRXd+xgG;_rA}@y_wH!%-q*?W}RytYudH$cYH!05^@bL<+mbD z0g(=Isn}Tsn!M-1GM5}Qv#+hQc8}qZ#3Fq~3k#ag3pAfxabey^j=2F3QWp6fMQ&Vw#FON*uqgY0D zYYF62ai%LKfHCl(PNn4DzR%XQuv+K@|Rh$R-7zCMNxQvJU9oW{w|FI%@# zfHfE$&C5RR^7e#sdwc7dt5UX5U|5IcNzrOucuRb$!=5W8K&BErAzx1ddU)x^P`-yn z6-I=`2pA>VWvQe5jAAop{f+bMkJ-nzf2EaEf6h34BP;Y*x?`obawj8|9dfT3r$W&O z23?`?-^#;O9oDVBvG&tZ~}@}za6aG*3&fhRr_WWHO6pQg^xQD@d_QKpwGHRGb%XMmEb`2Uth%3`W>gb{F%qE2`nhR*1_rUt*37FlY12 zyUsxJhCwxA9WqM?AduTWez^~cmYoQS&L)q(dPAs??5qzR9wsK`=v9)VuXK#tX%;75GG8? z3jL<)=TPZ4^zRRCJ!4VmBEzT5e=y_?{qG>ye9gsXex70S`rfnN$$ZdtZM{1*W_^PC zHhM-;T}JH~gUZ{0E5qe4`~a`=u@+gXIak+kk1WTv5@MoWQ^Y1#Sh+0)irRTCG`T=$ z2ED|a(O`Iff6u@sUdQdAsA-98;X zE;oY@8RWCT#oo3p%AFp>BsyxI*3gY-d?H0Kv=bCg!TdS8?6seh5?g)iDfuF2M}mol zk(284hQqVJHV8?HDYJ=7TTPITR}kXPi`q|JH9rm%7Q63J8KF_J5WiIM9DE)q$4=## zw{rxlV|8|;huoOa&io>7@r*tWhCi}+PRbTHXC@YqC3rr{k7QB+VHvYbC(Hh8@_oX* z39$&xBspq%Es00NKr-=U_}}zA?uJI6M@P}O z9rV2C_W`mG_ByXAJOAxh8EI+oOIw9fTkju(W&Ouf z+-Le1r_KcLuIV+ayeW9GCkaFFp#0Iq9o7TRgdLzdc|v1jWB)JrIbrm1!zBpDXzh^Y zy5xyEZ$q?g`M)lV8^^>dH46I$uvhL#@i^l}4|qXI^z?XNp|7k<+*fBs_dlX64 zR>ebXi6B|M>mU}pg24X5Mvma`T*|D(rL0IcWI3T|zbehj+{!MCx$6U4;)-CrMfJ!r ztE^k~T`^&|6QfA}F7v)PuOoO_AdQ^0Ba#!v!~}8X()gRQjI6zSzC+-s#NHJh+_CTT z#GubZkpmhdz#CIO86|q zPdD4l!y~mFFTsKVAP7FE2hXzO%6OLPLGH{R`fmDBntKwFoHT4)^O{XqjBYKlj{3s* z`O&m9sEiQJREwe-{(}Zqf!q!J74d=M5GCCCR7Vft!b&=Dqw?}`IHx|$Q{Zke8P%5Z z9ZX$owR_kvaPVtO4vB>53?e`gt4AxR!$h4AW;Noy=fqI7dgYyt?zyBoCSn0!tQwd! z(Nkewhs|F3s)@x+6Av*@94e9|J9q)75!!67KRz?iZd@^BU*xl}099= zBlJf{k06p#Ool5nC5$-u1w+H3j_y=lP#c>svoH|pe{T!FOu-ONPByg9N)AE8;2Xlg zKkitfQ+|`>;0|KRTqRB>E7DN1L84TXAR4&orxXsUkLgwI~=_tuT9aRji_ovq&k&ij%9(Tt`CV zJ9Sz?OK9Lm5vVJwsnD;lrSG>){bpY%aj?d!ndi%*Btd4(^GDWt~db zZ^|w28Vv3rvl7X4jBn7q*2M-gGq)tDi7VLq!;53MkrX1>nDz}x7?2``CBso>@Tq@oYi6j1hob~*Vj}SS?*fhX3o#r1oHRV; z{Ix#bX)aKYkXxXI9NGvt=<+ptq1SEFLsWDe(wf zE0$qFv9^x75-xUm?}p#YH!P~dS1{6E^LSBOzAYR5xg(~Up)V6S&_smGSRL3aPVwis z^aR9Xb(#M>#}?oDa2Sypg~3mc%6oeCXB~s=?MQ~-`(wy{^*gE5@(_^%#rH%FIzplx zbK4Q}=UwKhU)as_xHrQP$A5&ES77cb3Jc}<1!Yfk>d&R*sb)i@802<*VDw#{s*H-c zga&B5Ae-o1I3cJo^zVZuD8wuM*Ot+@!A9H51vJVV;luyzA89|I(`Gt7_D3-@D>%#%!zaZxK`z4**W0jwo{}GmmMZA+6nf2NnN&YL}{_hf= zCRloJk6HcsVD)ntEV_G4gJmi*IW&j!^%g5UAO#EN6i8Nr8=#l{uJe!f8?-4A>yowm>t76HXApfYNk z9~tD89AIk*f%Tl6H#dGM$FG9sNc8|K*Ry`+V96pBr;d1Gh0&zxV_9p=vt z7KA*bZAEAW(=T3x)uZ`CP7g=nUDU11WF#-P6)4|4=HO_sJKujskP?S|_**6OWWUreMv4=2gLNFu-kWI4~NZqY(w zU(1vj^DAL^XPgU-ud;75UT;;f-}CB1`^&CGi!mRjQFFw|dxVpW*XfsrwDnR=P z7I(NI;SOuc@UaVW$6`TIh}f6JYC>s>|Hz-dk;m@&OQ|ZVe1Ib*M)0LVQ_pMPA8qTC zq&0-+>0t}vw^*oq_(B9~7~q*y`@?wb0vr`_?7G+fFOMZw^XmbeNXA$(`uR>+^M>w! z6)ZM?KV_NppR>!Z_E%_I_kE2pxUGQ-;lt*6X>t-J@Ac2&Q)EWi@EJPi$|Z2 z@t&6gLldzMyX4c;JLZm^eg9_EJEWy);;e2K89n&#NiD~Am7IVesBn-#CZD_ZXpXS9 z;EiZnJd@57V4OoW^ZUsKR^^%adHUO**CD4X1s-&PjyPp?aB#PTs%Stp?&`eS{14m5_jv89A)W3U+*ZfGmO1QZOUccF{)>w&p1Y3~}%t z|6+Bz0*3>PO??ypDTh(HA|hj*8K?9HB~s)*G|ZbIM~q%FS_@dFNCtvB}l>rA-?B*8I7$EKqh3e*w zr~7dJ*!0Xly^H2sIl2r|da1$>tD@l1P8C5D(a-^fQqs&MbkI!?kqPumf&rZdl|E3_ zzvojT`-1FBxkDRW`|9GA_W4>zU7IqSj@=)ohDI2+8IK|KRF#bUq-NVUt^t{~@OgY? z?{oSyMAQo2oFvj?3|23#;g*#e7AYy;J*56_EM!;6_W6<&M6ycTp(2v^ti0+VEXswlK%2HhwQzc{2l ze@~-TFaThr>v8k7IkWom*C8o*K^h|+%&nByTKz!s<4+&>ktk6&0V9I`TQfSg33%P? zC&^oXQV$3EGn|0`xb639T_X{&x^bLqN@L2{@4r6GX`#z~unmRjzv&o!W3D~&ByE79 zLtr8Ze*69M*Pc3bsYGfk1D3pTz&$wh9Afm^VzkHi^Og^BApUR14=ypWPmxQocXbC0 zeFNLu{^fN#MhlqTH2(bb2VeA#qMy$*O<=dG6?L!{iFJKEt6C``tIF$C?nCo)ia%vM zJw^TOoV|nH#p`@oJv0xm(Us{urA&!P^xahr)hP|X6@pv9GUoaZ0vLdgCKI%7S`ye> zL;<0oPms-cHQ-{2zBO`w`D$i}rLDIm8td>?(+tC|cbw58QEhU1K*(@n^orffaNCEp zOHu|wJJzHGPztvfc(|fUbC-ylec0rFsEpQiK>}=hrx{P0JvRxNVPLQk^T5zK;Qx+* zq)HSfbIdFsLUZzt9e5w8`8xFzQ~og%X}I^R!L|$2iQA^GS6WZdmm$j+%v% zyRhiEkTkH?l4&?b9SnQ5f|KmIMviF&8o*!SZ5U<`cFdu(E}I?^Gt{M;c_ zW@SsLLtlM3n8?VV%7y>2N2V)Y70@`!fEK_!>B-~qFyJ(K3jhz zROxGcFoy`t#1!s{S_pqE0V$!yZD`Emh|C2&ASYb)?CRCfF^$V#94tO%sWW<%0k+Espa1-=Hr`!>uEgL@a zc(DxjpJi);O3xLY`+@m`-NzKKMx+^MUvB+}vqxz2!f*@zlR7vAu1SCb3xnF(44*rs zkAD2`j%0^qUqF-bofIP=kYlj`K78|D@ON5I^!T0QnX94rGHXQ79fyILh^2M(&2KxK zTt8lDxzHud11%@Z>xn$eqbmxaLw3KMtwi5qn%Kn6nou}AZGngip{zkF1sFmusxF6x zQmB)Ud3S^Il?Vrpg$u~QA#YNxQi7GAJkuY%WxkS=XQHUd|Jd!+UkjhFFKL6S2d^Ut zf=QM_4#CS`N}3qk1TQAQAsUgI`BLTy|9#XK^um?X>s7P3_oz5mFbe3uy+t+aT~#$4 zW>xh~(r$%iJ$Tj6x8=+A-vb^`?@w32ihJa8CfM`Z?f06?&7KZ6i_ckujYQzaN0sB( z_sz?9(*KG*A_|Xu6d!ZRl{CQj$4m5PT3KSBz9@%MLMuZPamw9G?JpN+Z^@!pINfO| z6Qf7J9qP1KyY@rupYpo4v}|4!)^U`26hHD)it?bRWfw@HVAaV}`cwQ$a44v!<*>}c zLn{XvEj?Cro>zT718${4n8uUp`Bl{Q&FA}&LY74V^1v2Ay$3Q@6mF#v*GEWP66(@b zcB!TS0$HYmcV+ReOmQtWG#s5wK@*fAtQ&Z}g;c^)j>bJY9^Kdl>{g#g!c$wPn(3%E z;_KVKVn@I9CJvUg#aMQENOfRlYXiGIDNvw=*^1W;cDmt7LGzSQaY@h2t!LYyIF5G` z(}Y9M6o|SsHH4`Z1-bcYfx3C|CUIJnB>*`TI=-e29nDg&Is;`n+U(ImdZR+^iYhkg zE9u6>)8z*ToBy+W**^dzg^TXEN*_iWc~2!%M2>Bg1qlDb!w zr^@Y~&y}sc4|sI!r7D8DAWm4h#Goa`nlB~VkH0Q+;RSgAQr0eG@bgw@<)_noZVQDy zFRzg8b}kD}cU&3l>Wi;)p@6j1jW9rwdH!=+Z}VRbRo0Z(Zl4UtQ}7s(D(vzma$gsY z<{;;_v$S0ku2J6)#ra*ipUS ziJTGny2A;W|J)f3x6BuDQw! zup63JPfAJY=JKigE5Rgn#1ze8ZV{1)Wb!io&(bBND2JAW`rdI^o->N1GM^~e`1?_+ zI23e|DoNn40Y5#>qE~6h;4eE*C@%Moo=+0{ep}LcO(e1BGWOPHVz2njbs47nXC%68 zGPK`9gCTCeT$VhK<8xrRmoLEwx?ipQ95UwaZ8$%D+JN_P8B?e=8Nr>A9FKS8D_|E$ z#X27UxYgGOxe{c}yNjv=s+myG_++!1h+o$6JR4#T!a!FhVc!*_ ztD&AJexYEKTE;Br6C8(ARrP==MDvjTR0J9cBu$fg`et6Yn3C7OVdZaUx5`=5u=F@| z{(JXFQPVV@19iLjBI@E(tm2P2Ky2o^4P~eNkWE*yitk7BBP&|=b-^~sAogU7;n{6+ zgrj?X`z?PouyTC1*%d{8Q=TOVAeP||xg5B;;ao-n)epMlG}b3eefcMaFvqvSxnAZ5 z^$&`2#>&l>>f-`;oKoUfwko=DOK%(0DRLyPf~>S5;*~2pRG`v#b@&j}@=#3Lsi)=I zx+W86koy-Ep}cjhI`uv>!hg3vuQ6@S?BsOtR$qI~KT$ zyUlj3H&?y*WHty>v+$ZK}6jq^tL>>uUaR7y9MF>>UdBSKfu=JAym{6Vm}{V$xV%4AY#Q zIiE`tQ3W;DBJC>7aTp!uqE4h%W^uvhn}*ij69fwHa6|ZimG7Cp_}dX5pE<__t{!*p~u+?Cu!JfUG>;7JOn`*QD<0&u5NP|ZVNR*t$Tmk7gFOF5q1xdP3A zxXUPr!d{?~D`|~7FHh+k4N>PjstjL<@f+@BpuK`8T=F#^?*Tf3`#25bLHo%6eWJX8 z!Q2P&F{dZE4;2RRMY5{5!8eOW-ac@#d%KfYA>T;;*-V)l7igrwvqG9-^-9$ z$-eB?Jzo6ljrxF|c|XSI`t8Dn$uo#OQ!1CROr9edMZ{AlMuRgEMf~~j_w0QcUoTr= ztVx=$;dqq8a~~5S4AGRm>*JAExzJ$kMJCN$dvW)bJ)x_s6sp#!3ZwZy+XG1&VIqJx)oJC*Xk&W#wS7=+XJp zN^C6Q72S1e5N9Jbc3_O^E_t{uk@5~Agq{VUOHKMu9{#sNzyN_vHBV04hgIy)GiZBH zGv#W@Mvt(fttU9E_l}?FwSz<<3#zccz<<1kX^C%Z@6aU zvDt!VKM^1;{ZITlP7jueuM&=2=O6N$bmbDj(w(lTM|Pl8oO7YHisn`H@x*y5k&2Ho zbuN}>Der9?*{_(uJa1N=&pWM2vd=HA*5 z1@W5ADux~$HW4>86#?QQ^a=50PzMLPNe&t zw{7uX2JQ-=bx*;hS8}A|l+b&#V9(r<{tCPjQ1e33#>MIYZSwzFnqaV!-@JRo`VYiG-}H^2QF{U(3-by_QJJSGO9q$V*wxAToM`co=F$2CjVk7tI*Nb3 zY!Sw-Jg5kb<}*826kuE17L0fq_6iit;P>1yICh+JDW3fqTaIG2Fx|tegtmKe4Q<8& z`(-@Blz&7#OhU$rT#;xix31!?JTq_vJzk0G8h~tJ1Yy+jZ8IB}022hog9ka?pHbR_ zO9W~W{>5HrzfWuTz}YCs|MZ6iZO50D;g%J{37@Uk%_Z6sE$!fNE$!zt1Zr(AT`_&Q zsx+%~Luqz?S#IG)zAo>6J#7J5=BF|{`K$Qhphew1syNc!{staqlAM3nV()%v4tg_- zAv2c714F=~;PP_${Skzuy~af4-1>IUprL_Rf$uYI0v}iJ**b(fTXlp3LchrHROYof z3@hpjsb@*Oa!pw1nE~=p|K^11^Cl6Y4xOds-f7r?D9gISZrQ%J$#=aJ%kObL=G(t! zhVTT22|-u0Jm@kJ(Wbwf!c=LJg=)$DJ`_}C9t$p>2gmxXB^JqLpL3t(0D2iU4;ust zgD=H6P&*+w{*iXPddw2tI}XiR3@5jFC7jH2ln_`~ri!fqYEJtM%<`7St^nvQFVMvF zUuB2(VZV-x5ka}lZzf(8Woz#ACFPou(ksf_2RiZk@ir2wF=IOFoMtbmJyP<7Pft(u z|FESfO5M)3_@>^@grTW8a%-KBuDH+tMLU*_%oW`NT_E6YI>{@gt+goH;23CZ_@smo zL?T)RES9ONJu$QiYvQg~tbb2`nwpR9^GV zZc1SB>O2Ww;y&Uxd+DEJoXoE_*(BVdmg|Dg(|Y~3j(nK8@pZj+CbrYIWKl76x2x$o zH^c*&NJN@~aG?5;&?Ihhe`vh+A12^u!^1y3h|ouZimi+4?|`s#^5Hkpc~z(hgSZdE zPZ;nQ&$Q?(r=tasySBItD0&z48%$4n^5xX0dzieTn9y`8ebD!$#~s4y)Xt`VB2av|~ze!5JTp9UA-Xna&u%>5aTmmr(9LVZswOmOrj_H)-TJmsPoYx2A3AEuVQ*S1mbu-_?CXNvE3Z9XxQl+OD zxLhIK&bEIk;F1pxSSW}n%Kzwlv})U zJ}X!sluX)9*0`uod4+320M-RUCenlGBS&wE&4>x24q@N1cqy(#lyYhEMRxg1v1%+z zH)x!A2$OK3bd1N7nA^C5K41UZcYQb{H|~$>9cpyG_G~+3LaacfVTY&BtI(@USfYL} z2k>B{#G*IZ+)9(ay*jBqXqWRYt7;?1iad}jkA&;a33_8`=ojYqE{Be;!v=!;CMYLJ zT8I-<^vo>~jGk1Hl3P)@E1Ne&yyapwSvZq0jsoPDs2H&3Df^05$;x*^h{VpmTntIX z6!VN!{KAI8B_jz*Mld%~Wu&mlrM`@fZ$8cDU$a~Yb)gMCMd1m(rW%udB8DQ=D2B`W zH!5oyB8fnjWLcisPbncQyuP}|dlT~c<^J;~uVT;oaw!h_L8Tm4yZ7xIS-pQ+{*bYup;Kwm`aX-0WiLSIwYRH|F-Y<4--aI z!l18>v_ExrLiacYhOaZXr6`FXoOd!R^1YL2rYHXf!j21^5)WfGs&! z38Wv_Ft9pYR3<@EpQ{@^UF%lbTGQ;=-nN+SMFz3 zMirma=Hw8*(WI8nx1kgr!!d!w>|4JWaUDGio^V}@l%EvfTSO(Hx2PUgiw&xx4^Q>Q zZ;1dii18&1W7NN<^>7CYU8hxT8Gg%Dh-q}>VV;0scb+~}m_o1BE%uVK0gVb~T+Wmm zbxXz$n$C(`50rw-iEG>fVHYpITRr>&D}|X46!UaeCeImMG~Ms(Iud*G^X_?3W&{i5 zCbFZ~7~lklnUvhzd4k$5BPQ<75s8Qde`|s|p<<=GLTN2{CGsAHO#%YZQ^?EICzDeVKp6r=7y&?<~ zk;8ax7R{1sSzLi=9DeX$j!zI~5r|g`rimR6@zYc+O3PWsHQ8+NhK4SyGY$;b`6aCR z(N(A@)~~YYav2tBlUa4*xk5xZ0@HJ8kDJvPsTI8GjmQCzjf479$MQks{Yj!y8R`*? z`(8n{-tTbUOjp^%NHVrM?MH7-UUN}~gQKei3muQD_mYh}f`P#e*O0tFvcB7O+=SPklb_?JWrD&rLP* z@9!h#$JW$^OyQ?h(kKQqf}N-1-8#}WSnN~Pu*A7#d5DX93$lB^kQP_V9F@>EQ|a~pLJ z8U8}qBu|GbA~7lP{td*uYU)P%+5|hHWQ$}g2vH+(*M&!)SteF-BozAk;%M|BBO(7io#zftU%wq`|NlStJo{xU zp5S{)Jd3I^KeBHX32>-y;`g|jzH&Vp`gdI6%Ryv8IN{B`41c!_lJP2_qnBro3sb?- z3}6dfLP=f>&fN$*4Gu$kc0WUOye^x#-j#eHCY~9KZWuNmuDm@%yjSS8SvAWnR$+pi z{^hHartQGhOWW){t~=o!G>J02aKqr~Ps#NkZ#`EHUlH5T3r@}WzXKB~Tb-n#yBv`* z`O0JC%;3P{Lo|o#H);h9^$OV=5XH+)GHr6WV!|B~$W2!#za`EUuX->73K*Jzk(^ilLO7@iowrGYpS0yK7C1$| z=q5szmSW9T_7x!A7m_9x7h@%Y9419Rb61R_m^0M7j`|+mk!1fA!jOtCEbd?meeMx- z165iU$LZ<`S0O?aLjhbhf6-JXG}r86ltQfW2;$rh!owAUP)@L7$^LGQzX$5S#a&+j zGE#B~SY$qI@K+Zs7+8XRvV%IJdCy&OW|2V&5fuIpV#^5wb{v3uOM9q-&jNc{gc#`N zfCSX9zbZKE&mMiXgu1YDS!UjAA@B1~F>bt7D*ZJL@UmZbPoS zk|cJ9u<(pR)cEx#(vX;H^(8+jqJ!|DGz7=z3!24WNr#cLC*&5g`K$M;!Y7$VZ?k*r z>JwAVYmy9{=Z1jKoX}g{QO#IyY!92lldVm)x9^<``gSus=vLEi-?6Y{$xRX=80W*~ ztN7>mC8`|k+MrwKV^|EEyN-@nqV}|s$2=1Vv4h6Ogz2m*T~8Jbd~|(k z?v)?ov=DEoK>?t6)gJF@S6lR!$MqJwp3_IapId={v=pIZ#dn~wlWyy~pirS%wD|6o z`+@ikZs<8iA6{=0-7$m3>Bqt8EnN0(xD6XL%1T@YA`w0#PMj{5IcIOsSJOXw--t&e zJDK~CKxC8_!Noj!bTY^tNwI%xKQGVQ>9q<<)xEx{5SKuxEiX#{GMhSydT}Fj?~=BT zyCOnx$ItIa3mK;@3C^bgW}^dZY^s{{`C z!(7|LqxkzV9~$wyHgYe5!vC(j&Iq_9?2EKC&C%cQP}Sg|c5+_E{DgNv>W z6h|4wII)qsnzg607jKV@AN4+5!nKBJxbw6n3cpDpfHkz(X5mBvMk7#Mx99YBW!}|9 z1!$r90xbyVw9&8UYwC^+oa6W7Hc@26LiukLL*elvYAW>IDzQ5w)0=~Z9w3SaI9H+n z&kJDWBO;IDVs&8bn5r9tQ6bSTPF|Qo5f$X}uU7tR66s4y9jf+*EY z9gRtifXN})_dAlDc~d4@4x@iLHB}0xCP9B2yuL^$&#*R~kDfCQPNIu*HC(4Qy<#LE zBnXro6UTrQ4kwqLFLvCV_ab8R#T@eaB;X^Cr~7JfH97HXH-v4oV8ipK29;4Lf1Okv zB@EO^9!J_a5~mRQ)o=OZL*KeNV%_;+QEtAF+K#W?>KJ8doYCg%yarcwbXo={Ha$s2 z>npIX!6t+lhadL5T0#rYI!SdOR?AQ|1M3tzV$Qr`yVmY<2jB5SrStw<&%oxpO#A61 zr&jmWuRg4qYIV@-C_Hpf%N;GGY{@mi-eR`uHxb8WC0lK>< zG?m;P)-&cN(vF8Ig%jfHwQ zC_JI32AUtR^RR#bW;u?U>Rc?4ON|RB(pme*8>R90#!Y73jmp0TZV>a{Eac(>zRvb~ zb+C<v)JuzgDp&84}+OQTx(NiY?t7APIa7mhBeO`Umq}N%oVa;qm^!eOaH*TP|2XkDsW zGT;Ouv;)n~2nYdxjXZ;Kpd`eH!(B;fU^p~92{Bm%(D{uDN+hIg)xJl=P$bY7{uo@G zbq*3vZkLaz4@6D?tGC2OApmgY#z&T%Q%~y730}%N=669US{NqHyF}ic5C+PoW_Qpy zR#!h_1S=J0Tv~$s;zRS)cg0=Ub8a&;zo>lm;y7w~jP=k$#-lMO6USjciE%zkE&7 zqySrU{$InnA%vExu+W#X8<2I>|5l3_qtwAwwJ8ugQaM&ww((WT)Y39)IL-R8v5xf) zaDxOkM`#j=NXYv1(?8cu9LXG;TyB_`K$I2C5516)&o+fW@~NlwO*zP~(Ev~$5H+l; z5dYdgvXztua&5%1FO5p95fdwT0ZI$Z!_9{ei-UT+&coXc#GnYGc2e1gydjJ%&?(Jk9$(Z}{;5`3P1S za`K5@2n%tBkkMSv%}*EPl~iX1*vGHB*X+@G?k)bzOStT1+Xm2Sv{!#{&@RyQx{V#` z`#L;V4!NJ>etc`Xy(i8cK)(rA@o!QdZwu11Ks1wME6A(C-0|0`i>X-3?mza7%V2D3svm(M~p)WP4*fE?) z#QM>iSBRRR6Q%gqFl{XCPB{Q=8r!rtDqxwEhI^jjY!XLK69JwY5?5Fs5lM`^6v+Zr z*`{(b5hkR9a@@O9K7LMw+e2jm$L>etCLkga(QCGSd$gD;G!c(wys`gxq_R(HIgSJZ zG0%+XeGsShALHuVN^WK@gU6Yu%JVhuTfu#hoNCuN@rjsHyUDd7nilq*Cbe7?W z?P{>UV*qn!+{cHp%nA)l;e;%5vY2Z5SV}mlg*`FNnBXo7p%Oh!YP+aE-1NHm2|rtI zAn@Uxxfn_(Gx5-AmfkZ?t}f($6^0~0bEtJ1Y-JlbRM6AS2V z63M%uj-4yvh~-fDQKc6PPmMF%5%`FE;!^16ETMGd<~2>PpZW{FWF8UoCR-P{v{EZz zAwcTj-lGX6EX8QKF{s*L2U_h-5`yNafvi1mShQtybCd;h6+BWVXR;3l;;y!#0dy{q zjnS4(&`eD67eFl?Es^&m%P^wi?K{q*?bG9LINJp_Bb{8iZN_j!bD~PMoL6IYQ>{gDiBWI; z9aB_!kd){3nme>avqcSwO>17g#YGp@(s zVX;wh2o`H2fXA03Dm4bxMA^ZwMqG^M)eGejLeEH<A}scy4mLZSx4p{D(6dDfURnK=BA#FI9UVgK6$A&#h5ZOI_<`gWIVx(N^X0M@$fkXhMxTT+euwobJOc48{LS^~ zf{?qx+$lJW5nmjrrq`kbeKFcPC;M89HFInJa4zQ-Mn91suW?vm^Shitin`u$W$S+% zs&(MvTa!{!tfvrh+_vGv^(y43-TY>_Ma0p>Kk+gT?H2g15rx5BrZbaYywf?68=IGN zu(7P{s?{dtLmloCaM7%~z7PvdR3PCNsJrw`-OmIliSJ7&Ms{SAzzh|=v99~hd^1Hz(CT+TWb<|o z9hbD`odpzjQqi(>w&9eNq*T7RN;NM03H$x)2d-z>5?0nDCbun1TuSrTsh3Mq)I#cL z_|^1$^H8&Bq)_QL*b2A~Z0BRhGFu#{dBG(SxKXAcruaF4MZx6hpRjf<72IT?H7d8b zn{8ku6XsD40}ulE-i3w1Qj8P?bJzz5OxZHfwqiX9DzTwMF*7HPd- z{*`=6VDJo6 z;`zxF;09B4LNUBb36i3Zh{J41x;K^-hgIWKkT`qV)&cHBP?{F@J_jTt*^tc31f}Xa zon|A6Gs3&TA?YEDca@xYjJ3*xSQGm4k;0UqDw<|z5lZrjisUf#jpyME7nhS5g4~Vf zg)fO|596G_4=m&a*OVy9m&sv;*b^?pe`Tka6I=j^qoRNS@-do-L^38U8Qgb7LEnV| zUxL{gqTr`ZJ_X?GTg~sE5J6!_NFWp-EUm(tp<#gtqbjxrhA^Xib0iEgbf|S&KCRVG zZI;bnUy-o~ILE>;>tYa#WHhFQFhw$uEWSY8iCM$XH{;_)kEn~aAUxbfik?YR5wT%E z2>VClPoE@_E;O6!cBdW6hxd6lmyb=fA1pa0o?Cv@81g&a+N;!1;$@1EUT1Mlnp|7;A%b`326DrL-ZQ?rBC&rX@Gg?A9jj z9K+#do~gHOkY$xr+k(aMB9AzzxCd5FDkXVV6=9BM+#rJ6>w?Y|1BgTF1lEO>A!vy73Z($>*gTVFTjul~Va)1va^LTEPH812z9H8=>< z)YR0hZ}jzcqi13#CTshXFwR8-woWg^C5sK6CGL_jump!z4pAbI2*3%+ixuVGxF%;xTr`eV17$|Y(TAN=$0uC^ zu#<8Y;NS`enuO!1K_&2$HaK|);gc9pU&BUm>3sLL!CtcEG@%R~J)YtLs?B}K0_c!|ySoHs43fChR0;$5BF%0<>tD zPH^)kP@|(pEWU*!Id?jAX9}N5o<60#HE)0|R2cI9<|o{SwYWl)AcwdHHFJ=a@x)7+|E!c8dC^-8U09oz4)E?c~jLhHO58P zK%uG~t6Ub06uVHCDjTvBOy2JajNS@8^3`w>6--ZhEk*pi77z(FJG2RRfPA zT385#iG!1tpR+D)nMg>EKPUfz-%9`>T-E(b^Aa@JJX@1}VP7|G&hJAUG{i&eOkg^n zFQz-7D`V$@rj8g~S<1%Ht1!zWHGOF2rbjUkLu=(+12^&p4j-)Dq{bt3Lg8cSFNLom zAiE|_vME!o@L^Qv+XkyM-4^ z*jhd~!{CYE@-*0sx_MvItA4$3K!$g0dGigthRIUty`@SW7`+WexsK%PtjLh75aG9%y6Jb=B(n6a@k-_^yIlQ-0|YvasI$A}Ce%R05e1o^px627w~~8?_>Lf)*MF7T(N&qdu0JIzix_ zKiwFAfg)Bh5B)blDutQ83M()Y9jmSnHt@`2?J28g_tZ$eQLOC`_ng@SA-?N%0W99k z20B6~`=ncz!O!=5gV%~vj?%u9bvQ0A4f>*ZZ=_2~cq<~`74&YToCn*5CEL-w_e-&Z zClQ(F;WDy<$Hc?AT?lzf0b^r+P`z1^W(oId?4^$E_UNbtQ<mFreY19q>bTa_hyVpFoZmL$cFn5ytR3q2FyPq~(w=?xYdJ|ksGl|cc%ku> z*SIiULMZAE!A7LH9WqZXyA2>AZLsGj*~uiFXiEAsVXfy!O7ulX7&QE2gUgBtO6&5m z8*R9aya1z1(WpU{Tw^pFN6yH=GMeu5Lag zMEdb98*YbI5qWDsLX4710%ZbHzCB=$9z(L z>Brm-%>PHzSqHV%Jq@@}+yk_@1lQv3?(P&R?(Xg`!L7KvQ@q99DekVt-SXxA&3rS- z-}mND?m4@AcArPC3~yQi5U}lrk_5LmtrzjDlzMJEQ+J3Z={&+dK>P2Z=%Au3J4sq7uRqYLfsEf^XbHLL^Y=- z&;K&(1W2zD1+Oz`Qpjb?;DJyl%WA9Q2o5 z%LTLyFgkRFjf2k)2tO+NLEMRLfynM0n4P4%qlV+-(zrxO4uzjC2)Cx&9r1$x{)g^k#j*CwLcT!Yw(7V z3b2U{;mrYnZxM<(DcgcW)fXE|{LVZpy)l;ZlgXxTYHHl$jy5@Q2d~c&1Rsfu`X0_! zi$;bHL8kxM=`NG0gSYv`qgas$$Yq!Mtg9eQ8}Y~ygs(cc2X;_iGNqpzORmDGub~rV zWy!4BMM=0xf+cJp&SavuPMG@?qnQA-M73+=%Sm@wB*i7>+y-X+w@Jvr9@kcdxojhD zezBB<lO9(NxE#xB{M8Ci{yidJMrKtp^GmSX_w6v@ zj-C;?8|xAESOgN~r~+HXM(k-8#XZ^MVkbmVZ0Q53J7?PKYlitS%TnuYliNrvBW}VFv>+ zG_`cvFTW+NNMs%54u=L#*#rbz`^EhWctcqr=?*!3_vlmC1b@RqC94@c+{B6ju9`A) z4N7Uft~Va>e*=FkU7;#^jaJ zSgBzZdu)V|*!Ap_vHLKetF>o0^C0etyl;9*so%deq=B^0T}hVi&rt~si9YT2b__2J z-}y8d^1V;M5rA~W{mui3UbDydN?0s}eAB`l-unCo6u{S17hY=uZdj|c6MpZ6lYRmgHP-cc`Ywc<{fEdisg?{&nTVw0kbKSmB8Cdz~$QcR1J|O;&nYV!=ge zyB;D~fp})p^_)l5F8sX5AA~@Cca~UDt+xG_LL$_eKgda=QbNNkB^FGO3x6@yfN}2Q zJ&H;>D-uLU0HPv3;d@k$FPU0N-N$Ro9v_qwib~0aQL`b+d}6T(q8PBYe~fc{96A$0 z?~{3u)RU1ZYjaqhx}d3XYPnVT(Mi)tRU|fk;81)vkS4NF+!Lfqi}KQv&n83rLZ9-B zOhK2=UKt7tMezRV{tJEqR8$?Uaz~sy<_S$xtr$E*l4(bSDb*c0vGhzjV9qT zwnQ`AMxsbG+J!Bs&I1s-90_GZO*C)Gp}K80Yi zF{+|}Zk57BArPNUC8Mb{!Yo+>whY#Z4P0!CiQZf>1ED?TZdQ2ZvyfVQwKv% zG2epNG2Aze*e~n?C~8qDGs=m|unEK^?0sRp7X4nzw4&CsSZC{r@bSQ6$!HiQVK0$6 zYvyD*&YNIXxgHS?wjeoif2_3!8UQN&SEoz?$&*Tc1& z75dhrx$gXr`f22Ka~M5`OR9u|;H;`ylBeQAnHHoTUb)hvPK-}`z9Qwcq;gS1`r7|z zx353_FAKxeEIU36pMpi{CJPag(k`Py=4^IO(PLwJ)3w{Q$r<FVQ%p5@ceQ4@r`QrHgtPr_%qxAmG0lwSpHyjC_FMUnHee*f3O6@ zg;3wzpqAsU)MkIwn#0jxx}oA;>CebD3nwEuop@;lq&*^FunPt`%cA>8^5k&(%gf>9 zw33nY_n)?Y$9^ca?=%Z@h@yg`(-X75cb_M^Zs3`l3<<-Aj>xAzdL2}V|Ky!#BWu5T zfUi}kF&#GFR%fNVVmt(XZ5f^LTw73oI@Vh@a@6XM@_s`H2~lCN2ntYT%6hI6S5Mow=v*hJ`-R3SIsElotXqGHB;D=Zd&l!PZ^hey1t`_hjVD29CD&DH9d{** zqsi2GXc2n;&j-a;FDaf10W5F35`PWlH`EuVuf^LqA*}F*Im2NI5OW7wj59Q5=k2U} zKK>6q#(ivjJ2`2B0mT@C#|x2wOB){FLF7y-%E~}SBuV#B9H=fa(gf8V*m8s#$z=N6 zTU5Q5Y#f*VmVjxJKmS_Wq~)*Ta3<&5&d{PW0I?#lawtgYe^&sZ2sGmI2-+j$u9VUd zD-F3Qn`AknWP(-b|S`naRX)19Mpo>Q_So_z6zCguZAi66XZj&iG{u;zA+wKZbaeB)6lIH>>s zW57}VqI0ww8awqki`5NA18B4ukaiKC+)dD){};TEF3e+U#Ub^!+1Y+|HHiI-lv_&;m0pP*lN!dZ&N4=tmdsOb zXNaaG<5a%!I=q$Df0ApqoRA&+7qrcirF)jGr)RpN=fn38zG<(aTV?T^e{9kvQ3eUP zVzI<{Hk}4I0X#BC={0qc)Svh9hVgsq zBI>CZjnGJ>;DjTN^p2H^pir1{znfX8OO6iAnS_*Nef#cR*~5UVvK77tcmm|;YbxM5 z#ar~Mi;QesO2?G7av}zQ(JU@NHtE-)*R&rkj=m?}~QBqDvOo3`> zV=yTKaq-oYEa`ko25;dNX;YR5qns$@P&HpIt|vc(Qs@7B0gRB9#1Q)42xA$nnQQy& z_(Po|e;(&I!i>iQQZZ60s3e1~f`2bl<#YswNPYWZGczog@n;)@aXz08ZbF`21;R!> z@hUYx#8Z#JLvO9`NB#PcD>gTBTx~aF2wi|_{x~`NZ*ot3ARLu9S^urU2Nz9>2Ay+1 zvLPY{ojevu3$0N)0vp+)Fd_aam6?Y_j0Y|q$@WVSQ5=$({6gO_5~i3ur3ixh6?cgx zEKN8$r%QwqnF(d&=Jux*W#xDk1M-rhK0waEFu;s1p%-H&RC`vabE15qXm4owpP&_= ziKLBYL|T#{eq3r&aXpIsk9ZW?AIzs}`)Eh9T{OpvoV4_EEW}GZc(S`Sq#2RomhyOhAk12XbN7@?K z{nv=P&d=(Mo!x_6(6gmb@M(>_dBsLi0E8vz=X_v(?^}g8PgvS4gau*TI2krFx5eNq zD00}GDA<>0Ki`|xX-99rWc#v^0#NLB#Fr`f>hk-~tOLA30w=0K?d}KOzE)qHSA!?f z;5bhknJj&I3~oFGi6HDWRU`zc%g>zRS*zRn#j2Fn-d}I;nIb&EfQf09SaPBTBMz!J z5v{8Y@Z+V+$L|o^+U(+H%1H(>C|QaY&a5_aU#%9KDrL(GVOeOCSOgR<|r3*Y(H zd0WosWv~wiQ^z?Om3>R(m{AIJwD-nxrafNGtnOaURzvCg%@WC-&~)iy-5b0nc!`g= zBRj_jXzs-1ZkD;5y9O0Gm;rhJSkxVYD;(Z0rvFSi)Vk~{)S0|bZ{1Up?5PonLz)YO z4qpYO&1B6nzZ!J(1YHXBY=EaX+Ja0@1mp3ccs)mejQJ5JQ)7jE;maC(+XM_M?rZXP>Y-I z@OMJ)sQuHvNj2ynlw}{|(=PM3Q%3gz;13)FW&L+O!xMb8m)NQ#{%I#K*mi1K#InpO2LvQ}1a)B?z;=$Fjh1C+dP|CpkLa9uc0xVHS3RcR&ZLuFd z@Aiv|8xwDv66Oz#b6F|P-n3R^EY2f8_WWI26slJ8xw@rQcqHGmXCLt6a?Sm>M7$Z} z5{ToZ6z(wM;Oyq}8$5!-vDlMP=!wit2pB2%h)jq)u09>Eizy3Vp%s%)!qnhqNMmD3 z&LjubVzcWexib}P%(})Fl`;GiXWNmZ8Ve5lb?E32?e{PAGitwW8n7rI2`ab@=$q3; z2rN|~OqvT;Vh9@R0$>{DYJl7bhv)lFbO4OjG;lYD~>K2!MYSv+5RuR0I5J zKyk(%iAHw`0ASi#PRY+^XOZg0#B(gC0E{j0*NzMIv2tBNtBh4T2iuJH#%;;_WKVhwm1jmce81(u_QJb!Y-8Ki*vEhn{90 z^U#Hb85`ZX-EBNDuQd$+n@l5D&8Tki{f}R8JX^%T#I%=fVr(4TAAx=gK|F(1Hb8<8 z4WNeR=DYUJaZw0y{n(XvVq)UI5v8R4ys}NdX`jvirXXc$bKlP)7_%~=cVtBh2>N7^ zxU%Av=!ro!WJ{U3PVIk5i6 z76GYSTQ6RMj^mTQE)FCo53EMcUoXieW%YQ3E2%c=cS9ahpD|)fA)u|rB0X3t%pA(* ztbxY9HI_K_qF|^@K$39VrT-gq9oLT%QA8OsY%&&gf9YNF!3Vl=IWYsr=Vy7vY35c( z;#Bkz3KNq9f8T)Q#KvNsGL2yP)d?zDYOQC)WgY1^Jr9jD`uoK-aL*KmD{14T*svbRHMYTDp*P);rTm zfmbc01IYH%MAQhX5L7EFyGQ11L=aRbBZL7Hc;x7<>Jz1g0J>w$wMcM)SUDPb#6=a^ zAoK=zASV71qvG((FN!j`&xWypxtY17#G2!yM0J{2mnRC!jz~EUv`DWW*PoFsZsuiW zmM3tsf7$UvOXe?(lR`0IR5cPAwRy;Ww1vl zWpcv88%6UQvUgyycVn&`-0y=1U!DB)oWFm(!MS|rZKREnna^npCyXW2pk<*GEzHp4 zmzTzwU9q*RIhDE}ko|;E2!pUZ%L;b9o0q>lAx-It;T@uojlc$UH<6QcOVRdfW?_W; zxpvCT+8VcNC29y$(6Ycitv$|w6G^DRztUN*<2~jt|$h6coHuH9%!Z1(E^fL{izCO@9!%BNz zOXAwc6L|O?{PF5!V?hE>XV_9lBYbOdq1jpbu}#X9 zSW|5;-(+>c%|7_{_>P+_sTTj*wml=Nva2$in87*O9Fu~1CcAzpBd?J-MM&0cjtgp~ zrHfF<1Y$MA09fJH{5r4%44yB+M3*lWODuT`H}XqT8*b#AxW236NMhCD(qCqC{Ms7D zt5^^stzwEz5WbI#mtg>!S-XxNx zuex>=JyJ1G?fLqBD;zOgC$&)}E>RQ^gTyjBa2y&bHW=#5+HVRs7nv5LK8i2XP^8gd z5)4q66tx6!l-R6fVdPQ4tTeGpww)}$7V@n*GeqZ8iH(*<P?2P_VUPlHepd5x`IB4xMuvOxDwzazXz92 zM}cp-j{h95u>^iiYmml3Mjnx!Q%&q_l~UjOc-Ol>$1%~5|B6Y?@D1BmD@oHQIJ1It z?;omWdTYJA#S0rT%P9%@KR20V&Th@0q6A~t7;&Qc^(p)PK&!dk^`k$Km?&*oIjJIf zIH5Oq%o=rGXa&)q|Fq5Tjz4k}`Ok?;fd8)Ho1AzSVB8x;FV}P1h!h&AobwGCe0Ze& z)cPmz%|h7~q}!vx6?&=+S%08!1?cY&kmPxa z+bj;N4qEr#3;Dl`r89ZIOMp(EJVXW{?{sA?@b4~+>(8y-`d&VcZwkFKd^&c_}9+SU_XS;$fzb%>g)ecwLeu@~f zz%zG3&mfZ1A`syK)>vDME*f{5IBmV_PG$0ms~n00nSs5?a?z!;x#DBOEe)cXM|b+- zXuoE)WBKAv-L1?NlI+v1_44gx#4$^R;m1!Gt;{XZoEJb~+@<%!?_Ro>{Bv(;lI|!h z5~J86BE^s3rpH65G|ht?@DanMd#i3|r*~MXj%|WQzKY5W?ru_k5jP7JJ|hfx zqr6I=EfjW16HvRMSK8wWrp^_<7?DJ47F!XX#avAuLV^uA&xUV~7V$E1h&aANwK2-uL z<bOad1;kNLaIt*Jh0h%`Ff-i z<$?F@Q;lqhv9)M^C_&&Icep*0aTc>o4_7Zb(zwh~B%2KJ*O_@5JA`jOz{l9yz2Urf zAcf|MHSPptDR_~E9}^bw1dxL{<;vW)fKg8{=r=5hDp zr=rvCGQOd%3y`>M#jr5cZQGwFflcR;=$TV!}g zCJL45A&&NPkCJYNq24Z#k`1fb$Xex)&+r5X@VvM!NLu{hsw7b2@xA^tukT@jju zdBm@iHfzOse7>%r86TO>AVJ9?pJ*a8nnR6gw`w;!GUisT9l-hB{ux+gqt(Bt5Q4Pw zA%X!cp;!cUmpiIG9Q!jBQ{aA={q2)LDNPlD^KVwHKif~qPr3V*CF_=nEV3=#2UMwV zVH0sePzJ9V3GO<~&%zk)cK$?m7&tT=82Pa&SZZ=Lm8@VU?-vmLD(^1Jtt``}Mb zA7Xl*qxvoQi~oU)$h{24^{ot_$Aum{+Af3%nhlTfKX#}8ebp>7+S1`aBH zNOXVYw)u$l`ftpro#Lh)#t=j{CrutzDHd5c_+hu^*dg!cN{c0fNUPMtE0tB+Y*CiE z(V5fg zdi>)5B3!p7A^|npSmKG3fWyO@24jtaC3%PM!{YO(!uKIAO)-Tlo;wRKD*U5f7qiwM zX+uEBY-LVE-qt^mPtaAUgnNIHpK+p*e4EY{~QJ>#Cubkh=JRK5&XQTQ~GC~F6s`l-JSE?#8&~yuC%hfV0YbG6P+r^|YF3o7TUxWEW$p``of+*CZ3lGX$ z-2rgH2Km>$J;5bTrsiq&LNGE>qV6YIDFgIlU!v6DkmM@I+Zsiu-5uK{hyZ_C*0|40j#QM;&*wYM6}Q}T&n~Fz-fYVI%0Rfx6}fC zE{`i_};MuTvzc`cn{ur5Sgta+;a5~c{pa?aNcWiOhN&ZsOF-( zr1aUBT_G&{-=GF2|KJB$CSljJl-hUvZjyK0+o)+)|31VF{=uD*u>339qM@dyEwQdE z*0dU3(alQoFF%|SOsrFlEEO7DhV3Om0Z1h`y}?bY!K$arulLz%0sKR@DYVym^o zk!-Lt2W4VpUK8$VgA;b~V@%DcxUOZt-auGBcSVd%@r~=iAUAK1Fx>`zBQIzSd zfr48Zh|7~9{R2(j@)L!($QQ5PCR~Lv*Prvac!fEzBp4d>PluZBmziegZE8`;A!-Sh zCFLpO>SJav?F>7BYlP{2K>(+ltr!mWNiPM?q zioCT{xEOEcH}Oi0f97$LoKw|evK#O6v|rlPLY}eb3NBgst{MC#k^P#v?sQw|zJf!) z@BZgl-=nJX8S-Ls(HYG&ahT9=rC79C#j(Xc&n-KcHRd?JviKq6u%+`wYNp&@SUdTR zZ$1Z1&*bWarVUU9Mhi=5==yLag3p$oZYJ2$rna zBt5DQ<$Cj?peCCOsB25oigcM`M+;)}7|<4@0q+u6+WwG+l9AU_;u=o<@wa+RW{Vf$sQM`6b__cC+S4y*f*9<3kwCz^T zu;kcmK&B^D(ejW-urYEyIgB(#3X!xTzeMz_0I#4}WMFxMrgJW)z~dZLb*CsjNkv~L!f9-Inud0u_1n7*7d zVItOqX~=S5B|J4;17W2NU?^x_-s2~s(A>`7z4XLR-vkzEBqSJ3**S*cCukhF3|HmO zK0J^*93{Id0yG{Od5B{$g(3#I7!0rY`KH{L9^I}fTHEwYMUiiq>YZ|PGBW89C6N-4 ze=aok41p3lJFW0Rnc)O)^)#$hEGd<;)JKifO}ERw=0e}`XB3tWI&#EN0juN?1iVWszU(D)-`kZHlHF%afMvWf#rdJe zHZKZ$|Gqv5ltV$d*&AX*IQ*EOoM>|V9#*>ch%O=EUEhTH7rw1$v~&Y++Ox$PpOG!Q z^){z`%JK#7qih$?ho-#A|CqHe?}8A7J{FF?>ui6#e%;cEdnZJ64YpW(w`|cJz$d(_|OKhCAPCGQkZl`-DFqfX_SXH2+_r=GC0B7`z)l0Qe zq?CwdG`&jO+~kX8c~pgNoAL);b%h{$6w1pH4e2F5GK%&|K*PYMJBf$hyZJ6g^H=E; z#LqI-F#Rn~db`K&s3Ix}_x$2%Ni^j!UkarYU+`G-w$1vItnoJ7wT}=?#c_hB`O1e- zR8)to<8DH*^Zu^ovnBu*u}8>0Erhz~EsWvS~hcHm_x~eRt+K*KPC3PP-9=LHS;vZt1-x7%{{G9 z0^$?ESpkGzICmcSMz!jO@_eZJ!~&MS{cY4J_lJMIXG(;4RhheDAI4Jo?^DzOH0l@$ zZUoxY<m zo!qsYaNVCpeyL(cezGH+G)SLyzGo5mT}oVXXm-j5e#`H>&@%ie-z6fh;{iv&;kQoA z{0`VoY&cxPVft`ir;p#G4tT(Ftbb=)<9V-B5-OyG{3E(Nk78(fKbxhW;OaiMEW0gy zqY~ni5lnV@+*+UfZS&}Ky?`TR`!DK$`>BfzL=Y_0w^NPQD9cam3JG}~A!)SZ{X&Sk zEkpp5?sfZf%Xi@6pZm`M@S{lJ90Z~-pQ5Vgdp!st;2T20HDF48COdq(0%Jyck~QlM z%TC&-XVE4Aar015#Zd}X;PH;+5~0I~GSqQDfhZ{7EoP@1UUx&V*kV|88wr_&tY4+vYtE(F8fB~>7DF1&*Vpm)F(@5H~>1g=w8 z7>GDoA1bjh2XFZ|yjErX@ZB-a_AW-uU}=2(V{s-qJ`+}~5=J$#xvyn5zunFrUExxX zygej1D=KetXr)X<(y1bi2#;#~T3KICCbih9o^9ksYh00ZcP0?6AxCq@%2|g6r4JoD zPf9t)m)+zE1SE=o1@?I&pnSv3s3l$fos<6OB5eJm72LP*(}K3-YK~2D8x-Is(5rwR zNKB>Gw45uh7=to zDr6lw8!#}0MHTN)O49*LhDn1}s48JLh|yhHCdd&M5B)ZS(Z~eBN3~a43BB?Qel&n? zPni5e1g|FMmA07-@Ac9=94IWOMcGkwNK#6a(}dFsq#MY^$|sbg#T@Z;{zPa6GoaMB ziImQw41^;iZa#eN&w`E^v3nQ5TY?->nbkl?>cRbs1P?yU-3p%F!7 z3@I81PGHI;5GVahwiH%}LF%oa!|)8&g-tyuZeko`desOIPb-Y;my3e>o6DHsUcfFs zn@QDqnj9)V0l~c#jUrUQ=lDRY@O;9BJ@3HD^q}QneSw~HPGu!_`^Uvx_ewM{s#HKU zc$}!vjFZH)yQHe{%OXxLxag|TMJX#N-$#YG8!eIU^x z`q^uua@B${#2xfY5RJH?N+sZys#FLZ)%#riISriN%Ky#6{s`B2k{}K)Ir+2PLl%b( zE-|se-Rk-ao(V*uiCR=tgudp`Ef{%wwK;tmMBeffB1$_7vkTWmWg(al+;4M%T3|*f zG>Db0l4bB(#C!+{5Zb8GFLlT;9}Sa>U$$T;CQ9+Ldb%@O?D9pW2B#-KZ{Gfqnx)D3 z?VrU5-c_9Pzg&?zw}@?!_~S7(Ysqfex&~o%LvH%(0Vw4r|EO&Kgz(zSyWGvMjRn*! z=rXn%X4ACHCh$m5^0&vjbL5TKo`i7qa{Y+>UlBDV{wYEk^kYluQy2mC*W;(p$yPU#%E;eJYQCN&FUYI7aRXoV6BdgBuzS$cQAd^*&)D-H@9EN(s0tC~@xlq01 zM#E8e=qIt(HENCEq%;~p^22v=nat~Sy`j5Gx4+<1g}aN*k&$p5XxOQ*uC9@>qJ0MN zsgLNzo~cj%pqnS|@vV2L^^Kp>i`Ax9HL@3!g5PFOTdv~JRAsA~U9l8c*%b-X6H+m) z%HmRislqc3uF5%_{RJi(UrC##(3cWYVRC%>G)ZiblTMir%=0enmS)j=M~iZx{76)@PIM^|*hnb1f4*hqQmk&T2v!cz4Tk0pw|;jRAE%MUgCKPF7ZqpXVh zY058S79$Vma;*zuI(DeWV(_>12R_j{V?JpA5G#13G#5%)CE2n{~r95G; zSI)*RVZrLR6bGAj5K@Dqd0HRFV+qtoWh$PKX~*4sVL|JeliU44VZ8Kbl``< zDzAR7%l*uTLVPOUk10k5aN!}-v>${OefR&gN@m?bD~-iZev_Niqv}Q8&utui8OqF8f~s!hN65BBjC+ z?4Q5gd^Z%Y5h5vID~VC5W3W$GgCAkr9e?t8`WvZ*Ntw@NZC|HTBecIuILLnpQfh2#O8)Ub$P3DO_ zuF(S?JyOQaIyNrea3NxG{^^FrDUeW^DVFGuSP>h)nXUG-j}7omq;RN5yq&{~Kz+z> zs*fuL3TnXvCmxp^7f4Iv4nNi&gl>y10nw3; zj3C5Gn)r(xa{6SI-o|iIGe3F@Kzv!aczD2glU;6N1jI$M5>sE_Y{fFRt)=x#9M)A5 zjK;%5``Ci5OEw73w?@dcQecci9(F2e~!}$6)jqdR%<`!Ubz041T%hHM`Q%Qtb{` z+Em#vgF3DNJA0RD9lp}CGKlJ`TCY7Rm0oMAY{tz#Ar3Ahz-iD)9s?#tmJ(8mTwD#h zdaD!)&}-4t(sP1^%zuXpBRF9M9HKSzPs=2k`sdXcbZ3>wrO#QiAEM`p8A7VFz)%RO z9kPREW@JFzW#1reKH2rIu|xaz18Fj22T04V2@vx4Ar^u4+X!ZHdIrNV;*93D9a;_5 z*6$PIU;o~2-n8HS^O#ZaNJuOo8)~=Dv4 z!SA$q$f!uB9__ ze_5_fqE265A(;s7!c0TY1Seo+JCJ<}G7avvBL`r*+1D;^;I=6k!J~I}zNE<(>A=pz zgTU(*1ILhe6X_PeT9!ylY6U3|=oW6vW zS9qg{i3{|Fn{Y_w74eZEnNMLP*%uhf$$#&-V(Hi1qO|Z|AC7p~CgINd6C@2tp?kcW z(<0XaU!g1Dzd0%*-w0!9P|+MGW@cA!6xj5CMWaZLJ*aG9*xWpc9>!2SU{GI z|3-2OQ!GWUEK2_Aj1_`@7pCj_+jdr4;CmLgPu~Bxbt7i|$~bt3&ik-R{b4Jl;~YAe z>vx3jL6p3Oejirac3Mq;s$^vKU>5dkk6qgiVE^ztZ3NFEhjcK$AS$Aq*nowqvZYd_CCigru&d297)ABrMK=F82;Ky)&Hsg=}Zm-zJ zuSyd0{vo~ht$1Z6$m+7|c8ZUT#Nak-$#Iy-qu%96vFp+IM9$E7Zz!(ou7v5}KTvRq z$=@qt#v1+3G>F%T`nK=EnAG@kvm0Wj&bM6sPj(ja>90%fE#ZHw6&gDd0T=O?$OP3X zQ2R13;aI<9k<-8#^5c;4JHt9PWN3Qb>nI0a->1CWW9HJ(?YzqmQUm3?Xxk$tCbTj@ z{*#xR>pvoh(>V-TtwS-^|2v0$%yIavg&_y0D*!+{r441dQxnIazV655|tVR2ng?-=~W$1_!H>C@YzH`y%uhab&Tt4Tjv&P@0OSnHf5F^m$zhOwamHe|4vF(LrZpplpTyOA*J z8Q>R&OpoFrfHk^c0X0&%cjwcFMfN~Cm)%jkCKO6_Y8}5Fqf<9xyZ96I&SwV90;Fg? zQuV+&;1E!Kp6wrBN5wWs1@!#LmwAttfOQJt8V0ycfz9B%T zsKO(zLUb$ktv)kN?5$-*G+CDc_I_w3JXJHsXRKWQ7%-4dh3B>vv7>Z~(JnIgokt0k z33_tS5GG*w+IMSlHRSNu6`udP@W3p}gY;Y_(YONty29&lzH&UqE-<7pnPTVtGC&Bz z+4pIOC@2o!SO05Myndbz$Q}RI84K}H-(^_y5~6BUp~JNib@U!i#z9sDQ!j3WojTn? zNZ9kA2o;_Gsz=4lkau&8R+=={IX+<+9TI~+T0C@y6BUV)6#!zove{%LF zsofO$Bsm=V^<{O>Oe9f8oqiCWr5&E0LvWh;8H%g$FEFR1>`UWH84e8YY*F%{coc<3 zwD#AhJ{5doW7kRE)yc0`t^JTdvLN2lwR5>zcrdF^F7ygpv&dJvQWzJp1XlysbTil! zp@LjK7jTT=8w_}z`4xL6SFC}cQsxL$wCQtJ6imS|H)~F~n~$xTgsTXn0Xa30CbC2| zd+KbbQaC8MTszS}T^fOyY*)wqN~dq*Ne*DK#28jMM@_dYaN?s~_F=_Ux5*I;dUQbj zz-BUvAEisC>?s2(q6ME>jhH25^Ree(k7oiCid$RSu3)R$UKs24!J8{36y9CicN*C_ zmq9l6L+Qhgfg_B4f%C+aUZa-v^$qOnW9OwsqrX6`un#!NMR1AgZf-Dj!+X*^a!!&^->iUp`dtA{anJ5WyJ0hQvSW_SOdC%K5+CLAI zDCu+|DH(GrKY(;lXt9)cm?YX`)B>ra0WWkpOWmPAtVwFu`j%0ElvBuEO!aidgoD1j zdn97;JN>y|B3=YO+ipF461_gETy_tfN5f@z@_L9-A0-%DN4^p+J zUcI#FQj2b0{b{^k8T2-UULGbd{eIRsyb<+~%Y9LN8PEu&C*G(8n}e!SkS zvYu_dT@7wUyZ6=v_@429@}eL$K0JhH`*xB=mCM~ocwYg&roGeC87+zp;dXuh+Uag- zIMv?2i%dmL%`!Bx^sLKpxNo_OO8jkc*V4o&{*XTbWCZ&n1w*FDe=QD)U`xaJ{?EihRo{_BY8Az$R(?E-NyA z=lWFZ&x;Z4GTSu&Ewe`{&r%_eN2zKB`(BeDH|6Xn_!0bJ^p^iJ4Ls4UP*`uk^w`0 z<{Qu7oC?(nW=_r_2x?;GmmLA*8AZU>GPzo0eFi}^GmuL_av7CUr6BT1y3do<(8s}Y z!r0r4eP!kT@fh1BqCZ9z;6#gzdtnKt$`&pN_ovv8R+rB1ArFODn&4~rPS;mS@_JPO zS-nUwR+@BZVDZ|r*bIky&TtjX_r-)qgg|Hs($CQlEN4qpBHL84|6c1d7@n!@!2>L- zN>DoY&$ynV1mA!+d)n%bb@!TXRHrQYeGPtR{k9%U&PgJkehHzUb&Bs)2dBjW-m6S% z(|)&F3KYLHl>Wmno&7TLuE0XTt5b#no9Z~hD=r>_iBF7;hqy90TJ>H(3qBbdMvST{ z3O)MzKQaakMJG=e3krnT$&-7-MTy;av~dG5q0FsGWYf#-w%}U!fE!_?!lRh358Fft zb&imdsx2rZfkon+{}WO^oIC5_umdR#~LbQuwYWX@UU4*3k^z6A0~XX zHI$L9N?5;g0W&SDBR9|~vrinLvq|xK!;u~Ee2@)(Nf!$sS-%rFfBZiH7eVO0?*LQ9 zE}cMTJ?zvJK^%e!@y;QH#`*%)Zy<(;aYc&o0maf0g4@4K@UlxVfBFV`XFL;3flnl1 z5@Wo)uZK>fgrA z*0EL*mm~648;>T&BgTfwJ1z9c_`{w>wOZ{U;VI2>bdgi841pN*7#{HRws>s6Ly%_3 zt~*d?2Jjw{_9@y;T-s-Jbo8L0-$OqiE1e!5J&0)Eay>u&y_e!mfe0f``uJC=oORyg zuE=>>C1mZy+N0w6WBI;6l-EZZYp%_qg>4^d-G+yU86F7kH)dHb)AN2!@Et zqx{~hE}%5J?3l;yv|7w=yNgm7;)KG>96UI!0LRR9i#T+sW`|5Vv{A@hVuZ(I2}F!^ zg6{6k=zKrbQ_q5Huc7zezd-)=-xHJ)0z7#5#z+2%PrmDK$vSn`k0iYPxzC`wZ5!tG zzmNZ~|AXo4zDzK^le{!caoQPFU-mof{own^zWO!%No#4|eH+oqrz1~2gG@+z(|gD} zZE6!sNGJERR~J;grm&81tP0k%_Oz3@qc+TMyzQ?^9V``sn>K%i?|tXHeE6+zVrfz) z`|7s|hbjn}5ll`J>X1C|5Fs!{iVro!ie5D$wgu7(oJbHdM;eV45@iZ$MiZl z4H|(d1}*`yf+7q^{TTKm|Azd?#|e}~Mag2+IVnIVWu?A*JHq*lW_ zN3Yq0FeJy4HB;h5lV*n8c)+6#l(fJZPs|{eSOYZ)6$D{f5EP*BB(XqiCa`-j{ciTZ^{*Iv)gK`6^m|>rHpEVodylaa;|xJiAyuIJIl7i0 zakOXa1mC!d+Uf+q`KNR{9fsqjNEK4}14@(X5dEFIC>;feIP9I#Z4pF*uw0`6f=J^% zs4zr%Pjl~H5^tf`1+526u^>EHW2i=teVpF~N13ald*^N3|LPav(jF+yx_|rvwF{s7 zguGKOi1>x27xKbILBzIy+4dkfc*W6yh-f@w;#Vfv^YuNr%rW_eNltw2i332msm=W# zxSyYX_@}IT$tqS~wwlp%M+t@k@-KZ+75CD*w>58tcuY64AG&MD~C@P+#g|18& zUwrYReTSB zxC527u?`}Qv<4gq5#pw{kryeYxP)mJC?B9Cl*Uh{H#7N&KtywDA4zo-9VghnA-DOU zpjQx5WPLi@w{o0TU_H`g_$aPZ@Hu!@+ObR_iDpeXMyU^EbjRpZpRO_NDKFF5Iq-{hv6BJ{9o z=>(cC<5sbAroo;6__tj8l(QJxyd6JQ!bwl5lVY$$kwS*UM57}(sqo!CQYx&=A-4!G zu!#fuc&jjYyf6r3aT&-Y!j>x7v|vxWNuyJzR;%HX3PJ~rM;h0eh4E4L8O5%Al4fe~ z0@AYNu0nGA?e}3VM2SKTML6LI3YcAU5_g?_4&A-Gh|1%H8=k|+&DSurYlg1PiE5fS z8NsF*o*d^xv;#tLE+EfBgsYRg5v=pbP#{x}9VsDX1Ww_sLuV3YC9)c0Odp3q;4z`V zryY!OIHhn-KvW=A1#3G96BC4xm8wKR!Wy5kuhpS*;qwrtMe{4yphw5hMUEB)ih$m} zeXJfT(`nX8GfSeK@dsGI-+D8u~rBz2_lD5 z5Ti+CNFX(_R`l}@gc_*=WSUY<0#vCAQGmbaerA5>_Zj;AHxPO#(iVjpSf7mR6M4vV zh?s4lZrwy>C?M|`RJVyXb|Y! zZ_bho9lZr0%M1E5dl(rh`J|XXuv%)jGQ%c^y~Y|CRH;;sn1SM^d`LbY}>Yt&6_tr zY;m}Uqkg~7jvYG&Xg`V$Gh13~=L6q?`Qmho(ZV32jT<*UB#2nd;_>rNLlS1){L;q>j$4Nq9iqE$JHf4>iH;^P|6xZqs=ziY1N&Z)he8duqpHaKs*%2U@ar*+R=L{W**WCRHMXh0q$O9aaQ{LgAgmloFI4#qOU)2jIdG6G!ZsG%C2w8vPM|8N5kMXNCQzB z3J=oYckiVAf=l7;@1QKe_PX>HgfmUDeS1((Jqaf@g$hwOUPtuK*CUoLB^oZ_twl64 zbdZsrcowdivo>^WyzW}gK6eAzOES*1pE>;2@j`x&0CgR>z0pwc%Ugro3|{f#;kqhpWx8Fp#u$RHw{ z+{&ik_+?Ce8W0@+-j6bN>90Rw?~_YQ{KC_#dG$dcV)}+@IPeZV;df6sroL9acopGj zNIsi0d&?}YaL7PXUR~w|cfWv5|9ca=ui8y_TlaAAFdlOJZywM3|Gu7NMe>mIeUhF8 z5kJ>7JUsk}i^;8Dzn-(sI*Z$Hza4-bJ9a#35OKo|H_QjUo_gx3hZPCC_10TyHk%J> z*^d$cU3cAe{NW$|;SmFC*O+sUcU;RRO;#0Zku3PZHwTDj70WRw(o_XFRqyz8{D;36rH6H0Qv~;Kq zsU%4lF(?ZnU8ld;W8J~~_>0%P znD<|QE4S~uo2Oi`f#0klvLlgop3cM01 zFA;z%C009po?)%Td54mMvVdcU4$(ISN(2lHj5Wtt+e*mokhHY)1IK~of;>G$I}GTD z36mw9uqk~nsmlg=nsKOWc>Y`8%yiP=^?&(SN2rx+}u5EQ15=oPeA zZy}rAPtcemYIPoRNVL3gf>uML!X|lXq3ok{%)sWvQ4O~|!-?B(WsMCH(?_btNT1Y{ z%WAVEtf5{1?hKKhQHS^UVeh|lv-IAx_hrwfoIWY&z36h>aKOx8{rNW@-f7MF^InYn zcNXjY+jn5*W*&HaSM8{Mk+XFD$G+wulGc?^dQdLV7G0g|V;!T6@=9LG+jtvLX&_cS zX$3+H!glx{I+m_$o^|Y5l*=W$t{;%`(Ae1E;y?gh!{qtjE|2Dn(&nn`LF?{&LA3pW@HP>A8pzrxw zD$`3}`qFPIeEaZ+Kg|C9`|0=l?AWn`$3On@-|+YFXv5YJc0Ei}uC3w2|N7!Mrqlvq z4YDFHLm1#Ak1ztX!7D>#EOO`PnLhtwR!nYUkPXnv;?hM_(xJKT5*82NPJP8$MD_MV zY#{n99Na@=)e6G;2)(>ZjQ}MCnaSxiR?we5$n78h1Xni#^k9)(HBsd>B97?DkfX2t z1>`Vg^i}^2f&{yB7r~96BIu0a%N|xHs6dfUAE5RpZ{)J`*74c9Ze_QWX%yeG4Z#G{*Wc@Lq$h=|+=ASFT?v?(j0u9KL;5(h3rAf>`dO&geO#@H;y+Jb&q<3Ki` z=Sx<(l0^xBc06VKicy~1)Wm}Uvw6<+QlF>((eHEKt6t4N|LNP9Ur1TCrb84a^lc9% zC5bGVsB1oO?WbA4ZVONPv8Qw8wV%X1|D|L%-bgmppfi*l&X)Q6GNvt?{B)znAnUWQ zH{gswGNKG+TTv7WrD8%6;Ozh(1ZW{Bl_DILl##+FV+bs&+r!rCh@gf_1twAGw4z*< zNIWURYl6a&mVI0+BrFue{xV)j%5s^qD9N3`ps>~;gv7cGi6qO?N`x5%6w0HeKoup{ z3v%hvJ|ohqvQaG^H4)(BfT6R5y^Nyf2*MDHs4^3*t3n)o2|)lR22o;UiZ(GS=@7sRQ&JO}{#onDqstjd!GsPkJ^9!q$>Ala&B36AEQOH?sI5fxQVP+7H0P=y;D-18 z4O@O^Bh7k^tl!7jfMM1r)-lnl&A8qiizoIIB^{!;fz%pzG9$+n10*FQBQZ|YDTY1D z;WRoL$9Rasm{z^XvCn>l<)cT~y0`$-3s7r=FRBo~G()1XSq9$$x5ICQm$%^8|6N$J znVliseaF9TjBmSz!ELvE(_;lIRy|-4UdLAQ(SrF1K&i$;gDNyscy6@R;=K8&wJiC zJ!YDwyzOmoJJo=Ey(Xg5={(3e=+S`3NASM>*O}md2d7+L`&Nr4H?rbs8wgqrRKJgN5;N!_;~K4v7h#qUGnk!4C*$b2 zj#Rn|?n{UC=8ofwA+0rQ2*Vhc8nm^5#7Rd|Z-R%TyZ4aHE^$U8U^t5yczmseEQgfK z16Kanb6MDV6aFn0e(^PkfBp!;;k^`_HV_mRfvfC5(Xet29A9K>4qGp}7_OLs_x?F7 z4xuwf-&9j>W4idTj_O-nKc#Fnfh7_pDf2~yuhM^ojF7E_K8~gjFg8Oh50Qb!E04k; zeSkL0G)5;;Km!eCH4=aH*Q9@`P zLOC+;NtD2sJ$%%{r3P|`B*DuPDI`n%f?j5k8VVf}2t`|X%Cw6$mQpo1lofP`hLuf0 zIUMD~S&7)XiBBIoO4wFByEzJrM=2$!t=o9*|9m|k`rG%j@$9py1&;2}5Lr#66;6kY zv;r1}DZl=|-oWclO!MSd{0x`B^-s9@>c=y7c#b3IZR8WHx3K%zkaS@g=L=raYEYY5 zVrE343y;o9L=cb#V3a~TjS#Y;&6L%K%;g4YbG$bgCGj@H6&3qV>kiHj5PeS>3P2(S zh`di=Jp++Y`U0aIsSy~jC?kziVU?0zWG8EUM~)*|u?o^2A{&xp&_P1YM+}vuuOvc* z7(B8tw1y?2DhcDTVk#+%^)bsqgfNBxOB{msf*`1$q;}*`252Q9&LNOQx7s4MbM0T7;;!FIrK0$IRR;>({LPuH46-n80&t z@K3|9DLzL=30AD4oH_QbA4n>~snrj>Z%c_D8Kpe&t+ELO!RP~p>(8lG=lK1E7xQA4 zS$+Vu>3ap2b2%^O#ixtY(@n&q2W!@>c~BGarZ>HbR;$H}Ui6{|Guks7D*8KXf|N4WdOkeoI7fuDqTy@n|-`dpS$}4&M+ux3J zj$3cNm43hfApOHP%aHh9#bq&U&~U%`?o7G9iVeDYu7?}F#Rba#5U)TgUD25UTm*gy zgg7IRc}Cn#so!!VM^>H1n(bGR>lj(4IB7A166!JW$VN(6;)e?ix(k#=mHw`UN5ziX z60`@5ifi)7zNMxap)~WYm8iXNc;EWdj?#F&45U= zyfBS1b%JmNQT7m8p+rc%CzwqPOFBkKffEAa8lq9BHa(Bj3+Ls6!AcZH&6}INks;n{w3Qr_876U5ASVoezNsUDc{%B^J?XUYie(|Y4zz5&* zr@ZeY*O9m2c~OmH7i{LY-uMpEtjAgBY-ZRUVqyPQ|PTXRAWRz&; z2sX-5GQo-znM=Y@LKxv&;}mnpsRuFH%5lW8X@WrDLq(BgSP6kL2;&iGw6bJcuqYFH z!xG~K3uTTSLQ!jB;t1PlU_BJQKE$aAyLv{%OSJfA%R!KLL!INhH9jxi3DIh1T_c+lo}=@lK=B(^f#VK z@U*8<1Q8SkilWLyi2_vV5hkOx{bKC-7vm(DlYfAFCw?CD=GPJ5a2Z76Yo5;-UT*HfbF%rpXoNgi>RZYbG_uu~jeZkSA zNBQh$Kg)I3UB}f|U(F?#T*B(rtI=9BJw45}*IvubH{X2f`(OU@mp`P1>fGEMpZLTl zPEE?wG-YXNi9LJvuzUCJQ;CF86!DtZyoR&RI_p8lc&LE6Z-jQc&BYgA%#Iy9Fvf7> zjW_bNr#o zOo=3d_9z@b!bb17Wr#^e(EUCxFQ{+W2zP!8 z!T_QgE=!S00yUhmC=I6cWZoi2MiE%teK#UfjV*JA%llBnlsqtKB3xFYjUiGJmQ$q8 zaKkR9)ZqI_sc~M>n4hIA45jv%C`2_zvF$O!{sOVoltQwgYAhW+gmj*otPx^$$a0hhn_wfyW){RAu5ucz~?V=Q+=cI@0i zF|rbI?pBHu3k15(FfAxW&T{IAbbwSbaTws7C0B|#ib!e=7KP@WZ+!<>uUy60#tWHx z*=xA)(*J_?Kx2gb30Kjb-pdDWyp7)MfS21@8b!w3f+No}rs^%~HYcMX%q2wxkr4#O zk!A}7LXn38nf0pFZXe*ykif(QVFF_#*kPAg2vVb1C^D9pjuMq2vJN9MAX5UB^)dO7 zVKz@FYXqsMp)6%-Y5S0+efwB!3dToP(()OZC|NWm{nRjOVI+vqkw###PB92Vy2c`G zm*Ko%a`g!7l9)s^kPSzXW-R6@3-dYcR+Czid{s06K?<@4qXo6szY-(=l>8|_LZkvj zk>YfWD@tr=P*z~`9x8|kj6^yMS}--Sj=A4{E7|@ZqnjMNvGg1z@@ZfG{FTITV ziYZL7$Z$}g3XcsmUY^W+F<@MQI+;!@r9x8$?^#(A+Je+cWSlV4Zqq+}C%fMFx75;t z?K8(<|30WkU`x;*oW_w?!fHZ<45>xm{VB;CM&Xy|9;}aeq_9O-=k)ywiR2}`ge`12 zrIC0f@k(BKn! zHWh~s9pbHTed|M>!-W@K$SYp)iU&C|eYFX>&zIyfQ|IpUs>Z`A2$BrEUeCku5 zdO#DgdGqE+^>zEv27DrYpf=(=Ipx|OR?qQBpfHZ8(L~iEfwEtQ_mi(;{Orq+QN;ZGJh76fFeWo4m;z%A7K68-Rd6yLxI_dBO_f3% zcSZ?S%+i4!eCTz*#aUs<6XF;S-$rKZ1gZfx#fLF?NoXxjP}zYB2P?)Qx2WC#qeHxx z_@Kl5EHLZNA&o*B z0?Gk!>^>TG1&sh91jDRgZg!ru8PTjY=o>*E3c7ihc<2~uB$PI%>A^SZC?lvTk1Li5 zMGX}-hy~QbI^l>wNlQ6gWatt)KENmgs>&j8)?>6s1PWEwaY=@e1uUmk0%>S)gA#8m z>rOb_|hU(gcQ(B>I{YhK6_%Gku%q`B?gVdBboim zU1(pjb?c>UzI_ijEg7^P=T!|udv2CIvk)W%NsKBogjbN2IN|7r4lM*)Yuuo~4GWak zSnmjQjMd;wN|0ByA@3c_{QFO2RncKxsKv^vQabxUq%{F1mz~E7#E6w2Fys z+c@}_Z)eXxevq-T2IJe#W%J|&D~}#xZs{=2ItWHUbs^6oX+qG(Z&-oczZ>(LzktLc zp7JcRFv9nTXr<`o8R4=eY_};8DB+M&pqytQEaS~OOFwWq#jSsdZF-uG5eOsr!`Cqp zhU{4}$^E-;oB$svOrD{Uh@j0_I|94R%&ni| zu5166P{dp|zX{WmACx4Q2 z&pnrqe)Oa4+`02qs_?04w^Ces>81SmkN-Glo_XfiJ?7}>C{t5YOixcgsJW=sYBU-R zR;^ma)~#E){PN2mvN5>lo_kKYHhn$8^+Vxtk9!=AMuUF8&wcmZhcO1NHEY+dWol~b zQGe}T-G-OUeruT#{}HH@$A07{MGmwih$6I9C+!)jCi+rVPAkG-Q;t?o=3?R5 z`JO*v@XY71?#idr=(I=&-6|Q^IlPuADp`e40x!TiOSM)|lu<;x9pM>r=rbSW|GneS z*s5AwtqdHxi+(tPu1WIV5^=2YNQAdg3{kpH;d2lja5-p?(jneu1QfV1#?)7$^EpIO zQW}qR9_tiJ)DhBvFc=LK8l^l9O0tP5K9EW7yY~Q#gJmxHxu0d*vz|e3|NSf)N7IJf z{WtHTduShc$^N++&IvVVInQE0=SVDwl*Z?lhIG{H4L+F)mK#$*4N-Mk+cvYYV7H?BZV-QJ|eP0$xo&?v&i{ZU5?gZn@!eEPdrJ z&bsW0%*-C=j@x!};dz(wr4v2gJaaG47cu9Vf>;}dCDc`Q&2=Nd2MKbJAv1%uU}H&; zdjtxr0izKP&;~om&^Sz7P?iOqFl69D-YG{p=P&$DA9pLB~7&OqaWaHI z{ykQyklixmA9mf!553?OoOS*sgv|!lLSZZp2Ug;BOeiYKYZTRSh$@Nvz|HKv;a@ng z`%X4@+MIv*1l;u%2sEWO1a<(8CX|3HKt><}WEcRBB2OQdd)l~ycTT_?7aypRcsTK# z+V>}g>7g*nD8It5FvASja_z%Hak_?Ucsfr%odfYb4&nWG(RSf6h+A&C_IipR`#yKV@- zwfLPq=I?jl$&a9S`2D+f;L`!k4eP00{{d?6d&4mgu!XrwH3N@^p zWS0);opT;%JoQJI+_V*?5-c8&m^@>c^(l=djv{JFf>t5m@E8V1?q|n`-pxHXe4Zyv zZREUk4h~O~TZ8CKpo$@Rzl#u-P)eMz)uzEo$|$6Pgg^iSJ3CJnN__4RjTZII+hG4L zPytrN6lE8@LMVwRhi=M%lUBrTNPFdKZaR?hna5ql5B&7=Nf(YWIK0dmXRKoNSsPGE zgXNhemKPT3P9J6F{@v`KImnuzPOCq}g^qZ1C5vB~rkp;C%6kNj2|n2yu>SE+VsiBq z^M~$Xywzs9?@(nxG!e3T#cF==InU+9(j0I2AHR*g@mAipPSeONwMHFPX4s;{hati% zY?>n@1%;!`D?k1`NHBSZj51CP3^Udtq((KzSY>ite@LVQcB_c@n}W~v9BZaVi3XOX z-VDF``q!aH8o0SdKL7dK`1J1mtQ;Ms$TNakgi!)*1uFA6=OB^3RLEuRW%Xp~CwZf!B>OxWmAsP!<&>=!gw5@{wh&^N;DLkbNIJ7iNO-c3*HE+N4 zhj`!L{~hyldwIw2{%_8^^g^zD{&VTnE9bi-$M>>ua3Ad`WcL2uL@pqXOVAn{gpg-Q zryrR&^^ZI|K_hbKD)^C{`;@dXmxn^U%Z(Qz4`6DV?&*l zvnQ~lO_F*WatAeE=_5)3MG1|hvN=u*hP_#8&--}>7heu@De>-4BgVI2lq1~#C5YNM z0eu33i_a&!@p`!SV{}%ngIGe5K$L-~k@p8gfr0Th2VBSvW`N#u2AeOqjFqc5(O$cm zTDwCWM�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YUTjGtM{ty!nKgRwq-ouim zeWc?d)BBFFdti{mp=NwyhTh&b;$~(F7bRilXP_WX46Y+cQcbJb!gB)(g*^58B6-ys zqH2WexVVmw>w%6_;<(8LYX=!zv6Q>-dYBVOCwS$rUQb7@qfOTS>i{62+F2V<)-f((Sb7 zo80%6+vs@18|W;Ri7h%V(@9zM!DdE6$l~N zb>E|0{qn1D@;REd3gsY2quFF&X)n7T+|BU#D3@*9%GCHIGiPThcNWo!Ve|S86oNc= z?0f(zB;|4$AtgGBu}Gv;Xsv;a|4=Lzh@%)2Cs=DSIz@Osejy-eKwm>TZTi%uLjv=>+&T zMY}0Nd0-M8VL>Vg=b_ZepS}4yt~oKzLo;XD(bdoERt{uG{f#P!V#eP|6-bMdIJBfd zniT8#ki;-KNiA*=lzXAzqGf`OT^wJc(+DTE*uVji;2RC?OTfwT*yL&Y{_y{y>yqn< zNpOupuiwu2)F_TlNGr3X6XTeZM_BGkR2~h8Q~k#V^KPP57-@nD`Ma ztEV)4xd|&ASp5Q@R<&w%np0Ec`uZr0kKpWm92^JfdWhN#CY1=^!Rf$T*=DMR;0K6AJAqoFqZSHf!hh+Zah==97e;VgX&~<(8Qm+y3hx@V1}- zHG0>rV&dpwhKG;SUM^#o46(myXx5u_bazmXS{Q9`JrD1jvaL#GhH~+uqq5^?r0OK5 ztE&y6QlzpJb6HXg65o@U7?$)8uxv#ik39T1XHJb#Di81v(_MR6(ERWjVE%%X#-;$#A(RVfk6x|_uspl zWy_b44_tH_QZBXAsI_?TfkzoVHAP2HJIhwAAgaxh%ahiT`r?SHPVou_0st*h4&W$6V!#nu+nrxx z^~D!*{igM-9qfXI2Fz4J=}b)t#k10>i6IW_pjGBWAqrIg=Cj1__*EJ^ze287$GRS_ zO3_xLl#h1vNE72116VT1-kEvs&9apokas~UU6;7WVVQH~Mu2?`WOk-_|PA$SD z7+i!DSf!Dv!b!n80$~k8C=3QA1tQic6c(|lE^ARbB1sf7=OY6kO2JdOj>3cxS%nY@ ztuUeKdC<{GY6C{k4wE=J%2!=SOzCFv-9K&0m8A&o~`oe?)^;9p5^kFT}-9g;PbbBol2v^&;7z%DCRrZ zyLT_fWJ+&fP)bs-r^GQ>VHjM|$EK|p(A&9`axP$Ebb=?IdWIW*`Z_#S;_ka1L`ffO zvz99zCFBZutThOgk|@E`PaUPdr=P)rZjvY>=LJM@$l43ma<-Ll_dQSW#NKDP_S%A$Otxy>Fw_$Y_*8v7M|}gH95`F75%JSzJfys51!7Q9fE8;lrgzJgOgQk=#34%EU6frPadsZzNQ@Mj(1A{XMKe7Km>8>aL|0sg?e3vm zZhKz$v%jvqH~_>q<5UU@2Cn=GvQL_0jt_EfDdE9CKgj&v`EOMcYAHR}^iW)N?vAX{ zY{cWg{y6)7XCKMJw+>UCqVqjL1Y{hEm-BLR}G)lwzK^wat#j0Sq0*`mLa=8gsTGRRxixwsy8a=u!>eL`J>114?K|>NO^g*8z6Oa z(Q(?tW_Gp6M1Wg>fn_|^nPcu%uV(Gf{whOjx6xMY#41CpUZEK_&~Z!>hs4b)ty&Wy zeR{fk8C!6=2Y7Eiett-*r!6fPM-+8TwICd5w0 zJ+NdFn$}8`r;s``9*d>L!9^M}9Y@E(cLbqnVq$Q^5FJ6YcPaIHgorFrI8U)r=b-7} zo<_p@&H}|X>xeb<4feBg&CAI3b@C5i{t8K?$$2?aqY>I>0LvAmQGzQK!a|aySYs&^ z@>pYtlZe2VNb53vc8-nfFF+zVdVG{-J;ad~VFb#Rw4xUEMhjp0q^U)rn5`_(+ug}vdHk`1%+J;-w0R^6Afc_(?D;+lNEyl zIF3Rnha}ecDqv{U0FH1ta`a@TROGrySCJZx=eoGApULVPLy{(7EE3RZitlvy00Dixbx= zrYv!XG-{k!CP zdr2{`&ZvSQ0+w6EU4W5=F>z@ytOBNnER%FC)HPJu=A3htsS ze4$M16*od#>3QWu+|kU0ExupqW`oK9@2{Ep+|7i?4pF-F+|_!j58lJnKiqvN3H)mN!ha8pAXcsP@%$?tm%90#yS zWgr0p2c(0spwbkCAlk5=N4IWf$(!HJri-s9=LF2x&k~1KM5GZ4JTD;CmL!RBq(FEc z2usqe61QU9z-8syEeyTva(13N!06}{8@hXOS`AVwkwCmW zi*%8=>-jzcNg7K=MvrmjRom!j@8RLyk5R9-aD9oe3S%-CW(y=~h!QTItB8{X-&b6D zXobM>FeR%Z#;nO`E+-;(caOH=eRUl5x$?tRWAGX zJV>Km^sZi;mJUR2CpgFtt%clwxxQ77iVt7A7pr%u;DzLdSc4 zji6KnBx${Z{o<_zjTSa=v2hcxql;sq=GLxWe(s~6VEw91MD;nQXU>q?1YAhNCZ1cs zFLY#c!61aiT7_P0yR+Jm#w{$8_Wl(NZrje$6UV3r(5oa&p8+?Y&D*FY!NNXwe6Lr@9*4nJn{XHU{kJ-6nC%U02t}b%fCof~m2e)wW zFArjqa|aP)jBzzrQ>4iGcwyo^vHE!e5Fg@04D;f0uRg*NKE#LkeSV*I+J7R};it#0B>NB-gmwi8GL8pwJ*-bc*_g0hsCu9wo;{Q`C5X3zKmaBova_5 z0CGv@tgDjDRw@YyH!NrGh3nb;=J!%AchhRM(7J&mBvKS`oCJwOk{YD4SglE|!dDJf z3Sw)}I!33GaBha)-qpP4Pyb)O@V6i0U+;gIH!oR9Zt^s(sEP6%v`#@}iH)Na#!Ao{ zCj}u5$`M!u)^kb280iMsBt!*1Ntz;zMkfi8>)_{{%;d{!(I?xHQH6%@5Y#M9T6ogO zDZ)(KDxyPA@v2ShX_*0b-uVav%ZB;ds($|DgMZBE=m@Jpw`Ux>;1 zF2V}JB%)L*vg6W=n3FVpHUTg66o%i#)pSpqGzIKEs5kfFOKh1_UYjJVedB@$n<*jd^r`I8B zg-F+BdipGzFIr2Xl;ewExt$wscqN6RL)@yOO6}CDO~Npyy*tnL9UJiTmME%VtwH4q z6w5^}+OdOMKKmt9A)u$ThsoI)aygfRljrR86zkWmp;mA3$nL%L^z>y$o~vlCP7!WLZ; zzZ0)qBw4mR^ABm&h=UT!b?EF_g4fo8Oj@LFjx%;_slcp=`FyF3cYO5Y z47ByrSeT(vJ&W%G`3`g#;k#WJp&)5u2}n$cl8S^nVo|cGFyiD`KHY@I6sg~V6DOI}>!Q*aN}>?d>(5`G(cgTZB7HhP%kZE4U(9~~lRxl# zN8=+LeEk)qGgAQgLl@Bg%GaUF?S#h;F~9Rm*eGP~3!esH^+*2syUy`LFLAH4+qwOm zuRZ;#3_y6@9{sQCXYlQV9R1s)q_vc>FO9L{XIFghHxS^KUDo~fIyQV@1IkxF(!9@; ztj~jpmsEV151$i&crKL|~HeEP`=M;GA@k7*`4GN_)^Yb%!fzQH1 zl|u(cNfOQLZu}{_x;psESMDKi`) z>l=i2=;-WZ%a#ocpPr&pougc8C-4J|u;g-ix_a7}9-n2!&>%xAhB$WgIAJBCtF4ow zpT|Tg&6?)cFMpAjz3fu9@7P4C)IprF^-dLt-?4) zC`r!oKpTuUq-jdL=!!0-#A>tneYerAj0AxC>b)20nh=6#pfn$ z&`c5nm4{*%etS3WfurQRBFMM#nFWW}{@vfQqOG51WtPNhf%7RcXsS)Tzlgv!f(Y=&)*T0@;K6w+xEt}|gbPgvB!553* zK`oNOBP51={`sk1kEU>U>$|@`_tjfD^MAjObZ#1ewpZLp^?`3-&^v}W`nN})1sLBCM0o8UZ=Qei4@JWMKVv65c_;70IiJp+2N5rY z_!uAK2uHr}b<+<{^TcmH@$B<6pFP9thhLv5jr;&Hw|9;`zr2Tqrxw2B>nH!$NzQ!s z4A<|x{@W@NALC>EGQa$iUW+|pCe3=z8)>z|=!bs)TSq15$f7u%W@BCYW9|}jU4_@t z!Sv(=ZNnqvy&QxMaPlDItTN$9MALz;PM%q_f}uCQgWmR~w89z)NR1$GGH(OzDcTC9 zXFs*6&7$Kb`OZER1O-8^c2JiQMHCBmhoHzHbUg` zv;%XUWrC`UZp|ZuGJbuAMq4jalamytt8BXJ<=oQM&-}z38#|XULrfgSJ)t>4h2Aty{zT^=o-__mdntc!E-?go7m)6o^_4TCEoQ zo;=8wEt|P$+Xi;++C#ljM>#IFT8$^4c$!8tV)N$p^!4^~-#zzm_Uu_)FQB`-m+P;) zl=1N?9(wR$n$3t@zKC)KB6SH{5mE}YF@#ZsV+srm^mFLYAx<72#q%6oPoTA?6~@>^ zvg49V=(@U06s5#*%!3c?rrK!G-POhPC+x8787w&uD5xk(pBfB4=Ql00mKXW5_ zUm+c+%+2C?9=;#om&=?uHq7mJ+(WUgjbP-ySO^E}e(B(;SKttdr{6yrDO4S)d1t=q)lAO8)f{>v|9hjE|yyYC1hzB$(q zyhIE5=fZ>dW{iAp1QTa~eDG&8b)?QqIw`IxQa@H_a_1!B*^r?3d*2Ynb0~W?#uzJD zaXtZk0ph$j<8zs`vWL65``i-G#d6@Y8{Sxpse7k>pz+4PHqJL*_Kjx&L}94F%J-~f z!|!ik&3{@$|Eu~@c||nyZ#Ue#xtl%gc}cIw!_g0R{n&s1BhuNk$U=#Z*SzU@9qYM> z$XE&;9TaSgYZkTLrCh{6DpOe@1_aghYtS#dk)?y{X(f$kfs%AQLJWSngEqfRvo=9} z{5W%?$C(^G!|cR3wTV;M`V3{?$1SuYM3%@lO^me?;lO-lhGL&BXtsM#c6o2K0e4z66wEkPH4Ghv|UFdo%O;smASv+6#+=abLp5JF@v zSBnX0KFA2C#%SgiX1MOUE4lQtZQS>by&OMwlFp6}f`UhyXsWdZ8qJXEe4P_VW_jl6 z!vqDNVmTmeg~-M88b2T4D#1YC07^+_rfW!wo%sYzlXNeHXKHO-kih4kmChehLJchl%yFiiA#ahYzE%m@vgeF|n?age`0%q-8C!>r?Yx zM36(cMYMEKCi@L4z>z+w@8K&&WXc>~wTf50_Vu8fs8)jZL1S>WBHz`A=d_qR_7t~VTE$39oIk{R?$l0IVIw#0m3k_{Th;iUgrCI zG9q}Anf+z|Zy7n;^E@2)xi`j1?Dz455CT;yv-JIc%I13x(EiHT{Xp+u*>%^mkGtOd zbKjBg0MPZOcOVx@@U7X8thBB~?MN-FM*Q;``d`t1PVZ4WR^y?! zJ%ou3DyP_f({@(<(yD)h?$c&UI2C@^`CiJUFWL1t@B?rmnung@?9G1J~0$ODJh;SCV`Z(RWgr!?A%T5j=jgi@n(o;ET~=U#ZiK!Ys*6W56Oj2jxi444-1@vR7Vq%;}?tdCbxdi1L z#%QE;2^@vBX0Z=OkfxekkOM4fs-HcX06sy%zF)m+9YceC?AiSk&1Mtd6RcQ1!06aG zcYf_YdYAOl)!9X})u4Bvmz6_H@O_`Y{w|(){2=vO1JCuj|Nh6BonBz`=C!o7mzZ0a zlfZmTW6WD-k@(_8B^004jw$ny0xo#^*tmxA4jK1uM9E*>t;$!LPEKV+!t=9dF`u^?cLbe;#z|h zJ|-`5_8mke73|uLB>4gckSd3CEmkL)0i#s7j)PDEPgUnw_U>P0+2BeRDhuQsk2FmH z7q3`Ev}PGTcAW0jo9Qfkdmp886oq1mLa{^?MJ$XCBZ^JDu5L`j;-(3aZ4nWXER50J zv7DYQmot3!%XIYkFcl%ZtO}7?$t$GiQ7%6BNATazjoN8zXWPN~ANs^PI(6*X$H4{b zzxzJwIFv5Eipo8=W14lM)5i%`t^KZZUi%VMYC6QBbGoj6s?N;A84G^!ZG+#|IkDm$ zD>(3{2c88QYyb1wAM5;Y;D+-_==n;-zu&l@`_Gw3J^rz#bus_T&_jCVCc1=cpfL5mAKm1Ri zQ-am&>HDSMd|tbOa~|;Rp(jgAF8su+%CordDmCw)QGaCBj{Z z$Sp+VCMy(cF@E3@ONq?~1j@w(0S)1jxIT$+Ne-PPX$h9zb~kTtgtYzj|KKA@h)yM4 zt|o078ubcYxem&u_Do0L^~uUM&}=k`!iajko+q&Uiup2+KC+iXM@|qF zEKw3+t;BI15-gUGuI@5dT(yli{mk_&AME4lr;ac;Q^jZqTa~PWlNzjrvGF_QegFHdrBQ+6@7vKaQGqdB&&CJu@ zUZPmcv3bjS;y7gZ%vn0Sm*FTMtu>`wkw&G#!w>D@8{gPTsZ?b1)-}W?Lgrkgn`8gM zqZ~PUoLZxSqw*Aj9){1HVcR8ZDYbR+PoMY{`<~p77vypMGI!tiFhY2|`iAT9ynw)Q zkiuXSLr19_ts@Q{KFEpV(**er+B!P`i%A8R7#x8R3hCr=y*#cT5F3r-IQW5&F?O*{ ztAQ5;SSe^U8ri9_G5C&)X-4Q~3*XD(I@!tjH;MDEn`M5kbYQ4Q3Y`dAX-KJQ zIdc3IAFof7f9IR%zjPhN+dfJ1pZ|#YgR>}E$8mzpKu(&>wb~JxylY<<96UtseLq87 zo5Oc=XshthNIxK%ID`A^Z^eD@>!`o)_0-<^N*Z7N9Kv;xj-OSjq((RjQprfU#Hx$7 zB9Lek(y~oVs&O2F6E~PVc9?;Umyj=fZz7iO`*aVjrc#dxt1}exK8|0+$>k_G0m29p zpm*>BYMo``C9A+h-*Q*eWa?=Wj5W{s{`J&3RBwNjmKWXn78zUy`R{q{{~t6o4?XiE z&H3MBoZ{5ES0NUwG5;s;p}ek4$My~Y<{q1)dbIkYoB#PZUx|3p#=YEo&e#5^$_AAK zm1l`f%ig?T@AHz8g3c^m7w47XfDHw7sz ze3Jla1|W*#tF(u z8BwdYNdE99mc8fQ2$PaLeu#Kx99`}psMWAfKZ^g*-2^8NVEgijD8UWSQg=dpx)7By zrs_qUyYFD-#ajWxS4U4WA2k`WAqg(csLvs3pa1|M07*naREE|NsR-W*DCYA-aSJ64 zTBqn#;Cg~sYm}d(yIiI^U&HkRnvE){G$`d!D3pnsEz0F~Hf>tR@sr1in<4Wv73%c{ z-OC5L=bi_s)*I9t5svH9))ugN(-t~9%N#vA%7H_Nz_^?qKFi!fi#Q62;t1C-AaVt? zF-W6v9YLa-Sdl3aiA9AbB{iu{Fp0@pf|SAcJoZ0*lqAtydBr98Ighc)QNDV|y;LhL ziiI|kq=m7TGzqA-Ca5#!kWfWO^R+nOULYc>M#y@Rt)vw1p=K$9DMp1 zmtS!a$B%V#_dUCro~k!8Yj_2gzC&rLv8m$z@fESdoElC=u z*uqAq*=*5s3zcc4<6?U@naa=t0>`7^7icz{w4xBt^>950FYz!aT;C;bX)>v)R*FnD zTl~#i-pL>S_ct-H;h9uE@NPy_MEf5;NcDm~kPZkhKRI;@+Jhv6{?&+w9;Wi?|CnJC(11Wo`t#p&y# z)VGYdyL!@ll8g+Uc`xlf83CZCCeFz7 zFZ~pviJol{+@t^ZC;-KEMY=ETe$4gNzr331UDNY&&iQ|K{*M*^Pt(($h#yNDVdSim zsbOhkgVPm^Grq{5IXeG&<8N>Lp?E*Q0Y(`4shpRyDGiaeTMWJTEdX@B@a0smdj3<^ z*ON`!l1NvelaM$`pilA3TH;HSkJ483ttxzQ_@lOh<{X4Qm-SAtVNij7$_Ttu|95HAY|gdx*dL zD!lLSnEJK1V{Z5Y>tFw0@X7FnP3e+tR9Z%;NC>Fh3W@g)~vJ2{l9N;5DHLO7&K;Yf>O zFxO`;3@fDx{2bFMlVJ?Fp3BhSDEIE%$$j_jW6ymD86TUipbR9b zrqxKOH73DWtQ_d$SNozB?7uiHYgSR_>`N((&UV_7!B0p)a1C={O1KH<48m5yc1 z)EcB|1BJmA9;s2Nu!ZG%l&bwiwgo{6GL`36X^rK2xQ>G>o_tZ^K>F0~kHO|=oHX)$ z`=&DsLjK9B$GYA8599gATG6^ihm4JWWq~BA%wl zq5HZ2tnYm?kPYT4JlZ9j-m7|_6#fSo_)j@^$N&1zNJobee!!}Ce&{EPcM*mNZ7?EN z4u}&_Af(K_5(pBVq1LRX;Q1tJo6KZb+CsQRqUJHYLN9(0JfVIIg#fR61v8@~RM(fV zEf<8s2ymq&D3s}0wv3U`Un{U~pH?Hk#5qRG0A zYd~tEu#M3!7Mcu6W@UJ`O_pT{Vc|F~)p7@68j`A%>FGLC@f6Q}{oA!IBbTS)_4>&J@BD zIJSe<8r!i^N>MD7P%7o{qa&b4!Io4?on$7a)ox+ig1*(u8R+k(v%5s4Tt%g@f6qY< z9X>>yX4T zg<^q>jCCv5bMw9fxbJ>HfAH>ivU1CXWbb#cMd;rzE8M~_= z$8|9#L+gZCTlmt&LE-p$0`Sbt4Aaxobar;q(a}M@UT1oGnsT{JM@I*ibyDb`nVF&9 zYT{%X(W>JYyAYPd#1WY>xWxiaM=y~hp;(4yD}OHX5V9;zAWoQyrykSx4?^{NovEoQ zM(s5xL#Lhs>UjQ35VnI+DKj^Hk?~J|oZeqK6~5bOP3@MiG4@Y?ds2yrqb1us@dT_z zGcz*`4(1`wt5>h4qoZTdYjg9blw$Sj)pT`rJ#M?x(|N9lF=l=ZEOp=9_0#`ecu#d@ zl__WHjQ!3fRKv+6>c^Z7D+}~q*~|EM#%Vp;V&cvTdavkx%Fn`Xx)(RJY0b>c42?#E z&dyFMmCB;yV_DWI?@zPYJmdSc)Vw}kpG(aT@R+$-?46$bjg%5&%%c1~-a0tF-MPP) zT1QWb67jK*eT*OoXfztM+il`F#`8QZ%c9X}FflPfPfriN?_-RiP$*#A_WZq4N-Qf! zM={3Wc^*L!(An9^%*+g77!pN!LZah1L{T)4^*t9O*>1O)oSdYyvlHL<@qHi5vdFUh zVCm`Uq1kNCw>9_sIhvb+nGkqyq2lr()`?k=o8qlzU@K2vleBA$$~i#Gm%k95z@y8Pw+ zU*>_YJTPko%xP{MdU|>YP7^Zc=520%jmZ-h(=;UvL&nC&SiXEY)oPV`y*?{=7HBjY zjE#-a*Vjj>RHEH(&tFqY<$_Q#FaJC-F~RioG%HrDV8x0ROioVD_pN8qGqNn3=OY(# z3bfm8vMeKxWBAoSKI3yohacv|$3G0fz?=RUZ{-gM5%>Q0zn^qADOU(_%J?{rLl}l6 zNkR|=^W(c})hhb>`k0xSA&O2tyyo7MIF55S3i0iua^z_it(ZT5G zDD8F|tuHjpJPg!DjK2o>cJon8SCICA@KeErYgNV#Bf#UH+hHP3oEDpN??#eMek2{&xQ z3mlq{9Km|m4Qzkq%W1Yoc>6E^I`<5>S-z&9pi;#c!_0IOX=RiO1*9#QuC*{S!+8 za!-h5S*TRu1uppHH376nSO%5k5T>r{5=Ifm68M2f6h`ybePawkP{r{q!mx!gZ8of5 zOK)#4-96PD22~qIPmD4&bc~6y8EVrl+@QpCZJNIRembf}YST@$$Z%boEX_E4c!<8f zUix|~tXh$WPfm^>=b{U?a;#^Jd%u4_S6+Dmj$_l=*+tllm>4^OB|V;b(KdGNdWc$M zhH|-taq@RUDTQM@^VUisa`dH4DLmIl&W08Go=>aY#G-`)E(qaJmYN zi-2~dAdabON#)D`itQIr>(|r#`*+jZw~-bKuUx`%T(bHM+7ejO$F^-o9^T74{`wzi zG#ZO~2#v{wekt>@2!bH@^vv$7?|R!?C`b<@^0U{qJ;E%+OJlH|+?zTl(>o4i7Pjx_ zHDb`b@r}Pju~?+lYR&giE|*D?WPUH611peH=AO1$rEcN>bJw%?eJY2_eTvBG>0{ux z-^TI3eoub({?Tu6;vYUjX~$&<*CRb~oW?zOqQ*y0-FJ)SCEHX=@w(T&Vg9^YIQ~kh zQ^tI;y*y3Rlh2=Jr(B==d*L`ajx)da&W-&X`MysSMYyg@lH|x9rBaDzvq_;)$U!k? zkll>gt4NPX7FE6=6v4r+*_6&qn0{F-uY1|5o33a@yZXs z@|3kUcjlhH9_PmG^f6y3$DBU)zVFW(o^m;I?yPnkhf=9DFK5oRy>L!F&qHfH-|k{_ zzVP0;b9gRfap79>Ja1lR&9V%o)RJpy;X0aIFLUd5vA(60eEQR${?RBAx7~JIuEo#d zbT9mWj;5xjPPsO(`7h$$I=zjBZJplk>EF!>mrJ#=*zcF>cOgwpoz%(?A3nTj-*eAp zUTF|KzD4E9KsJcRBa*3n!w6OejDL5WLw|ROksC*d$4&;B%0RO0+GU*gC+961yLgIH zQkZ6H=i*j~h2yZ)_$@Y1Gcz+wUSGI2mK@Us_df8z1E*X&)7m@b_rH4P`8fKH-^HW} z?y7YR{MK84=#6a8o;|0G!BTuJ{C;9$;>_NLMV@hDVgexqv3@mL#h5TeB`E~dS6e!Rwxv>{QUJ`1it5zB_SA1 zCIn#NdOlj(C;x5)eEYT? z#42TYc!W$t7{&-=VYH&!Q9)%1&33-=2d+<&#AI=b?bt|L5Vl%KKfw1qk}RE{AIq|c zRhlC@NgHx3EDA-BbI;pIyWQr#-MeTuThyoPB(a0zc^IMa3IVNFn=KpH(?8J7!}|{+ zErH4uX`(R3BGa1V!zYNMCg-2uLq}JDFCACiCPQWUfv;zk^Gs`W zmXR5Q4Y-y)e@J?+hcSjIj8L=Hz@soi7=zFT+s;v+gn+;gh|`d)onZ-!k`oa3Rk-c& z5t_gCN4)prf6u_iEi`}k58<{iLEOq=hVjAn^86!dKw40rf|-P=SNuNNOI}35aY+Cp zEjoomC^YSn5oDxLR!aKKn~-K=t%LrNZU%|Mo77){Nfp0gOrs_wOOxzvomTsH>O4GcKflTV8BUR+i5FuxBP7 zW9(V@YzxQy^zm3YCJR3=HD16eg6Bd70+{DxPJsaC*T4 zqW8_U702=8z9Wm>d%7aJ@cP30mRd`v|9&yv7Jfdxou^cZIGZ@P9|Tq5iNw#HNjZ3; zZ9U#IENpAhcDtW|7vgb{4W@TZ&m$XDHa*r2mex)#?2#KsIQF??i!abHyOGjihy zmwe(9*1cxknS6myUWm;ig6NNu&bIIAo4!Q-+h5NWx_5mT%lG+lr_;w)Doxl9iIR|F z96}s}B{5QAsT48^ei4blqzawJNLS(r7iAKXxK4YCL+|n4pD+w@G#E0pw8@a@v;}q^ zHlor5Us@QQf>wBI*P{OB1{&vVp>){`z$xNH4U7ZmTp%<8_UyTjnt^4@)>5$q2PPij zmVf?dUi+@?n8|U9H+_}#q5FuE2>)d-qbe=l`N!|(+j}2o`z70%Y-^;-&}2YHMuzK@ z(OE_mCm0bUrH}3UNF<&snVFdZD`orkb6M8k%l&)yFm!a3z^~A5HtFpx@q!mz!@~y- z62^60w-Zf*6F4+$DfjPsgkrIX?*_zao2#$7fQhkbZvNICIG&Fs9L7c`c+rcW$M$XK z^V!dRp0N`X1f>#{ijNSIb~C2gY~@ACgh3~Y$egrVw%Z|=5R{5Vl34*fC=^JOWLCh| zBx#aYW=`86d@wc>6E%*H9H+OZn~~u$>b01lRK%|o=RLda<_woyavm!O2H5}5LF&ym zS!NI>qf+Xo-HK3IisJ`NPBa)gc7%@N7L2PQGt|b0S-)yI?RJ~beELiL$}4_>-o6UW z_B5T9WrS&+Ab{sS?=rssytSPoWuc75krHNMT$Rd@j*U|3to6|XA#jAG9k%CDxm1?TTN6f;l(NCjC0P7z{5cD%vpTi!?MRlhPeV;wuNI35Cp-zHCqUAij{lLLfvk+sZ=T?NkSAwOL`&}_89~L zN~w8|-eT76Im`7z0XYbQQvz0AKI>4X?H}AuFmUD&*oQv!5Ht79kW3|ve0Ai9 z0)IIhk_ROjC#~;ud)w*bwNNo|9B1Cs?>G)p%2NdGN~J=p)jH)}np@MJ=gqf2H$SJ- zoL6YEd710qaU9z1_B?vr>HGyjFdxma@cT4P=OY@<#uMTD{(Re6mYu@e!gu&brbKMm zuz^;qMR#}ie7KSC=T%-k&!eZOhsnuFn$6}}g)>PhX*3!{QAAHq53cJzCY)(*aONhm zP$(WX-aQz?|fTJg)=SWJ5Z`Y_4E=7L9`q z9{!t$8UDgBCNtdgoA=OrW$%(uuM}X%jvc2g#JTaEoSZzxs&RTa(_CoLoExxED9nc^ z#c@1usVWo-_`XlITBTO25r*Lz!l}aVLySq7h z^e9J;9HG0rd;ZxM3ugi-m&^3`_fxCYn3|eG+W8@o(v6V;Lu7mG* z7z3ylVOqn-0wSc<34TQUyZ?pO|N0cAORhtCB`nn<6E<>IyWV*DHIy8eM;<(sD=R?v zvEA_gUqgKBK5#-9Sc5e-j6Av*BQ&r1qu=AE+wNp^xW@W*E0_wKWDz8hMr9hO&?N9G z)a$KW0QCx_X-bO1w>-db&W1G%EbnK}{SPp5yhf>7q1|Xv=?M7QpS_Opi3#q!{a!3D zBa0gZ!o_n+c)o+}wy|wPt2M(#7oAVBT;R)J{0@ae7lxEteVVJT+QG`z-F)lY-{9z@ zLzK&9HgDNT-?A#HQapNagu%f=ZQH0ha(xK6gFt(f5|437W0LON~(j-Yt z;1{U|B_ag}AH0j_UUNNv@v)EKSd!^PQ+jkS%nU-QGFy|S3Ce)ygNn!=9^}M({uj%C z`BfOLiQ^DU3qYeS3DV$X0f`-BG>{rPiv`LreKCCJUvO^x25Nc=(1dXd4LH(6I2O{C z{MBFl1?97dTRuJRIgS%1haSduJ;GFBOosFvQk|idLNzBS1H>w?bdLo{ymB>Hw9t&NrWf*X5n66Raq(>^aN0^A&gIiQJLq@Fxy03AZLJ!CT+@ z)}Ok0`TX$W-;aFkgCs+bA{>`BfA%*|T7PeU``dq{&o_B|5Un+(fz^~%1jQ26C&}yr zQVMV^{8p26W|TN-VT4Q3atTcfk!l>_@`l&GnxOi`T~UqN4E1CCaY|iSaZKvu5c5jJ zc%ndie1?*eNHq;O=%j%xmGKR!d5)`PnBTS;P{UX|gglUwAvFMC6N$FeO&GLbjJg{d!hYk)?=%}I+!@%l3uD)sq zqbJ7s#*MdQ7t7RJb*_2#7FMlT$G2|1gCvb`JP0GOgo}`d$*CHxxK4&k7NuNp!B#eJ zUeEXL+{r@^9;MPzA_!bMJImCYQy48c|AKSLOv=nu17S;2rAU;*b3LT%kZO%(TZB;y zgq>Grj$+ajT-VKwHN^t0W)p!;qCy-gCD_njX2YhH6e}<_6H_V%G@1=IY*@uP z>sIi!uie6l@fqAwnbvfZ9XqzMdE0g9$Hu^OJE6sZReKPydJtCixVtq&4)gf z%Vo4+Heq{KIj{V}J5dO27OH6lQi&fU<3DOCZw(Egg)NlGqM*GbGL=u7G&tQM}!EQ|avD z;NVf3%^F5qxQ>mn9Bg6JQ3#kB8$K%~qEe}xDm+b3;Cc?0EMl7kyO@!r2~J=`JET56 z!hnt;Zs%fwF`#F?5qcMjbN~P#07*naR7PWKO;=afDM`Pl|NTVi0`JG?tZ3YQdv5F* zSb4_WxXU{Vtm|EOR%8BTk!4wr8SAC`n!9K9>eY*Wzu3HWbac?s(ZO|G$2a)KV?&bu z-w;`tE99$xY4ut0y!sbcv+K>fFv@WJtH()Z65I~=DVe+LxNcs7SZcgZf7Zolv1^O9 zweX%wrNT3w@r)&TJ5zs8^xh}Z){km!{=iDa({#Eazd(!DS-S&&7-R#xcyh}80sk=y z#6sHi=1mNJHpj=FxMSjs{Qqa6tl41nh7ab#!{yH*K6;q==wp2r$?(Y}vgXe3p{6Df zu1DqB*ZlZAjO8F~iK{Idei>`qHi~!cLE1nXgB2r%hd(k!b7}&w+>P-|6ets^6jSM= zb>h$uq(szCj8d$0BZMS1AeA6QQFKa}q{WHBM;NdI+&Ck(Eo5pV;wEmjg0T{k-+U?I zKYay%<3*UvM~j#k5K6G2?6TpN7lZ7AgAc&YJy2c+g$k{yDO_99UbzWr9-;Z_>qx$I zH=DL@=i{IKB){_VSMuni!}Rx;!MN08g_9X<9AlI`0zQ!IG2YB7!{X|-qAv281tT)cw=`yW9knlRPW!-&30H(8c(Yspsz4>m2hQ=s&lyN;5r44u8wU;yrk+$aA=k?LItV*NSMoI^5 zhh#$MbsfS4*SBc5+bHAU+mOV`JhG9@?7RxMlxSOGsSMBcalKr*uzimxin#y2gOm$J z{9-`89@5v_!IrISxNq-%jt(B9R4GE@^2|%Ov1<7Mdmea@hYt+l1Rh1t$1-^>L*+zd zvCVgG+l?QTxNyf-(ss=7i3x7K?M_x_E6j^_tR$0o{BN?smX;CmiQ z=cE*9-2iS4-)%?{*KTOdH7#=x6`OdEs-0;EN!xwab z3c+&o5JD;7&@o2e_@@+K`${T6+^Cai7f}!tGn>T3SXyI@K-wNo5+ket6VIT&zmw=M ze;*nVeJj=??*BgZ=yj~$)Ek>7%`GH_^j+K4RzfFZ+q$ z`Kh26@uEeQh=s88bBL0U>-p*N=)b<7k*|)RW6j`a2ifo&8%{NX-7`sa;?!INljTNI z9czZaGJJ}mbJ?}ake*zW@2BZMj-FN`o&@Tq`;1D&lZk8~izi1B z_8IyA&qDFhL+CJ{tNLxTbSZ99HEUS465B`MkwxHC1pRKwPd zaO^NR6;iK+6NcEw4ih$-^bDLs+MXiT2HQB4d)84K+C|c;;TF%nkW{PLA`8bUuG;~L zMhlIS;M*M(f(jGI9^&Z!!(2xjX5&zWGzei~;t;#qhaNso{ClrQ{^M5(x>u6L85SAs ziifpp6z7W{hR&7XWzew#NrHOI^IpcsW~la*Kq%5Ap%qSHX&;p;2A22ZI4+HPn zL8XRFC4fdCv1}-p3+&ptkBN~n!YrmXRj1ib z5JFNc6lo_hma(W*syPI!W#P*r%~qYRt}cuLODfVNMQcs5Sja=^gg_-Rw(VdnizG=X z6g*tprqO7jF$ASzj!u#(Bo^%?!m=b-0^4@5ZHHJ#c_G0pFKnl0Lm(~7f=H1VL!~1i z2_q5|naOx$IO6haujhY$=+BYGfRQ7I=>E>l=y$&bRW#TuHbc|`N9M)maA0JD(cgM2 zg*X2m0U7PEh2xfB@DMtxqt3g4L}_HHLNYc@^V9FaJNOX#J)guWbr8SpcX3CLAlI)! zq;)z5n~WWLnB_go$y9=+A<8t>&Te|wp2yUo-MHsoc2))FvMgh4WRQ-YGM-zY-JZgB zECNx$^1HFM;`k$b2{Mg)`~;X5m@Y^(vuQw9+z`aVeK_7k8Z^H;jFIESD!Xm+8Eq^Q_xj^QtwBe05}A5m~52 z7;X60mES_gi&tq)XHsr|$?d0lfj)CNYhH1x0rpZZWf{w!7DE3cZJAFG!4FR>Idi<< zV#o$d{nOFOmul$WhRBjrlX3iIKEj@bxgBbsv0t~-eNy=UNu|Z`AY?}uSU(_Ags`x? zdd|A9r`)R&Hwhav2w{*$V~E^U!|5J5jvCxglBG1$3{QCAc{wJ3-$vTU zcay2JtD>aRl!=G;(zo_pZ0V7z9972^I!9sxPVC=HFjixg2|*cbkr(-rv4uvVTXpP# zUhJV3@vmJ^d*(Qv=b)7)Fq-M@TTmu~iUZ{eBr&z4L+JVp#?weV^zkDE+M~Q-3&H*0 zrTwDINbkCxm0i930EymoIDmtJ}?;}fGy zPEI2ngEo1XRjbuP&xYdI(#4h%&vEnQX#=*jv89701c4vmSQcp*=J^0x≶?EJ>wO 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�`3f&?T=_v(0=$}(rBxvQDM>X=kWyi_PcJx6eO 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 IZ}RVd03%F@hyVZp diff --git a/docs/docs/development/boards-shields-keymaps.md b/docs/docs/development/boards-shields-keymaps.md index 4444537e..4644ee79 100644 --- a/docs/docs/development/boards-shields-keymaps.md +++ b/docs/docs/development/boards-shields-keymaps.md @@ -34,7 +34,7 @@ in the `app/boards/${arch}/${board_name}` directory, e.g. `app/boards/arm/planck ## Pro Micro Compatible Keyboard -![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) +![Labelled Pro Micro pins](../assets/interconnects/pro_micro/pinout.png) For keyboards that require a (usually Pro Micro compatible) add-on board to operate, the ZMK integration pieces are places in the _shield_ definition for that keyboard, allowing users to diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 2e468fe0..62d71f03 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -6,6 +6,9 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import KeymapExampleFile from '../keymap-example-file.md'; +import InterconnectTabs from "@site/src/components/interconnect-tabs"; +import Metadata from "@site/src/data/hardware-metadata.json"; + ## Overview This guide will walk through the steps necessary to add ZMK support for a keyboard the uses a (Pro Micro compatible) addon MCU board to provide the microprocessor. @@ -115,33 +118,7 @@ endif ## Shield Overlays - - - - -### Pro Micro Shields - -![Labelled Pro Micro pins](../assets/pro-micro/pro-micro-pins-labelled.jpg) - -ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `0` in the devicetree files, use `&pro_micro 0`. - - - - - -### BlackPill Shields - -![Labelled BlackPill pins](../assets/blackpill/blackpill-pins-labelled.png) - -ZMK uses the blue color coded pin names to generate devicetree node references. For example, to refer to the node `17` in the devicetree files, use `&blackpill 17`. - - - + + + + + + {interconnect.node_labels && ( + <> + The following node labels are available: +

+ + )} + + ); +} + +function mapInterconnectValue(interconnect: Interconnect) { + return { label: `${interconnect.name} Shields`, value: interconnect.id }; +} + +function InterconnectTabs({ items }: InterconnectTabsProps) { + let grouped = Object.values(groupedMetadata(items).interconnects) + .map((i) => i?.interconnect as Interconnect) + .filter((i) => i?.design_guideline) + .sort((a, b) => a.id.localeCompare(b.id)); + + return ( + + {grouped.map(mapInterconnect)} + + ); +} + +export default InterconnectTabs; diff --git a/docs/src/data/interconnects/.gitignore b/docs/src/data/interconnects/.gitignore new file mode 100644 index 00000000..0a00d701 --- /dev/null +++ b/docs/src/data/interconnects/.gitignore @@ -0,0 +1 @@ +*/ \ No newline at end of file diff --git a/docs/src/hardware-metadata-collection-plugin/index.js b/docs/src/hardware-metadata-collection-plugin/index.js index 89f057a8..f118c0ba 100644 --- a/docs/src/hardware-metadata-collection-plugin/index.js +++ b/docs/src/hardware-metadata-collection-plugin/index.js @@ -14,6 +14,22 @@ function generateHardwareMetadataAggregate() { const aggregated = files.flatMap((f) => yaml.loadAll(fs.readFileSync(f, "utf8")) ); + + aggregated + .filter((agg) => agg.type === "interconnect") + .forEach((agg) => { + let baseDir = `src/data/interconnects/${agg.id}`; + if (!fs.existsSync(baseDir)) { + fs.mkdirSync(baseDir); + } + + if (agg.design_guideline) { + fs.writeFileSync( + `${baseDir}/design_guideline.md`, + agg.design_guideline + ); + } + }); fs.writeFileSync( "src/data/hardware-metadata.json", JSON.stringify(aggregated) diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 49755749..8ca382c5 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -85,6 +85,21 @@ } } }, + "interconnect_node_labels": { + "title": "InterconnectNodeLabels", + "type": "object", + "additionalProperties": false, + "required": [ + "gpio" + ], + "properties": { + "gpio": { "type": "string" }, + "i2c": { "type": "string" }, + "spi": { "type": "string" }, + "uart": { "type": "string" }, + "adc": { "type": "string" } + } + }, "interconnect": { "title": "Interconnect", "type": "object", @@ -93,6 +108,7 @@ "file_format", "id", "name", + "description", "url", "type" ], @@ -117,6 +133,12 @@ "description": { "type": "string" }, + "node_labels": { + "$ref": "#/$defs/interconnect_node_labels" + }, + "design_guideline": { + "type": "string" + }, "manufacturer": { "type": "string" }, From 5b9b507de3ef6e7a3bcb1ef61fe6d12ba46b8447 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 5 Jan 2023 03:18:27 +0000 Subject: [PATCH 268/494] fix(ci): Escape ` from JSON metadata files. --- .github/workflows/build.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 92df03c3..c266cf60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ on: - ".github/workflows/build.yml" - "app/**" schedule: - - cron: '22 4 * * *' + - cron: "22 4 * * *" jobs: build: @@ -51,7 +51,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install @actions/artifact run: npm install @actions/artifact - name: Build and upload artifacts @@ -64,7 +64,7 @@ jobs: const artifactClient = artifact.create(); const execSync = require('child_process').execSync; - + const buildShieldArgs = JSON.parse(`${{ matrix.shieldArgs }}`); let error = false; @@ -118,7 +118,7 @@ jobs: const coreCoverage = `${{ needs.core-coverage.outputs.core-include }}` || "[]"; const boardChanges = `${{ needs.board-changes.outputs.boards-include }}` || "[]"; const nightly = `${{ needs.nightly.outputs.nightly-include }}` || "[]"; - + const combined = [ ...JSON.parse(coreCoverage), ...JSON.parse(boardChanges), @@ -148,14 +148,14 @@ jobs: runs-on: ubuntu-latest needs: get-changed-files outputs: - core-include: ${{ steps.core-list.outputs.result }} + core-include: ${{ steps.core-list.outputs.result }} steps: - name: Checkout uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - uses: actions/github-script@v4 @@ -166,7 +166,7 @@ jobs: const yaml = require('js-yaml'); const coreCoverage = yaml.load(fs.readFileSync('app/core-coverage.yml', 'utf8')); - + let include = coreCoverage.board.flatMap(board => coreCoverage.shield.map(shield => ({ board, shield })) ); @@ -184,7 +184,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - uses: actions/github-script@v4 @@ -269,7 +269,7 @@ jobs: with: script: | const metadata = JSON.parse(`${{ needs.get-grouped-hardware.outputs.organized-metadata }}`); - + let includeOnboard = metadata.onboard.flatMap(b => { if (b.siblings) { return b.siblings.map(board => ({ @@ -311,7 +311,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: '14.x' + node-version: "14.x" - name: Install js-yaml run: npm install js-yaml - name: Aggregate Metadata @@ -329,7 +329,7 @@ jobs: yaml.loadAll(fs.readFileSync(f, "utf8")) ); - return JSON.stringify(aggregated).replace(/\\/g,"\\\\"); + return JSON.stringify(aggregated).replace(/\\/g,"\\\\").replace(/`/g,"\\`"); result-encoding: string - name: Organize Metadata @@ -389,7 +389,7 @@ jobs: - uses: Ana06/get-changed-files@v2.0.0 id: changed-files with: - format: 'json' + format: "json" - uses: actions/github-script@v4 id: board-changes with: From b7b563a4c3c19ddba7b5b300a08c690f149e7d32 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 5 Jan 2023 16:45:00 +0000 Subject: [PATCH 269/494] fix(ci): Fix another spot where ` needs escaping. --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c266cf60..6305b741 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -376,7 +376,7 @@ jobs: }, { onboard: [], interconnects: {} }); - return JSON.stringify(grouped).replace(/\\/g,"\\\\"); + return JSON.stringify(grouped).replace(/\\/g,"\\\\").replace(/`/g,"\\`"); result-encoding: string get-changed-files: if: ${{ github.event_name != 'schedule' }} From a82a0ec4969487a0f15cd417b215360465d746d5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 25 Nov 2022 00:20:53 -0500 Subject: [PATCH 270/494] feat(shields): Add splitkb.com Aurora Lily58. --- .../splitkb_aurora_lily58/Kconfig.defconfig | 55 +++++++++++++ .../splitkb_aurora_lily58/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 31 ++++++++ .../boards/nice_nano_v2.overlay | 31 ++++++++ .../splitkb_aurora_lily58.conf | 9 +++ .../splitkb_aurora_lily58.dtsi | 78 +++++++++++++++++++ .../splitkb_aurora_lily58.keymap | 70 +++++++++++++++++ .../splitkb_aurora_lily58.zmk.yml | 12 +++ .../splitkb_aurora_lily58_left.overlay | 43 ++++++++++ .../splitkb_aurora_lily58_right.overlay | 45 +++++++++++ 10 files changed, 382 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_lily58/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig new file mode 100644 index 00000000..bbaef0ff --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_LILY58_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Lily58" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT + +if SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +config ZMK_DISPLAY + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield new file mode 100644 index 00000000..35f8b2d1 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_LILY58_LEFT + def_bool $(shields_list_contains,splitkb_aurora_lily58_left) + +config SHIELD_SPLITKB_AURORA_LILY58_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_lily58_right) diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay new file mode 100644 index 00000000..eb838b24 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..eb838b24 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,31 @@ +#include + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + mosi-pin = <6>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <5>; + miso-pin = <7>; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf new file mode 100644 index 00000000..d456100a --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi new file mode 100644 index 00000000..08e2ac9e --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; +// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | +// | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | +// | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | +// | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | +// | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 5 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; + + a-gpios = <&pro_micro 18 GPIO_PULL_UP>; + b-gpios = <&pro_micro 19 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap new file mode 100644 index 00000000..376bcf26 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ------------------------------------------------------------------------------------------------------------ +// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | +// | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + lower_layer { +// ------------------------------------------------------------------------------------------------------------ +// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | +// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | +// | | | | | | | | | | | _ | + | { | } | "|" | +// | | | | | | | | | | + bindings = < +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 +&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE +&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + raise_layer { +// ------------------------------------------------------------------------------------------------------------ +// | | | | | | | | | | | | | | +// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | +// | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | +// | | | | | | | | | | + bindings = < +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans +&kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml new file mode 100644 index 00000000..47d49a4c --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.zmk.yml @@ -0,0 +1,12 @@ +file_format: "1" +id: splitkb_aurora_lily58 +name: splitkb.com Aurora Lily58 +type: shield +url: https://splitkb.com/products/aurora-lily58-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys +siblings: + - splitkb_aurora_lily58_left + - splitkb_aurora_lily58_right diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay new file mode 100644 index 00000000..1fa61286 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_lily58.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; + + diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay new file mode 100644 index 00000000..7f281db9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_lily58.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "row2col"; + + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <6>; +}; From 82ff6d8e857bf581714f2a2e23af3aa6bf4cf4e2 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 8 Jan 2023 16:21:16 -0600 Subject: [PATCH 271/494] docs: update dev env setup guide Renamed the "Basic Setup" page to "Toolchain Setup" to make it clearer that this is for setting up a development environment for local builds. Linked to the relevant Zephyr setup documentation instead of duplicating that information in our guide. This also switches Windows and macOS setup to using the Zephyr SDK, which is much easier to install. Updated the command for installing Zephyr's Python dependencies to be OS specific, as Windows and macOS don't need the --user flag. Updated the IDE integration page with instructions for determining the compiler path that work with the latest version of the Zephyr SDK. --- docs/docs/assets/env-var/env_var.png | Bin 17317 -> 0 bytes docs/docs/assets/env-var/gnuarmemb.png | Bin 7914 -> 0 bytes docs/docs/assets/env-var/new_variable.png | Bin 60899 -> 0 bytes docs/docs/assets/env-var/start_menu.png | Bin 51108 -> 0 bytes docs/docs/assets/env-var/zephyr_toolchain.png | Bin 7282 -> 0 bytes docs/docs/development/ide-integration.md | 85 +-- docs/docs/development/setup.md | 530 +++++------------- 7 files changed, 168 insertions(+), 447 deletions(-) delete mode 100644 docs/docs/assets/env-var/env_var.png delete mode 100644 docs/docs/assets/env-var/gnuarmemb.png delete mode 100644 docs/docs/assets/env-var/new_variable.png delete mode 100644 docs/docs/assets/env-var/start_menu.png delete mode 100644 docs/docs/assets/env-var/zephyr_toolchain.png diff --git a/docs/docs/assets/env-var/env_var.png b/docs/docs/assets/env-var/env_var.png deleted file mode 100644 index 77ebbc5b82a55ad02d4de83a3bcc6e233c4fc3e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17317 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 diff --git a/docs/docs/assets/env-var/gnuarmemb.png b/docs/docs/assets/env-var/gnuarmemb.png deleted file mode 100644 index 42e38ec14bd510665141cc70f5e3d54d434e9ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7914 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 cbot+4SZ;auyKYQ*HQUCw| diff --git a/docs/docs/assets/env-var/start_menu.png b/docs/docs/assets/env-var/start_menu.png deleted file mode 100644 index fc7d9b5eac705df2d48502f51ae45a05f143ac76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51108 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 diff --git a/docs/docs/development/ide-integration.md b/docs/docs/development/ide-integration.md index 6ca43321..bfcd5def 100644 --- a/docs/docs/development/ide-integration.md +++ b/docs/docs/development/ide-integration.md @@ -59,86 +59,41 @@ click **Add Configuration**, enter a name, and click **OK**. Change these options: -| Option | Value | -| ------------------------------------- | ---------------------------------------------------- | -| Compiler path | Path to your toolchain's GCC binary (see below) | -| IntelliSense mode | gcc-arm | -| Advanced Settings > Compiler commands | `${workspaceFolder}/app/build/compile_commands.json` | +| Option | Value | +| ------------------------------------- | ------------------------------------------------------ | +| Compiler path | Path to your toolchain's GCC binary (see below) | +| IntelliSense mode | `linux-gcc-arm`, `windows-gcc-arm`, or `macos-gcc-arm` | +| Advanced Settings > Compiler commands | `${workspaceFolder}/app/build/compile_commands.json` | + +If you are developing inside a Docker container, set the IntelliSense mode to `linux-gcc-arm` regardless of the host operating system. #### Compiler Path - - - -Open VS Code's integrated terminal and run the following commands. It will print -your compiler path. - -```sh -source zephyr/zephyr-env.sh -echo ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -``` - -:::note -You will need to update this path any time you switch to a new version of the Zephyr SDK. -::: - - - - -Your compiler path is +Open VS Code's integrated terminal and run the following command: ``` -${env:GNUARMEMB_TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc.exe +cmake -P zephyr/cmake/verify-toolchain.cmake ``` -This assumes `GNUARMEMB_TOOLCHAIN_PATH` is set in your system or user environment variables. -If not, you will need to list the full path instead of using the `${env}` placeholder. - - - - -Open VS Code's integrated terminal and run the following command. It will print -your compiler path. - -```sh -echo ${GNUARMEMB_TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc -``` - - - - -Your compiler path is +This should print something like ``` -/usr/bin/arm-none-eabi-gcc +-- ZEPHYR_TOOLCHAIN_VARIANT: zephyr +-- SDK_VERSION: 0.15.2 +-- ZEPHYR_SDK_INSTALL_DIR : /home/marvin/.local/zephyr-sdk-0.15.2 ``` - - - -Open VS Code's integrated terminal and run the following commands. It will print -your compiler path. - -```sh -source zephyr/zephyr-env.sh -echo ${ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc -``` - -:::note -You will need to update this path any time you switch to a new version of the Zephyr SDK. -::: - - - - -Your compiler path is +Your compiler path is the value of `ZEPHYR_SDK_INSTALL_DIR` plus `/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc`, for example: ``` -${env:ZEPHYR_SDK_INSTALL_DIR}/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc +/home/marvin/.local/zephyr-sdk-0.15.2/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc ``` - - +If you are building for an platform other than ARM, replace `/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc` with the path to the compiler for the appropriate architecture, for example: + +``` +/home/marvin/.local/zephyr-sdk-0.15.2/riscv64-zephyr-elf/bin/riscv64-zephyr-elf-gcc +``` #### Compiler Commands Path diff --git a/docs/docs/development/setup.md b/docs/docs/development/setup.md index bf1bd122..8ce5ffde 100644 --- a/docs/docs/development/setup.md +++ b/docs/docs/development/setup.md @@ -1,6 +1,6 @@ --- -title: Basic Setup -sidebar_label: Basic Setup +title: Toolchain Setup +sidebar_label: Toolchain Setup --- import Tabs from '@theme/Tabs'; @@ -10,287 +10,84 @@ export const OsTabs = (props) => ({props.children}); -## Prerequisites +This guide will show you how to set up a development environment for building ZMK locally. -ZMK requires the following base packages to first be installed: +## Install Dependencies -- Git -- Python 3 -- `pip` -- `wget` -- devicetree compiler -- CMake -- `dfu-util` -- Various build essentials, e.g. gcc, automake, autoconf +Click the operating system you are using. (The VS Code & Docker option can be used on any OS.) + + +This option use the same [Docker image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) for local development. Beyond the benefits of [dev/prod parity](https://12factor.net/dev-prod-parity), this approach is also the easiest to set up. No toolchain or dependencies are necessary when using Docker; the container image you'll be using already has the toolchain installed and set up to use. + +1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for your operating system. +2. Install [Visual Studio Code](https://code.visualstudio.com/) +3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +:::info +The docker container already includes `west`. Skip past the following section to [Get Source Code](#get-source-code). +::: + + -On Debian and Ubuntu, we'll use `apt` to install our base dependencies: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -```sh -sudo apt update -``` - -With the latest package information, you can now install the base dependencies: - -```sh -sudo apt install -y \ - git \ - wget \ - autoconf \ - automake \ - build-essential \ - bzip2 \ - ccache \ - device-tree-compiler \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-dev \ - python3-pip \ - python3-setuptools \ - xz-utils -``` - -:::note -Recent LTS releases of Debian and Ubuntu may include outdated CMake versions. If the output of `cmake --version` is older than 3.20, upgrade your distribution (e.g., from Ubuntu 20.04 LTS to Ubuntu 22.04 LTS), or else install CMake version 3.20 or newer manually (e.g, from Debian backports or from PyPI with `pip install --user cmake`). -::: - - - -On Raspberry OS, we'll use `apt` to install our base dependencies: - -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: - -```sh -sudo apt update -``` - -With the latest package information, you can now install the base dependencies: - -```sh -sudo apt install -y \ - git \ - wget \ - autoconf \ - automake \ - build-essential \ - bzip2 \ - ccache \ - device-tree-compiler \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-dev \ - python3-pip \ - python3-setuptools \ - xz-utils -``` - - - - -On Fedora, we'll use `dnf` to install our base dependencies: - -#### DNF Update - -First, if you haven't updated recently, or if this is a new install, -you should update to get the latest package information: - -```sh -sudo dnf update -``` - -#### Install Dependencies - -With the latest package information, you can now install the base dependencies: - -```sh -sudo dnf install -y \ - git \ - wget \ - autoconf \ - automake \ - bzip2 \ - ccache \ - dtc \ - dfu-util \ - g++ \ - gcc \ - libtool \ - make \ - ninja-build \ - cmake \ - python3-devel \ - python3-pip \ - python3-setuptools \ - xz -``` +Return to this guide once you are finished with each section. -:::note -Use `cmd.exe` with these instructions rather than PowerShell. -::: +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -Chocolatey is recommended and used for the following instructions. You can manually install each of these applications and add them to your `PATH` if you don't want to use Chocolatey. +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -1. [Install Chocolatey](https://chocolatey.org/install) -2. Open `cmd.exe` as **Administrator** -3. Run the following `choco` commands: - ```shell - choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System' - choco install ninja gperf python git - ``` +Return to this guide once you are finished with each section. -It is recommended to install `dfu-util` to avoid any later confusion while flashing devices. You can do this by running this command with chocolatey: - -```shell -choco install dfu-util -``` +`dfu-util` is required to flash devices that use DFU, but there is currently no maintained package for it on Chocolatey. [QMK Toolbox](https://github.com/qmk/qmk_toolbox) contains a working version of it though. -#### Homebrew +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions under these sections: -Homebrew is required to install the system dependencies. If you haven't done so, visit [Homebrew](https://brew.sh/) for instructions. Once installed, use it to install the base dependencies: +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) +- [Install Zephyr SDK](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-zephyr-sdk) -``` -brew install cmake ninja python3 ccache dtc git wget dfu-util -``` - - - - -This setup leverages the same [image which is used by the GitHub action](https://github.com/zmkfirmware/zmk-docker) for local development. Beyond the benefits of [dev/prod parity](https://12factor.net/dev-prod-parity), this approach is also the easiest to set up. No toolchain or dependencies are necessary when using Docker; the container image you'll be using already has the toolchain installed and set up to use. - -1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop) for your operating system. -2. Install [VS Code](https://code.visualstudio.com/) -3. Install the [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) - -:::info -The docker container includes `west` and the compilation toolchain. If you're using docker and VS Code, you can skip right to [Source Code](#source-code). -::: - - - - -## Setup - -### West Installation - -`west` is the [Zephyr™ meta-tool](https://docs.zephyrproject.org/2.5.0/guides/west/index.html) used to configure and build Zephyr™ applications. - -West can be installed by using the `pip` python package manager. The [Zephyr™ instructions](https://docs.zephyrproject.org/2.5.0/guides/west/install.html#installing-west) are summarized here: - - - - -```sh -pip3 install --user -U west -``` - - - - -In `cmd.exe` as **Administrator**: - -```sh -pip3 install -U west -``` - -:::note -**For Windows, do not use the `--user` argument** that Linux uses otherwise `west` will be installed in a different location and the below instructions for adding Python `pip` will no longer apply. -::: - -Once `west` is installed, close Command Prompt and open a new session as a **user** for the remainder of the instructions. - - - - -:::danger `pip` user packages -If you haven't done so yet, you may need to add the Python `pip` package directory to your `PATH` otherwise your computer will not be able to find the `west` command. -::: - - - -Run the following commands: - -```sh -echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc -source ~/.bashrc -``` - - - - -1. See the [Environment Variables](#environment-variables) section on how to get to the Environment Variables page. -2. Under "System variables" select the "Path" variable. Click "Edit..." and then "New" to add the directory where your `west.exe` is located. By default this should be `C:\Python##\Scripts` where ## is your Python version number. -3. Close Command Prompt and open a new session for the changes to take effect, or run `refreshenv`. - - - - -### Toolchain Installation - -The toolchain provides the compiler, linker, etc., necessary to build for the target -platform. - - - - -#### Zephyr™ ARM SDK - -To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: - -``` -export ZSDK_VERSION=0.13.2 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" -``` - -The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. +Return to this guide once you are finished with each section. -Because Raspberry OS (Raspbian) runs on the same architecture (but different ABI) as the keyboard MCUs, -the operating system's installed [cross compilers](https://docs.zephyrproject.org/2.5.0/getting_started/toolchain_other_x_compilers.html) can be used to target the different ABI. +#### Install Base Dependencies + +Open Zephyr's [Getting Started Guide](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html) and follow the instructions for Ubuntu under these sections: + +- [Select and Update OS](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#select-and-update-os) +- [Install Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/index.html#install-dependencies) + +Return to this guide once you are finished with each section. + +#### Install Cross-Compile Toolchain + +Because Raspberry OS runs on the same architecture (but different ABI) as ARM keyboard MCUs, the operating system's installed [cross compilers](https://docs.zephyrproject.org/3.2.0/develop/toolchains/other_x_compilers.html) can be used to target the different ABI. Building for non-ARM MCUs has not been tested. First, the cross compiler should be installed: @@ -298,7 +95,7 @@ First, the cross compiler should be installed: sudo apt install gcc-arm-none-eabi ``` -Next, we'll configure Zephyr™ with some extra environment variables needed to find the cross compiler by adding the following to `~/.zephyrrc`: +Next, we'll configure Zephyr with some [environment variables](https://docs.zephyrproject.org/3.2.0/develop/env_vars.html#env-vars) needed to find the cross compiler. Create a file named `~/.zephyrrc` if it doesn't exist, and add these lines to it: ```sh export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile @@ -308,50 +105,83 @@ export CROSS_COMPILE=/usr/bin/arm-none-eabi- -#### Zephyr™ ARM SDK - -To build firmwares for the ARM architecture (all supported MCUs/keyboards at this point), you'll need to install the Zephyr™ ARM SDK to your system: - -``` -export ZSDK_VERSION=0.13.2 -wget -q "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZSDK_VERSION}/zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" && \ - sh "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" --quiet -- -d ~/.local/zephyr-sdk-${ZSDK_VERSION} && \ - rm "zephyr-toolchain-arm-${ZSDK_VERSION}-linux-x86_64-setup.run" -``` - -The installation will prompt with several questions about installation location, and creating a default `~/.zephyrrc` for you with various variables. The defaults should normally work as expected. - - - - -#### GNU ARM Embedded - -Since the Zephyr™ SDK is not available for Windows, we recommending following the [Zephyr documentation](https://docs.zephyrproject.org/2.5.0/getting_started/toolchain_3rd_party_x_compilers.html#gnu-arm-embedded) to install a GNU ARM Embedded build. Note the warnings regarding installing the toolchain into a path with spaces, and make sure to follow the steps to add the environment variables which are also summarized with screenshots in the [Environment Variables](#environment-variables) section below. - - - - -#### GNU ARM Embedded - -Since the Zephyr™ SDK is not available for macOS, we recommending following the steps to install the GNU ARM Embedded toolchain: - -``` -brew install --cask gcc-arm-embedded -``` +Follow Zephyr's [Install Linux Host Dependencies](https://docs.zephyrproject.org/3.2.0/develop/getting_started/installation_linux.html) documentation for Fedora. -:::note -If you intend to build firmware straight away, make sure to correctly setup the current shell. +### Install West -Notes on setting this up can be found in the [Environment Variables](#environment-variables) section. -The transient instructions can be used to setup the current shell, and the automatic instructions can setup any newly made shells automatically. +`west` is the [Zephyr® Project's meta-tool](https://docs.zephyrproject.org/3.2.0/develop/west/index.html) used to configure and build Zephyr OS applications. -The transient instructions must be run to build firmware using the current shell. -::: +West can be installed by using the `pip` python package manager. The [Zephyr™ instructions](https://docs.zephyrproject.org/3.2.0/develop/west/install.html) are summarized here: -### Source Code + + + +Install west: + +```sh +pip3 install --user -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure `~/.local/bin` is on your `PATH` environment variable. You can add it with these commands: + +```sh +echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc +source ~/.bashrc +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + +Verify that west is installed: + +```sh +west --version +``` + +This should print a message like "West version: v0.14.0". If it prints an error instead, make sure that the Python scripts directory is on your `PATH` environment variable. You can add it by opening a PowerShell window and running the following commands: + +```powershell +$Scripts = python -c "import sysconfig; print(sysconfig.get_path('scripts'))" +$Path = [Environment]::GetEnvironmentVariable('PATH', 'User') +[Environment]::SetEnvironmentVariable('PATH', "$Path;$Scripts", 'User') +$env:PATH += ";$Scripts" +``` + + + + +Install west: + +```sh +pip3 install -U west +``` + + + + +## Get Source Code Next, you'll need to clone the ZMK source repository if you haven't already. Navigate to the folder you would like to place your `zmk` directory in and run the following command: @@ -359,13 +189,13 @@ Next, you'll need to clone the ZMK source repository if you haven't already. Nav git clone https://github.com/zmkfirmware/zmk.git ``` -### Initialize & Update Zephyr Workspace +## Initialize & Update Zephyr Workspace Since ZMK is built as a Zephyr™ application, the next step is to use `west` to initialize and update your workspace. The ZMK Zephyr™ application is in the `app/` source directory: -#### Step into the repository +### Step into the repository @@ -421,19 +251,13 @@ All subsequent steps must be performed from the VS Code terminal _inside_ the co -#### Initialize West +### Initialize the Application ```sh west init -l app/ ``` -:::caution Command Not Found? -If you encounter errors like `command not found: west` then your `PATH` environment variable is likely -missing the Python 3 user packages directory. See the [West Build Command](#west-build-command) -section again for links to how to do this -::: - -#### Update To Fetch Modules +### Update to Fetch Modules ```sh west update @@ -449,103 +273,45 @@ If you're using Docker, you're done with setup! You must restart the container a Once your container is restarted, proceed to [Building and Flashing](development/build-flash.md). ::: -#### Export Zephyr™ Core +### Export Zephyr CMake package + +This allows CMake to load the code needed to build ZMK. ```sh west zephyr-export ``` -#### Install Zephyr Python Dependencies +### Install Zephyr Python Dependencies + +Some additional Python dependencies are listed in Zephyr's `scripts/requirements.txt` file. + + + ```sh -pip3 install --user -r zephyr/scripts/requirements-base.txt -``` - -### Environment Variables - - - - -#### For GNU ARM Embedded on Windows - -On Windows, only two environment variables need to be set for ZMK to build properly: `ZEPHYR_TOOLCHAIN_VARIANT` and `GNUARMEMB_TOOLCHAIN_PATH`. - -1. Open Start Menu and type 'env' to find the 'Edit the system environment variables' option. Open it. - -![Environment variables in Start Menu](../assets/env-var/start_menu.png) - -2. Click 'Environment Variables...'. - -![Environment variables button](../assets/env-var/env_var.png) - -3. Click "New..." under System variables to create a new system variable. - -![Environment variables menu](../assets/env-var/new_variable.png) - -4. Set the variable name to 'ZEPHYR_TOOLCHAIN_VARIANT' and value to 'gnuarmemb'. Click OK to save. - -![Adding Zephyr toolchain variable](../assets/env-var/zephyr_toolchain.png) - -5. Create another variable with variable name 'GNUARMEMB_TOOLCHAIN_PATH' and value set to wherever you installed your toolchain. **Make sure this path does not contain any spaces.** If it does, rename the folder and update here. Click OK to save. - -![Adding GNUARMEMB variable](../assets/env-var/gnuarmemb.png) - -6. Close Command Prompt and reopen, or run `refreshenv` to apply the changes. - - - - - -#### For Zephyr - -By default, the Zephyr™ SDK will create a file named `~/.zephyrrc` with the correct environment variables to build ZMK. -We suggest two main [options](https://docs.zephyrproject.org/2.5.0/guides/env_vars.html#option-3-using-zephyrrc-files) for how to load those settings. - -##### Per Shell - -To load the Zephyr environment properly for just one transient shell, run the following from your ZMK checkout directory: - -``` -source zephyr/zephyr-env.sh -``` - -##### All Shells - -To load the environment variables for your shell every time, -append the existing `~/.zephyrrc` file to your shell's RC file and then start a new shell. - - - - - -``` -cat ~/.zephyrrc >> ~/.bashrc +pip3 install --user -r zephyr/scripts/requirements.txt ``` + - - -``` -cat ~/.zephyrrc >> ~/.zshrc +```sh +pip3 install -r zephyr/scripts/requirements.txt ``` + - - - - +```sh +pip3 install -r zephyr/scripts/requirements.txt +``` + + From fbdb24c6fe56a576e288db3acfd91dd67a6ff192 Mon Sep 17 00:00:00 2001 From: zhiayang Date: Wed, 21 Dec 2022 17:45:01 +0800 Subject: [PATCH 272/494] fix(driver): Fix potentially buggy read/write routines for max7318 driver --- app/drivers/gpio/gpio_max7318.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/app/drivers/gpio/gpio_max7318.c b/app/drivers/gpio/gpio_max7318.c index 3dcc710c..ac9c5341 100644 --- a/app/drivers/gpio/gpio_max7318.c +++ b/app/drivers/gpio/gpio_max7318.c @@ -72,17 +72,19 @@ struct max7318_drv_data { static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) { const struct max7318_config *config = dev->config; - uint16_t data = 0; - int ret = i2c_burst_read_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); + uint8_t data[2] = { 0 }; + int ret = i2c_burst_read_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); if (ret) { - LOG_DBG("i2c_write_read FAIL %d\n", ret); + LOG_DBG("i2c_burst_read FAIL %d\n", ret); return ret; } - *buf = sys_le16_to_cpu(data); + // the first register is data[0], the second one is data[1] + // since we only ever read the PORTA registers here, it's effectively little endian. + *buf = sys_get_le16(data); - LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (*buf & 0xFF), (reg + 1), - (*buf >> 8)); + LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), + data[1]); return 0; } @@ -105,9 +107,13 @@ static int write_registers(const struct device *dev, uint8_t reg, uint16_t value LOG_DBG("max7318: write: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), (value >> 8)); - uint16_t data = sys_cpu_to_le16(value); + uint8_t data[2] = { 0 }; - return i2c_burst_write_dt(&config->i2c_bus, reg, (uint8_t *)&data, sizeof(data)); + // bits 0..7 are port A, 8..15 are port B, so we should write bits 0..7 first + // -- ie. this is little endian also. + sys_put_le16(value, &data[0]); + + return i2c_burst_write_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); } /** From 41830ce19a71ac94a2e620d59c4d0a03ca6d093c Mon Sep 17 00:00:00 2001 From: zhiayang Date: Sun, 8 Jan 2023 16:52:38 +0800 Subject: [PATCH 273/494] fix formatting --- app/drivers/gpio/gpio_max7318.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/drivers/gpio/gpio_max7318.c b/app/drivers/gpio/gpio_max7318.c index ac9c5341..04424b48 100644 --- a/app/drivers/gpio/gpio_max7318.c +++ b/app/drivers/gpio/gpio_max7318.c @@ -72,7 +72,7 @@ struct max7318_drv_data { static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) { const struct max7318_config *config = dev->config; - uint8_t data[2] = { 0 }; + uint8_t data[2] = {0}; int ret = i2c_burst_read_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); if (ret) { LOG_DBG("i2c_burst_read FAIL %d\n", ret); @@ -83,8 +83,7 @@ static int read_registers(const struct device *dev, uint8_t reg, uint16_t *buf) // since we only ever read the PORTA registers here, it's effectively little endian. *buf = sys_get_le16(data); - LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), - data[1]); + LOG_DBG("max7318: read: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, data[0], (reg + 1), data[1]); return 0; } @@ -107,7 +106,7 @@ static int write_registers(const struct device *dev, uint8_t reg, uint16_t value LOG_DBG("max7318: write: reg[0x%X] = 0x%X, reg[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), (value >> 8)); - uint8_t data[2] = { 0 }; + uint8_t data[2] = {0}; // bits 0..7 are port A, 8..15 are port B, so we should write bits 0..7 first // -- ie. this is little endian also. From 2a5e914a777e4569bfbf08921750b928323d155b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jan 2023 03:40:37 +0000 Subject: [PATCH 274/494] chore(deps): bump json5 from 2.2.1 to 2.2.3 in /docs Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 69ee0fc4..c4cad7c0 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9158,9 +9158,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -22650,9 +22650,9 @@ "dev": true }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", From 9d1070a140942f2e48dfbb811b07d3ad8a71d594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Bol=C3=ADvar?= Date: Wed, 1 Feb 2023 08:17:23 -0800 Subject: [PATCH 275/494] chore(build): update west.yml syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit West has supported a 'name-blocklist' replacement for 'name-blacklist' since v0.9. Signed-off-by: Martí Bolívar --- app/west.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/west.yml b/app/west.yml index a0c56501..b0f05aed 100644 --- a/app/west.yml +++ b/app/west.yml @@ -10,8 +10,7 @@ manifest: revision: v3.0.0+zmk-fixes clone-depth: 1 import: - # TODO: Rename once upstream offers option like `exclude` or `denylist` - name-blacklist: + name-blocklist: - ci-tools - hal_altera - hal_cypress From b7d5865e40eeaf7999a73fdaff1d7043babbc73e Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Thu, 2 Feb 2023 17:07:33 +0800 Subject: [PATCH 276/494] feat(docs): additional note on bug fixed in macOS v13.1 --- docs/docs/troubleshooting.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index a535a4ef..96f729b9 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -23,7 +23,7 @@ Variations of the warnings shown below occur when flashing the `.uf2` ### macOS Ventura error -macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. +macOS 13.0 (Ventura) Finder may report an error code 100093 when copying `.uf2` files into microcontrollers. This bug is limited to the operating system's Finder. You can work around it by copying on Terminal command line or use a third party file manager. Issue is fixed in macOS version 13.1. ### CMake Error From c065d451cb82e2dceda4efdb2991aeeeef1cdbbf Mon Sep 17 00:00:00 2001 From: Omri Kaplan Date: Wed, 8 Feb 2023 03:29:38 +0200 Subject: [PATCH 277/494] fix(shields): Fix keycodes that differ from the default keymap (#1590) - Asterisk in layer 1 was mapped to 8 - Underscore in layer 1 was mapped to minus - Right GUI in layer 0 was mapped to right Alt - Space in layer 1 was mapped to Return - Plus was mapped with KP_PLUS --- app/boards/shields/reviung41/reviung41.keymap | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/boards/shields/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index f0450b19..d291ca8b 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -23,26 +23,26 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RSHFT RET - &kp LALT &mo 1 &kp SPACE &mo 2 &kp RALT + &kp LALT &mo 1 &kp SPACE &mo 2 &kp RGUI >; }; lower_layer { -// ---------------------------------------------------------------------------------- -// | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | -// | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | -// | | ESC | GUI | ALT | CAPS| " | | HOME| END | PGUP| PGDN| PRSC| SHFT(RET) | +// ------------------------------------------------------------------------------------ +// | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | DEL | +// | | _ | + | { | } | "|" | | LFT | DWN | UP | RGT | ` | ~ | +// | | ESC | GUI | ALT | CAPS| " | | HOME| END | PGUP| PGDN| PRSC| SHFT(SPACE) | // | | | RET | ADJ | | bindings = < - &trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp N8 &kp LPAR &kp RPAR &kp DEL - &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp GRAVE &kp TILDE - &trans &kp ESC &kp LGUI &kp LALT &kp CLCK &kp DQT &kp HOME &kp END &kp PG_UP &kp PG_DN &kp PSCRN &mt RSHFT RET + &trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL + &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp GRAVE &kp TILDE + &trans &kp ESC &kp LGUI &kp LALT &kp CLCK &kp DQT &kp HOME &kp END &kp PG_UP &kp PG_DN &kp PSCRN &mt RSHFT SPACE &trans &trans &kp RET &mo 3 &trans >; }; raise_layer { -// ----------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 | // | | ESC | GUI | ALT | CAPS| " | | F7 | F8 | F9 | F10 | F11 | F12 | From 72624a41fa627b143124f68ac38af72d18722015 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 18 Feb 2023 22:29:03 -0800 Subject: [PATCH 278/494] fix(shields): Add missing col-offsets for extra transforms --- app/boards/shields/corne/corne_right.overlay | 4 ++++ app/boards/shields/jian/jian_right.overlay | 8 ++++++++ app/boards/shields/jiran/jiran_right.overlay | 8 ++++++++ app/boards/shields/jorne/jorne_right.overlay | 8 ++++++++ app/boards/shields/kyria/kyria_rev2_right.overlay | 4 ++++ app/boards/shields/kyria/kyria_right.overlay | 4 ++++ 6 files changed, 36 insertions(+) diff --git a/app/boards/shields/corne/corne_right.overlay b/app/boards/shields/corne/corne_right.overlay index 6e79a858..1d7ed9ec 100644 --- a/app/boards/shields/corne/corne_right.overlay +++ b/app/boards/shields/corne/corne_right.overlay @@ -10,6 +10,10 @@ col-offset = <6>; }; +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jian/jian_right.overlay b/app/boards/shields/jian/jian_right.overlay index f3b0da3d..cac83fd3 100644 --- a/app/boards/shields/jian/jian_right.overlay +++ b/app/boards/shields/jian/jian_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&crkbd_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 16 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jiran/jiran_right.overlay b/app/boards/shields/jiran/jiran_right.overlay index 75b9fb5a..c3648797 100644 --- a/app/boards/shields/jiran/jiran_right.overlay +++ b/app/boards/shields/jiran/jiran_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&jian_transform { + col-offset = <6>; +}; + +&crkbd_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 7 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/jorne/jorne_right.overlay b/app/boards/shields/jorne/jorne_right.overlay index 4f138b0b..698bf9dd 100644 --- a/app/boards/shields/jorne/jorne_right.overlay +++ b/app/boards/shields/jorne/jorne_right.overlay @@ -10,6 +10,14 @@ col-offset = <6>; }; +&crkbd_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + &kscan0 { col-gpios = <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 7476bcba..08dc59d1 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -10,6 +10,10 @@ col-offset = <8>; }; +&five_column_transform { + col-offset = <7>; +}; + &kscan0 { row-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index eefd76bf..b3b3420e 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -10,6 +10,10 @@ col-offset = <8>; }; +&five_column_transform { + col-offset = <7>; +}; + &kscan0 { col-gpios = <&pro_micro 10 GPIO_ACTIVE_HIGH> From 5d22d76d726afbe67ba0e8dc908c342641ab8f58 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 18 Feb 2023 22:31:23 -0800 Subject: [PATCH 279/494] fix(shields): Fix Kyria five column transforms --- app/boards/shields/kyria/kyria.dtsi | 8 ++++---- app/boards/shields/kyria/kyria_rev2.dtsi | 10 +++++----- app/boards/shields/kyria/kyria_rev2_right.overlay | 2 +- app/boards/shields/kyria/kyria_right.overlay | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/boards/shields/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index 1b0ca940..cffe23b0 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -36,10 +36,10 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) columns = <14>; rows = <4>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) >; }; }; diff --git a/app/boards/shields/kyria/kyria_rev2.dtsi b/app/boards/shields/kyria/kyria_rev2.dtsi index 7c7d9efe..b40af365 100644 --- a/app/boards/shields/kyria/kyria_rev2.dtsi +++ b/app/boards/shields/kyria/kyria_rev2.dtsi @@ -36,10 +36,10 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) columns = <14>; rows = <4>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) +RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) + RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) >; }; }; @@ -52,4 +52,4 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) &right_encoder { a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 08dc59d1..9e29c6f7 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -11,7 +11,7 @@ }; &five_column_transform { - col-offset = <7>; + col-offset = <8>; }; &kscan0 { diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index b3b3420e..00ba5b2f 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -11,7 +11,7 @@ }; &five_column_transform { - col-offset = <7>; + col-offset = <8>; }; &kscan0 { From 0c0ebda65b6f384b8bd827365cd5d23702bc04b3 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 22:17:12 -0800 Subject: [PATCH 280/494] fix(keymap): Fix default Ergodash keymap --- app/boards/shields/ergodash/ergodash.keymap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index 65cc1178..a85c58a6 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -53,7 +53,7 @@ * .----------------------------------------------------------------------------------------------------------------------. */ /* FIXME boot and reset are not yet locale aware */ bindings = < -&kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp &none &kp &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 +&kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &none &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &trans &bootloader &reset &none &none &none &none &none &none &none &none &none &none &trans From 3eee53676f793fb352d6cabe9e471106b7878fbb Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 22:06:56 -0800 Subject: [PATCH 281/494] fix(shields): Fix missing binding in eek keymap --- app/boards/shields/eek/eek.keymap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index f54dc013..439c90aa 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -48,9 +48,9 @@ bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &out OUT_USB &out OUT_BLE &none &kp EQUAL &kp MINUS &kp CAPS &kp F5 &kp F6 &kp F7 &kp F8 &kp LBKT &kp RBKT &none &kp GRAVE &kp BSLH - &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &kp RSHFT + &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &none &kp RSHFT &kp LCTRL &kp LGUI &kp LALT &reset &none &trans >; }; }; -}; \ No newline at end of file +}; From 1d65661efa3e19db59d453df6eb1139fb97df836 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 20 Feb 2023 23:24:11 -0800 Subject: [PATCH 282/494] fix(keymap): Fix tidbit keymap --- app/boards/shields/tidbit/tidbit.keymap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 646a5db7..7fa98af2 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -26,7 +26,7 @@ bindings = < &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp &none + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER &none &kp KP_NUMBER_0 &kp KP_DOT &none >; From 719de801e7b39bf9a7e89e468cc9f46f824146f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 01:29:24 +0000 Subject: [PATCH 283/494] chore(deps): bump @sideway/formula from 3.0.0 to 3.0.1 in /docs Bumps [@sideway/formula](https://github.com/sideway/formula) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/sideway/formula/releases) - [Commits](https://github.com/sideway/formula/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: "@sideway/formula" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index c4cad7c0..93a980c2 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -3045,9 +3045,9 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", @@ -18139,9 +18139,9 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "@sideway/pinpoint": { "version": "2.0.0", From 5ef6f2f2b7fc059f4992b70752be5f79b1bca129 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Feb 2023 05:50:58 +0000 Subject: [PATCH 284/494] chore(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 in /docs Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 93a980c2..fbc859e5 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8281,9 +8281,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-deceiver": { "version": "1.2.7", @@ -22047,9 +22047,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-deceiver": { "version": "1.2.7", From 89044079839b156eeb4a3da497d1dab904290f31 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Sat, 28 Jan 2023 17:15:49 -0500 Subject: [PATCH 285/494] feat(underglow): use float for HSB to RGB calculation --- app/src/rgb_underglow.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 25d4466e..18614a4e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -75,15 +75,15 @@ static struct zmk_led_hsb hsb_scale_zero_max(struct zmk_led_hsb hsb) { } static struct led_rgb hsb_to_rgb(struct zmk_led_hsb hsb) { - double r, g, b; + float r, g, b; uint8_t i = hsb.h / 60; - double v = hsb.b / ((float)BRT_MAX); - double s = hsb.s / ((float)SAT_MAX); - double f = hsb.h / ((float)HUE_MAX) * 6 - i; - double p = v * (1 - s); - double q = v * (1 - f * s); - double t = v * (1 - (1 - f) * s); + float v = hsb.b / ((float)BRT_MAX); + float s = hsb.s / ((float)SAT_MAX); + float f = hsb.h / ((float)HUE_MAX) * 6 - i; + float p = v * (1 - s); + float q = v * (1 - f * s); + float t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: From 6cb42a80607c8bf8a493ac2c781568462aa8ce13 Mon Sep 17 00:00:00 2001 From: Robert U <978080+urob@users.noreply.github.com> Date: Sun, 12 Mar 2023 12:24:00 -0400 Subject: [PATCH 286/494] feat(behaviors): On-release option for positional-hold-taps --- .../behaviors/zmk,behavior-hold-tap.yaml | 2 ++ app/src/behaviors/behavior_hold_tap.c | 8 ++++++-- .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-no-trigger/events.patterns | 4 ++++ .../keycode_events.snapshot | 12 ++++++++++++ .../native_posix_64.keymap | 17 +++++++++++++++++ .../on-release-trigger/events.patterns | 4 ++++ .../on-release-trigger/keycode_events.snapshot | 12 ++++++++++++ .../on-release-trigger/native_posix_64.keymap | 17 +++++++++++++++++ docs/docs/behaviors/hold-tap.md | 3 +++ 21 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot create mode 100644 app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index e4cfaeab..a2affbf2 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -37,3 +37,5 @@ properties: type: array required: false default: [] + hold-trigger-on-release: + type: boolean diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index f09006ed..a9e4d642 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -60,6 +60,7 @@ struct behavior_hold_tap_config { bool global_quick_tap; enum flavor flavor; bool retro_tap; + bool hold_trigger_on_release; int32_t hold_trigger_key_positions_len; int32_t hold_trigger_key_positions[]; }; @@ -587,9 +588,11 @@ static int position_state_changed_listener(const zmk_event_t *eh) { } // Store the position of pressed key for positional hold-tap purposes. - if ((ev->state) // i.e. key pressed (not released) + if ((undecided_hold_tap->config->hold_trigger_on_release != + ev->state) // key has been pressed and hold_trigger_on_release is not set, or key + // has been released and hold_trigger_on_release is set && (undecided_hold_tap->position_of_first_other_key_pressed == - -1) // i.e. no other key has been pressed yet + -1) // no other key has been pressed yet ) { undecided_hold_tap->position_of_first_other_key_pressed = ev->position; } @@ -703,6 +706,7 @@ static int behavior_hold_tap_init(const struct device *dev) { .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ + .hold_trigger_on_release = DT_INST_PROP(n, hold_trigger_on_release), \ .hold_trigger_key_positions = DT_INST_PROP(n, hold_trigger_key_positions), \ .hold_trigger_key_positions_len = DT_INST_PROP_LEN(n, hold_trigger_key_positions), \ }; \ diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..24a8b033 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (balanced decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..942d5ae4 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_bal { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..fb5587b1 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (balanced decision moment other-key-up) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..677a2534 --- /dev/null +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_bal { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..1df24b0c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..b48332ff --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_hold { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..e35848cd --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided hold-interrupt (hold-preferred decision moment other-key-down) +kp_pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..77398582 --- /dev/null +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&ht_hold { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot new file mode 100644 index 00000000..d72f20d6 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +ht_decide: 0 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap new file mode 100644 index 00000000..504318f7 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&tp { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns new file mode 100644 index 00000000..fdf2b15c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode/kp/p +s/.*mo_keymap_binding/mo/p +s/.*on_hold_tap_binding/ht_binding/p +s/.*decide_hold_tap/ht_decide/p \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot new file mode 100644 index 00000000..a330a93c --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/keycode_events.snapshot @@ -0,0 +1,12 @@ +ht_binding_pressed: 0 new undecided hold_tap +ht_decide: 0 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_pressed: 1 new undecided hold_tap +ht_decide: 1 decided tap (tap-preferred decision moment key-up) +kp_pressed: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x07 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x0D implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 1 cleaning up hold-tap +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +ht_binding_released: 0 cleaning up hold-tap diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap new file mode 100644 index 00000000..7061eee7 --- /dev/null +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -0,0 +1,17 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&tp { hold-trigger-on-release; }; + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 793e350d..1dfb8e5d 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -132,6 +132,9 @@ See the following example, which uses a hold-tap behavior definition, configured - The sequence `(pht_down, W_down, W_up, pht_up)` produces `W`. The normal hold behavior (LEFT_SHIFT) **is NOT** modified into a tap behavior (Q) by positional hold-tap because the first key pressed after the hold-tap key is the `W key`, which is in position 1, which **IS** included in `hold-trigger-key-positions`. - If the `LEFT_SHIFT / Q key` is held by itself for longer than `tapping-term-ms`, a hold behavior is produced. This is because positional hold-tap only modifies the behavior of a hold-tap if another key is pressed before the `tapping-term-ms` period expires. +By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after +the hold-tap. For homerow mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. + ### Example Use-Cases Date: Wed, 22 Mar 2023 01:42:11 +0100 Subject: [PATCH 287/494] fix(boards): Disable CDC by default for CiZ The default configuration for corneish-zen enables a USB CDC endpoint by default. This is most probably a debugging left-over. Disable that endpoint. CONFIG_ZMK_USB_LOGGING depends on it anyway, so it will be enabled again with that config option set. --- .../corneish_zen/corneish_zen_v2_left_defconfig | 16 ---------------- .../corneish_zen/corneish_zen_v2_right_defconfig | 9 --------- 2 files changed, 25 deletions(-) diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index eb1e552a..4e676147 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -73,19 +73,3 @@ CONFIG_ZMK_WIDGET_LAYER_STATUS=n #CONFIG_LVGL_LOG_LEVEL_DBG=y #CONFIG_LVGL_USE_DEBUG=y #CONFIG_SENSOR_LOG_LEVEL_DBG=y - -# Turn on USB CDC ACM device -CONFIG_USB_DEVICE_STACK=y -CONFIG_USB_CDC_ACM=y -CONFIG_USB_CDC_ACM_RINGBUF_SIZE=1024 - -# Enable serial console -CONFIG_SERIAL=y -CONFIG_CONSOLE=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y - -# Enable USB UART -CONFIG_UART_CONSOLE=y - - diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 46b40dee..02039b8d 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -72,12 +72,3 @@ CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n #CONFIG_LVGL_LOG_LEVEL_DBG=y #CONFIG_LVGL_USE_DEBUG=y #CONFIG_SENSOR_LOG_LEVEL_DBG=y - -# Enable serial console -CONFIG_SERIAL=y -CONFIG_CONSOLE=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_UART_LINE_CTRL=y - -# Enable USB UART -CONFIG_UART_CONSOLE=y From cd64c59b39754477533e6dd7ad1055f07de92bb0 Mon Sep 17 00:00:00 2001 From: prdktntwcklr <61001903+prdktntwcklr@users.noreply.github.com> Date: Wed, 8 Mar 2023 01:12:11 +0000 Subject: [PATCH 288/494] fix(tests): ignore line endings --- app/run-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/run-test.sh b/app/run-test.sh index 068fdbb4..94438f34 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -33,7 +33,7 @@ if [ $? -gt 0 ]; then fi ./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log -diff -au $testcase/keycode_events.snapshot build/$testcase/keycode_events.log +diff -auZ $testcase/keycode_events.snapshot build/$testcase/keycode_events.log if [ $? -gt 0 ]; then if [ -f $testcase/pending ]; then echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log From ae8299edb3d638f1332475b1da0fdf40afa43fe4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 25 Mar 2023 13:17:16 -0400 Subject: [PATCH 289/494] fix(boards): Move the CDC ACM node under the USBD. * Ferris board's CDC ACM node was accidentally nested under the wrong node, causing USB logging builds to fail with cryptic error. --- app/boards/arm/ferris/ferris_rev02.dts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index dbf3f6e2..50de9526 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -116,6 +116,10 @@ &usb { status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hsi { @@ -139,10 +143,6 @@ &rtc { status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; }; &flash0 { From 168b32b8288ba36831f262f82bfa166240506676 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 16 Jan 2023 00:40:53 -0500 Subject: [PATCH 290/494] refactor: Move to Zephyr 3.2 branch. --- app/west.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/west.yml b/app/west.yml index b0f05aed..ffa36ca3 100644 --- a/app/west.yml +++ b/app/west.yml @@ -7,7 +7,7 @@ manifest: projects: - name: zephyr remote: zmkfirmware - revision: v3.0.0+zmk-fixes + revision: v3.2.0+zmk-fixes clone-depth: 1 import: name-blocklist: From 69a4c3200d8c9c92e3e3c68bbd4969f19df70133 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 23:33:42 -0500 Subject: [PATCH 291/494] refactor(display): Updates for LVGL v8.x changes. * LV_ prefix from new LVGL official Kconfig now used. * API changes for themes, container object removal, etc. * Add our own Kconfig and code for theme default small font. * Remove some hardcoded sizes. --- app/boards/arm/corneish_zen/Kconfig.defconfig | 12 +- .../corneish_zen_v2_left_defconfig | 20 ++- .../corneish_zen_v2_right_defconfig | 20 ++- .../arm/corneish_zen/custom_status_screen.c | 38 +++--- .../arm/corneish_zen/widgets/battery_status.c | 9 +- .../arm/corneish_zen/widgets/battery_status.h | 4 +- .../arm/corneish_zen/widgets/layer_status.c | 8 +- .../arm/corneish_zen/widgets/layer_status.h | 4 +- .../arm/corneish_zen/widgets/output_status.c | 10 +- .../arm/corneish_zen/widgets/output_status.h | 4 +- .../corneish_zen/widgets/peripheral_status.c | 8 +- .../corneish_zen/widgets/peripheral_status.h | 4 +- app/boards/shields/corne/Kconfig.defconfig | 10 +- .../shields/elephant42/Kconfig.defconfig | 10 +- app/boards/shields/jorne/Kconfig.defconfig | 10 +- .../shields/knob_goblin/Kconfig.defconfig | 10 +- app/boards/shields/kyria/Kconfig.defconfig | 10 +- app/boards/shields/leeloo/Kconfig.defconfig | 10 +- app/boards/shields/lily58/Kconfig.defconfig | 10 +- app/boards/shields/lotus58/Kconfig.defconfig | 10 +- app/boards/shields/microdox/Kconfig.defconfig | 10 +- app/boards/shields/murphpad/Kconfig.defconfig | 10 +- app/boards/shields/nibble/Kconfig.defconfig | 10 +- .../shields/nice_view/Kconfig.defconfig | 8 +- app/boards/shields/nice_view/nice_view.conf | 4 +- app/boards/shields/snap/Kconfig.defconfig | 10 +- app/boards/shields/sofle/Kconfig.defconfig | 10 +- .../splitkb_aurora_corne/Kconfig.defconfig | 10 +- .../splitkb_aurora_lily58/Kconfig.defconfig | 10 +- .../splitkb_aurora_sweep/Kconfig.defconfig | 10 +- app/boards/shields/tidbit/Kconfig.defconfig | 10 +- .../shields/waterfowl/Kconfig.defconfig | 10 +- app/boards/shields/zodiark/Kconfig.defconfig | 10 +- app/src/display/Kconfig | 119 +++++++++++++++--- app/src/display/main.c | 45 ++++--- app/src/display/status_screen.c | 29 ++--- app/src/display/theme.c | 73 +++++++++++ app/src/display/theme.h | 65 ++++++++++ app/src/display/widgets/Kconfig | 10 +- app/src/display/widgets/battery_status.c | 5 +- app/src/display/widgets/layer_status.c | 4 +- app/src/display/widgets/output_status.c | 4 +- app/src/display/widgets/peripheral_status.c | 4 +- app/src/display/widgets/wpm_status.c | 8 +- 44 files changed, 463 insertions(+), 246 deletions(-) create mode 100644 app/src/display/theme.c create mode 100644 app/src/display/theme.h diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index a88cc5ca..33ce1256 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -42,12 +42,12 @@ config USB_DEVICE_STACK endif # USB config ZMK_DISPLAY - select LVGL_USE_CONT - select LVGL_FONT_MONTSERRAT_26 - select LVGL_FONT_MONTSERRAT_20 - select LVGL_FONT_MONTSERRAT_16 - select LVGL_USE_LABEL - select LVGL_USE_IMG + select LV_USE_CONT + select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_20 + select LV_FONT_MONTSERRAT_16 + select LV_USE_LABEL + select LV_USE_IMG choice ZMK_DISPLAY_STATUS_SCREEN default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 4e676147..42e27037 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -39,17 +39,15 @@ CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_SSD1306=n CONFIG_IL0323=y -CONFIG_LVGL_BITS_PER_PIXEL=1 -CONFIG_LVGL_COLOR_DEPTH_1=y -CONFIG_LVGL_DPI=145 -CONFIG_LVGL_VDB_SIZE=100 -CONFIG_LVGL_USE_THEME_MONO=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y # custom status screens CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 02039b8d..e9b36f2e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -39,17 +39,15 @@ CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 CONFIG_SSD1306=n CONFIG_IL0323=y -CONFIG_LVGL_BITS_PER_PIXEL=1 -CONFIG_LVGL_COLOR_DEPTH_1=y -CONFIG_LVGL_DPI=145 -CONFIG_LVGL_VDB_SIZE=100 -CONFIG_LVGL_USE_THEME_MONO=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_RED=n -CONFIG_LVGL_THEME_DEFAULT_COLOR_PRIMARY_BLACK=y -CONFIG_LVGL_THEME_DEFAULT_COLOR_SECONDARY_WHITE=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_16=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y # custom status screens CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c index 7842925e..c45a6243 100644 --- a/app/boards/arm/corneish_zen/custom_status_screen.c +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -11,7 +11,7 @@ #include "widgets/layer_status.h" #include "custom_status_screen.h" -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LV_IMG_DECLARE(zenlogo); @@ -36,50 +36,42 @@ static struct zmk_widget_layer_status layer_status_widget; lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - screen = lv_obj_create(NULL, NULL); + screen = lv_obj_create(NULL); #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); - lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_MID, - 0, 2); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), LV_ALIGN_TOP_MID, 0, 2); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS) zmk_widget_output_status_init(&output_status_widget, screen); - lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_MID, 0, - 41); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), LV_ALIGN_TOP_MID, 0, 41); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS) zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); - lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, - LV_ALIGN_IN_TOP_MID, 0, 41); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), LV_ALIGN_TOP_MID, 0, + 41); #endif #if IS_ENABLED(CONFIG_CUSTOM_WIDGET_LAYER_STATUS) - zmk_widget_layer_status_init(&layer_status_widget, screen); - lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), - LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, - lv_theme_get_font_small()); - lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_MID, 0, - -5); - lv_obj_t *LayersHeading; - LayersHeading = lv_img_create(screen, NULL); - lv_obj_align(LayersHeading, NULL, LV_ALIGN_IN_BOTTOM_MID, 8, 5); + LayersHeading = lv_img_create(screen); + lv_obj_align(LayersHeading, LV_ALIGN_BOTTOM_MID, 0, -30); lv_img_set_src(LayersHeading, &layers2); + + zmk_widget_layer_status_init(&layer_status_widget, screen); + lv_obj_set_style_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + &lv_font_montserrat_16, LV_PART_MAIN); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), LV_ALIGN_BOTTOM_MID, 0, -5); #endif #if !IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) lv_obj_t *zenlogo_icon; - zenlogo_icon = lv_img_create(screen, NULL); + zenlogo_icon = lv_img_create(screen); lv_img_set_src(zenlogo_icon, &zenlogo); - lv_obj_align(zenlogo_icon, NULL, LV_ALIGN_IN_BOTTOM_MID, 2, -5); + lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 2, -5); #endif - // lv_task_handler(); - lv_refr_now(NULL); - // display_blanking_off(display_dev); - return screen; } diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.c b/app/boards/arm/corneish_zen/widgets/battery_status.c index 7dfd51e8..9a2189d1 100644 --- a/app/boards/arm/corneish_zen/widgets/battery_status.c +++ b/app/boards/arm/corneish_zen/widgets/battery_status.c @@ -5,15 +5,14 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include "battery_status.h" -#include #include #include #include @@ -84,7 +83,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); widget_battery_status_init(); diff --git a/app/boards/arm/corneish_zen/widgets/battery_status.h b/app/boards/arm/corneish_zen/widgets/battery_status.h index 21a4efb8..d493c582 100644 --- a/app/boards/arm/corneish_zen/widgets/battery_status.h +++ b/app/boards/arm/corneish_zen/widgets/battery_status.h @@ -9,7 +9,7 @@ #include -#include +#include struct zmk_widget_battery_status { sys_snode_t node; @@ -17,4 +17,4 @@ struct zmk_widget_battery_status { }; int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_battery_status_obj(struct zmk_widget_battery_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.c b/app/boards/arm/corneish_zen/widgets/layer_status.c index a309a787..3dc33613 100644 --- a/app/boards/arm/corneish_zen/widgets/layer_status.c +++ b/app/boards/arm/corneish_zen/widgets/layer_status.c @@ -5,8 +5,8 @@ * */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -54,7 +54,7 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, laye ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); @@ -64,4 +64,4 @@ int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_ lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) { return widget->obj; -} \ No newline at end of file +} diff --git a/app/boards/arm/corneish_zen/widgets/layer_status.h b/app/boards/arm/corneish_zen/widgets/layer_status.h index 04f32faa..c03433c5 100644 --- a/app/boards/arm/corneish_zen/widgets/layer_status.h +++ b/app/boards/arm/corneish_zen/widgets/layer_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_layer_status { sys_snode_t node; @@ -16,4 +16,4 @@ struct zmk_widget_layer_status { }; int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c index bd69bbb1..ad0c2b1a 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.c +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -5,10 +5,10 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -123,9 +123,7 @@ ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/output_status.h b/app/boards/arm/corneish_zen/widgets/output_status.h index c171e2bb..ba92f893 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.h +++ b/app/boards/arm/corneish_zen/widgets/output_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_output_status { sys_snode_t node; @@ -16,4 +16,4 @@ struct zmk_widget_output_status { }; int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_output_status_obj(struct zmk_widget_output_status *widget); diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.c b/app/boards/arm/corneish_zen/widgets/peripheral_status.c index e18414be..39b62fde 100644 --- a/app/boards/arm/corneish_zen/widgets/peripheral_status.c +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.c @@ -5,10 +5,10 @@ * */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -48,7 +48,7 @@ ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent) { - widget->obj = lv_img_create(parent, NULL); + widget->obj = lv_img_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/boards/arm/corneish_zen/widgets/peripheral_status.h b/app/boards/arm/corneish_zen/widgets/peripheral_status.h index 59675763..82fe2105 100644 --- a/app/boards/arm/corneish_zen/widgets/peripheral_status.h +++ b/app/boards/arm/corneish_zen/widgets/peripheral_status.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include struct zmk_widget_peripheral_status { sys_snode_t node; @@ -17,4 +17,4 @@ struct zmk_widget_peripheral_status { int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent); -lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); \ No newline at end of file +lv_obj_t *zmk_widget_peripheral_status_obj(struct zmk_widget_peripheral_status *widget); diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index 9160555c..acf542d7 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -28,17 +28,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index 1e93762c..e507f2c6 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 64eb32b8..4664debf 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/knob_goblin/Kconfig.defconfig b/app/boards/shields/knob_goblin/Kconfig.defconfig index 300fb4eb..d8d468ed 100644 --- a/app/boards/shields/knob_goblin/Kconfig.defconfig +++ b/app/boards/shields/knob_goblin/Kconfig.defconfig @@ -21,17 +21,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 0da8a18d..cdb57b6b 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index a4295d1e..36306757 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -32,17 +32,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index a5e6fbe8..97cecce1 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index 57ae5ef6..56eef359 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 7bf40b8b..28f8c811 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 9f491564..07e71826 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -21,17 +21,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index a1683f3a..d5e8cbeb 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -25,17 +25,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index a699a813..22c5f647 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_NICE_VIEW config ZMK_DISPLAY - select LVGL_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_26 if ZMK_DISPLAY @@ -17,11 +17,11 @@ config LS0XX config ZMK_WIDGET_WPM_STATUS default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # ZMK_DISPLAY diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index 2c1d6c71..ff57c07c 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -1,5 +1,5 @@ # Enable nice!view CONFIG_ZMK_DISPLAY=y -CONFIG_LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_26=y -CONFIG_LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_26=y +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index 24a8e5cc..fa02421a 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 69dac3f2..1c1c5604 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 5a1eeb13..29de8d7e 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index bbaef0ff..3c8d5f58 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index 51fbc28c..4a2b8973 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -37,17 +37,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index 013a0a7c..e3655a9e 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -22,17 +22,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 897184f6..70029f0b 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -29,17 +29,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 76bfcbd4..77648afd 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -31,17 +31,17 @@ endif # ZMK_DISPLAY if LVGL -config LVGL_VDB_SIZE +config LV_Z_VDB_SIZE default 64 -config LVGL_DPI +config LV_Z_DPI default 148 -config LVGL_BITS_PER_PIXEL +config LV_Z_BITS_PER_PIXEL default 1 -choice LVGL_COLOR_DEPTH - default LVGL_COLOR_DEPTH_1 +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index c0753358..32be2a27 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,8 +6,9 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LVGL_THEMES - select LVGL_THEME_MONO + select LV_THEMES + select LV_THEME_MONO + select LV_CONF_MINIMAL if ZMK_DISPLAY @@ -15,17 +16,26 @@ config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" default y if SSD1306 -choice LVGL_TXT_ENC - default LVGL_TXT_ENC_UTF8 +choice LV_TXT_ENC + default LV_TXT_ENC_UTF8 endchoice +config LV_MEM_CUSTOM + default y + +config LV_Z_MEM_POOL_MIN_SIZE + default 32 + +config LV_Z_MEM_POOL_MAX_SIZE + default 8192 + choice ZMK_DISPLAY_STATUS_SCREEN prompt "Default status screen for displays" config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN bool "Built in status screen" - select LVGL_OBJ_LABEL + select LV_OBJ_LABEL config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM bool "Custom status screen" @@ -57,24 +67,105 @@ endif # ZMK_DISPLAY_WORK_QUEUE_DEDICATED if ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN -config LVGL_FONT_MONTSERRAT_16 +config LV_FONT_MONTSERRAT_16 default y -choice LVGL_THEME_DEFAULT_FONT_NORMAL - default LVGL_THEME_DEFAULT_FONT_NORMAL_MONTSERRAT_16 +choice LV_FONT_DEFAULT + default LV_FONT_DEFAULT_MONTSERRAT_16 endchoice -config LVGL_FONT_MONTSERRAT_12 +config LV_FONT_MONTSERRAT_12 default y - -choice LVGL_THEME_DEFAULT_FONT_SMALL - default LVGL_THEME_DEFAULT_FONT_SMALL_MONTSERRAT_12 - -endchoice endif # ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN +choice ZMK_LV_FONT_DEFAULT_SMALL + prompt "Select theme default small font" + default ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12 + help + Select theme default small font + + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8 + bool "Montserrat 8" + select LV_FONT_MONTSERRAT_8 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12 + bool "Montserrat 12" + select LV_FONT_MONTSERRAT_12 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14 + bool "Montserrat 14" + select LV_FONT_MONTSERRAT_14 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16 + bool "Montserrat 16" + select LV_FONT_MONTSERRAT_16 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18 + bool "Montserrat 18" + select LV_FONT_MONTSERRAT_18 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20 + bool "Montserrat 20" + select LV_FONT_MONTSERRAT_20 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22 + bool "Montserrat 22" + select LV_FONT_MONTSERRAT_22 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24 + bool "Montserrat 24" + select LV_FONT_MONTSERRAT_24 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26 + bool "Montserrat 26" + select LV_FONT_MONTSERRAT_26 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28 + bool "Montserrat 28" + select LV_FONT_MONTSERRAT_28 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30 + bool "Montserrat 30" + select LV_FONT_MONTSERRAT_30 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32 + bool "Montserrat 32" + select LV_FONT_MONTSERRAT_32 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34 + bool "Montserrat 34" + select LV_FONT_MONTSERRAT_34 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36 + bool "Montserrat 36" + select LV_FONT_MONTSERRAT_36 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38 + bool "Montserrat 38" + select LV_FONT_MONTSERRAT_38 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40 + bool "Montserrat 40" + select LV_FONT_MONTSERRAT_40 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42 + bool "Montserrat 42" + select LV_FONT_MONTSERRAT_42 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44 + bool "Montserrat 44" + select LV_FONT_MONTSERRAT_44 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46 + bool "Montserrat 46" + select LV_FONT_MONTSERRAT_46 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48 + bool "Montserrat 48" + select LV_FONT_MONTSERRAT_48 + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX + bool "Montserrat 12 sub-pixel" + select LV_FONT_MONTSERRAT_12_SUBPX + config ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED + bool "Montserrat 28 compressed" + select LV_FONT_MONTSERRAT_28_COMPRESSED + config ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW + bool "Dejavu 16 Persian, Hebrew, Arabic letters" + select LV_FONT_DEJAVU_16_PERSIAN_HEBREW + config ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK + bool "Simsun 16 CJK" + select LV_FONT_SIMSUN_16_CJK + config ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8 + bool "UNSCII 8 (Perfect monospace font)" + select LV_FONT_UNSCII_8 + config ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16 + bool "UNSCII 16 (Perfect monospace font)" + select LV_FONT_UNSCII_16 +endchoice + rsource "widgets/Kconfig" endif diff --git a/app/src/display/main.c b/app/src/display/main.c index 8a70cef2..3fb4e8f6 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -15,11 +15,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include +#include "theme.h" + #include #include #include -#define ZMK_DISPLAY_NAME CONFIG_LVGL_DISPLAY_DEV_NAME +#define ZMK_DISPLAY_NAME CONFIG_LV_Z_DISPLAY_DEV_NAME static const struct device *display; static bool initialized = false; @@ -50,16 +52,21 @@ struct k_work_q *zmk_display_work_q() { #endif } -void display_timer_cb() { - lv_tick_inc(TICK_MS); - k_work_submit_to_queue(zmk_display_work_q(), &display_tick_work); -} - -void blank_display_cb(struct k_work *work) { display_blanking_on(display); } - -void unblank_display_cb(struct k_work *work) { display_blanking_off(display); } +void display_timer_cb() { k_work_submit_to_queue(zmk_display_work_q(), &display_tick_work); } K_TIMER_DEFINE(display_timer, display_timer_cb, NULL); + +void unblank_display_cb(struct k_work *work) { + display_blanking_off(display); + k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); +} + +#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) + +void blank_display_cb(struct k_work *work) { + k_timer_stop(&display_timer); + display_blanking_on(display); +} K_WORK_DEFINE(blank_display_work, blank_display_cb); K_WORK_DEFINE(unblank_display_work, unblank_display_cb); @@ -69,26 +76,30 @@ static void start_display_updates() { } k_work_submit_to_queue(zmk_display_work_q(), &unblank_display_work); - - k_timer_start(&display_timer, K_MSEC(TICK_MS), K_MSEC(TICK_MS)); } -#if IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) - static void stop_display_updates() { if (display == NULL) { return; } k_work_submit_to_queue(zmk_display_work_q(), &blank_display_work); - - k_timer_stop(&display_timer); } #endif int zmk_display_is_initialized() { return initialized; } +static void initialize_theme() { +#if IS_ENABLED(CONFIG_LV_USE_THEME_MONO) + lv_disp_t *disp = lv_disp_get_default(); + lv_theme_t *theme = lv_theme_mono_init(disp, false, CONFIG_LV_FONT_DEFAULT); + theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; + + disp->theme = theme; +#endif // CONFIG_LV_USE_THEME_MONO +} + void initialize_display(struct k_work *work) { LOG_DBG(""); @@ -100,6 +111,8 @@ void initialize_display(struct k_work *work) { initialized = true; + initialize_theme(); + screen = zmk_display_status_screen(); if (screen == NULL) { @@ -109,7 +122,7 @@ void initialize_display(struct k_work *work) { lv_scr_load(screen); - start_display_updates(); + unblank_display_cb(work); } K_WORK_DEFINE(init_work, initialize_display); diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 0fe7212d..6b58c301 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -34,42 +34,43 @@ static struct zmk_widget_layer_status layer_status_widget; static struct zmk_widget_wpm_status wpm_status_widget; #endif +lv_style_t global_style; + lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - screen = lv_obj_create(NULL, NULL); + lv_style_init(&global_style); + lv_style_set_text_font(&global_style, &lv_font_montserrat_12); + + screen = lv_obj_create(NULL); + lv_obj_add_style(screen, &global_style, LV_PART_MAIN); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); - lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), NULL, LV_ALIGN_IN_TOP_RIGHT, - 0, 0); + lv_obj_align(zmk_widget_battery_status_obj(&battery_status_widget), LV_ALIGN_TOP_RIGHT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_OUTPUT_STATUS) zmk_widget_output_status_init(&output_status_widget, screen); - lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), NULL, LV_ALIGN_IN_TOP_LEFT, 0, - 0); + lv_obj_align(zmk_widget_output_status_obj(&output_status_widget), LV_ALIGN_TOP_LEFT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS) zmk_widget_peripheral_status_init(&peripheral_status_widget, screen); - lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), NULL, - LV_ALIGN_IN_TOP_LEFT, 0, 0); + lv_obj_align(zmk_widget_peripheral_status_obj(&peripheral_status_widget), LV_ALIGN_TOP_LEFT, 0, + 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_LAYER_STATUS) zmk_widget_layer_status_init(&layer_status_widget, screen); - lv_obj_set_style_local_text_font(zmk_widget_layer_status_obj(&layer_status_widget), - LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, - lv_theme_get_font_small()); - lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), NULL, LV_ALIGN_IN_BOTTOM_LEFT, - 0, 0); + lv_obj_set_style_text_font(zmk_widget_layer_status_obj(&layer_status_widget), + lv_theme_get_font_small(screen), LV_PART_MAIN); + lv_obj_align(zmk_widget_layer_status_obj(&layer_status_widget), LV_ALIGN_BOTTOM_LEFT, 0, 0); #endif #if IS_ENABLED(CONFIG_ZMK_WIDGET_WPM_STATUS) zmk_widget_wpm_status_init(&wpm_status_widget, screen); - lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, - 0); + lv_obj_align(zmk_widget_wpm_status_obj(&wpm_status_widget), LV_ALIGN_BOTTOM_RIGHT, 0, 0); #endif return screen; } diff --git a/app/src/display/theme.c b/app/src/display/theme.c new file mode 100644 index 00000000..3ad41dac --- /dev/null +++ b/app/src/display/theme.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +#if defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_10) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_10 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_14 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_16 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_18 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_20 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_22 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_24 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_26 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_30 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_32 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_34 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_36 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_38 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_40 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_42 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_44 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_46 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_48 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12_subpx +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28_compressed +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_simsun_16_cjk +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_16 +#endif + +void zmk_display_theme_init(lv_obj_t *obj) { + lv_theme_t *theme = lv_theme_get_from_obj(obj); + + if (theme == NULL) { + return; + } + + theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; +} \ No newline at end of file diff --git a/app/src/display/theme.h b/app/src/display/theme.h new file mode 100644 index 00000000..94bf7f39 --- /dev/null +++ b/app/src/display/theme.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include + +#if defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_10) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_10 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_14) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_14 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_16 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_18) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_18 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_20) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_20 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_22) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_22 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_24) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_24 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_26 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_30) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_30 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_32) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_32 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_34) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_34 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_36) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_36 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_38) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_38 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_40) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_40 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_42) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_42 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_44) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_44 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_46) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_46 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_48) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_48 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_12_SUBPX) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_12_subpx +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_28_COMPRESSED) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_montserrat_28_compressed +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_DEJAVU_16_PERSIAN_HEBREW) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_dejavu_16_persian_hebrew +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_SIMSUN_16_CJK) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_simsun_16_cjk +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_8) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_8 +#elif defined(CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_UNSCII_16) +#define CONFIG_ZMK_LV_FONT_DEFAULT_SMALL &lv_font_unscii_16 +#endif diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 847a47ab..5ef32d20 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -7,13 +7,13 @@ config ZMK_WIDGET_LAYER_STATUS bool "Widget for highest, active layer using small icons" default y depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_BATTERY_STATUS bool "Widget for battery charge information, using small icons" depends on BT default y if BT - select LVGL_USE_LABEL + select LV_USE_LABEL if ZMK_WIDGET_BATTERY_STATUS @@ -26,18 +26,18 @@ config ZMK_WIDGET_OUTPUT_STATUS bool "Widget for keyboard output status icons" depends on BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) default y if BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_PERIPHERAL_STATUS bool "Widget for split peripheral status icons" depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL config ZMK_WIDGET_WPM_STATUS bool "Widget for displaying typed words per minute" depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL - select LVGL_USE_LABEL + select LV_USE_LABEL select ZMK_WPM endmenu diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 71b243d3..3480101d 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -55,7 +55,6 @@ static void set_battery_symbol(lv_obj_t *label, struct battery_status_state stat } #endif lv_label_set_text(label, text); - lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); } void battery_status_update_cb(struct battery_status_state state) { @@ -81,9 +80,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ int zmk_widget_battery_status_init(struct zmk_widget_battery_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 43, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index a4a7be58..8dc0061c 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -54,9 +54,7 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, laye ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 8bbe1a7e..135770a6 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -81,9 +81,7 @@ ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif int zmk_widget_output_status_init(struct zmk_widget_output_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/peripheral_status.c b/app/src/display/widgets/peripheral_status.c index baf48f58..d0c33f20 100644 --- a/app/src/display/widgets/peripheral_status.c +++ b/app/src/display/widgets/peripheral_status.c @@ -45,9 +45,7 @@ ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); int zmk_widget_peripheral_status_init(struct zmk_widget_peripheral_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); sys_slist_append(&widgets, &widget->node); diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index a2c6a287..f3d06d65 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -31,7 +31,7 @@ void set_wpm_symbol(lv_obj_t *label, struct wpm_status_state state) { snprintf(text, sizeof(text), "%i", state.wpm); lv_label_set_text(label, text); - lv_obj_align(label, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); + lv_obj_align(label, LV_ALIGN_BOTTOM_RIGHT, 0, 0); } void wpm_status_update_cb(struct wpm_status_state state) { @@ -44,10 +44,8 @@ ZMK_DISPLAY_WIDGET_LISTENER(widget_wpm_status, struct wpm_status_state, wpm_stat ZMK_SUBSCRIPTION(widget_wpm_status, zmk_wpm_state_changed); int zmk_widget_wpm_status_init(struct zmk_widget_wpm_status *widget, lv_obj_t *parent) { - widget->obj = lv_label_create(parent, NULL); - lv_label_set_align(widget->obj, LV_LABEL_ALIGN_RIGHT); - - lv_obj_set_size(widget->obj, 40, 15); + widget->obj = lv_label_create(parent); + lv_obj_align(widget->obj, LV_ALIGN_RIGHT_MID, 0, 0); sys_slist_append(&widgets, &widget->node); From 243a227ff96e0cc25d4ae362efb30c769b4bc329 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:35:40 -0400 Subject: [PATCH 292/494] refactor: Move to LISTIFY/DT_FOREACH_PROP_ELEM macros. --- app/drivers/kscan/kscan_gpio_demux.c | 6 +++--- app/drivers/kscan/kscan_gpio_direct.c | 4 ++-- app/drivers/kscan/kscan_gpio_matrix.c | 8 ++++---- app/src/behaviors/behavior_caps_word.c | 4 ++-- app/src/behaviors/behavior_macro.c | 4 ++-- app/src/behaviors/behavior_tap_dance.c | 4 ++-- app/src/conditional_layer.c | 5 ++--- app/src/keymap.c | 8 ++++---- app/src/matrix_transform.c | 4 ++-- app/src/sensors.c | 17 ++++++++++------- 10 files changed, 33 insertions(+), 31 deletions(-) diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 6e3d9e79..ff2c6c69 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -28,7 +28,7 @@ struct kscan_gpio_item_config { .label = DT_INST_GPIO_LABEL_BY_IDX(n, prop, idx), \ .pin = DT_INST_GPIO_PIN_BY_IDX(n, prop, idx), \ .flags = DT_INST_GPIO_FLAGS_BY_IDX(n, prop, idx), \ - }, + } // Define row and col cfg #define _KSCAN_GPIO_INPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, input_gpios, idx) @@ -240,8 +240,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {UTIL_LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, n)}, \ - .cols = {UTIL_LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, n)}, \ + .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (,), n)}, \ + .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (,), n)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index ee7b13f6..1e0576c5 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -41,7 +41,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define INST_INPUTS_LEN(n) DT_INST_PROP_LEN(n, input_gpios) #define KSCAN_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) struct kscan_direct_irq_callback { const struct device *dev; @@ -327,7 +327,7 @@ static const struct kscan_driver_api kscan_direct_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ - UTIL_LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, n)}; \ + LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (,), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 71fcad29..de65fd49 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -50,9 +50,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, pollcode, intcode) #define KSCAN_GPIO_ROW_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) #define KSCAN_GPIO_COL_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx), + GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) enum kscan_diode_direction { KSCAN_ROW2COL, @@ -433,10 +433,10 @@ static const struct kscan_driver_api kscan_matrix_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ - UTIL_LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, n)}; \ + LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (,), n)}; \ \ static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ - UTIL_LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, n)}; \ + LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (,), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ \ diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 3842a31f..7a9612b3 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -168,7 +168,7 @@ static int behavior_caps_word_init(const struct device *dev) { #define PARSE_BREAK(i) \ {.page = ZMK_HID_USAGE_PAGE(i), \ .id = ZMK_HID_USAGE_ID(i), \ - .implicit_modifiers = SELECT_MODS(i)}, + .implicit_modifiers = SELECT_MODS(i)} #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) @@ -177,7 +177,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ - .continuations = {UTIL_LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, n)}, \ + .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (,), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 46fdde3c..5b215b93 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -166,10 +166,10 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .binding_released = on_macro_binding_released, }; -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)), +#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) #define TRANSFORMED_BEHAVIORS(n) \ - {UTIL_LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, n)}, + {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (,), n)}, #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 3bad2901..6d78cb3e 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -237,10 +237,10 @@ static int behavior_tap_dance_init(const struct device *dev) { return 0; } -#define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node), +#define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) #define TRANSFORMED_BINDINGS(node) \ - { UTIL_LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, DT_DRV_INST(node)) } + { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (,), DT_DRV_INST(node)) } #define KP_INST(n) \ static struct zmk_behavior_binding \ diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 1728a7f4..572652ff 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -33,13 +33,12 @@ struct conditional_layer_cfg { int8_t then_layer; }; -#define IF_LAYER_BIT(i, n) BIT(DT_PROP_BY_IDX(n, if_layers, i)) | +#define IF_LAYER_BIT(node_id, prop, idx) BIT(DT_PROP_BY_IDX(node_id, prop, idx)) | // Evaluates to conditional_layer_cfg struct initializer. #define CONDITIONAL_LAYER_DECL(n) \ { \ - /* TODO: Replace UTIL_LISTIFY with DT_FOREACH_PROP_ELEM after Zepyhr 2.6.0 upgrade. */ \ - .if_layers_state_mask = UTIL_LISTIFY(DT_PROP_LEN(n, if_layers), IF_LAYER_BIT, n) 0, \ + .if_layers_state_mask = DT_FOREACH_PROP_ELEM(n, if_layers, IF_LAYER_BIT) 0, \ .then_layer = DT_PROP(n, then_layer), \ }, diff --git a/app/src/keymap.c b/app/src/keymap.c index e586316f..b00d0fba 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -34,10 +34,10 @@ static uint8_t _zmk_keymap_layer_default = 0; #define ZMK_KEYMAP_NODE DT_DRV_INST(0) #define ZMK_KEYMAP_LAYERS_LEN (DT_INST_FOREACH_CHILD(0, LAYER_CHILD_LEN) 0) -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst), +#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ - {UTIL_LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, node)}, + {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (,), node)}, #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ @@ -47,12 +47,12 @@ static uint8_t _zmk_keymap_layer_default = 0; (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param2), (0), \ (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param2))), \ - }, + } #define SENSOR_LAYER(node) \ COND_CODE_1( \ DT_NODE_HAS_PROP(node, sensor_bindings), \ - ({UTIL_LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, node)}), \ + ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (,), node)}), \ ({})), #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index 8f54f312..e7c6e95f 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -13,9 +13,9 @@ #define _TRANSFORM_ENTRY(i, _) \ [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ - KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i, + KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i -static uint32_t transform[] = {UTIL_LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, 0)}; +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (,), 0)}; #endif diff --git a/app/src/sensors.c b/app/src/sensors.c index dd5f4267..184061ac 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -25,12 +25,15 @@ struct sensors_data_item { }; #define _SENSOR_ITEM(node) \ - {.dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION}}, -#define SENSOR_ITEM(idx, _) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ()) + { \ + .dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION } \ + } -static struct sensors_data_item sensors[] = {UTIL_LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, 0)}; +#define SENSOR_ITEM(idx, _node) \ + COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ + (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ({})) + +static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; static void zmk_sensors_trigger_handler(const struct device *dev, struct sensor_trigger *trigger) { int err; @@ -71,10 +74,10 @@ static int zmk_sensors_init(const struct device *_arg) { int local_index = 0; int absolute_index = 0; - UTIL_LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, 0) + LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, (), 0) return 0; } SYS_INIT(zmk_sensors_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); -#endif /* ZMK_KEYMAP_HAS_SENSORS */ \ No newline at end of file +#endif /* ZMK_KEYMAP_HAS_SENSORS */ From d513dc1766edf52a22d78da0e73d5a09670059e9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:36:13 -0400 Subject: [PATCH 293/494] refactor: Move to new PM API. --- app/src/activity.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/activity.c b/app/src/activity.c index 5a1e2385..029908c0 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -70,7 +70,7 @@ void activity_work_handler(struct k_work *work) { if (inactive_time > MAX_SLEEP_MS && !is_usb_power_present()) { // Put devices in suspend power mode before sleeping set_state(ZMK_ACTIVITY_SLEEP); - pm_power_state_force(0U, (struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); + pm_state_force(0U, &(struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { From 4f2f9db1d474dc8754780b27243b1a61acbdad42 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:36:53 -0400 Subject: [PATCH 294/494] refactor(ble): New callback API for pairing complete. --- app/src/ble.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/ble.c b/app/src/ble.c index b10aa20b..4d2e4603 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -528,7 +528,6 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { static struct bt_conn_auth_cb zmk_ble_auth_cb_display = { .pairing_accept = auth_pairing_accept, - .pairing_complete = auth_pairing_complete, // .passkey_display = auth_passkey_display, #if IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) @@ -537,6 +536,10 @@ static struct bt_conn_auth_cb zmk_ble_auth_cb_display = { .cancel = auth_cancel, }; +static struct bt_conn_auth_info_cb zmk_ble_auth_info_cb_display = { + .pairing_complete = auth_pairing_complete, +}; + static void zmk_ble_ready(int err) { LOG_DBG("ready? %d", err); if (err) { @@ -589,6 +592,7 @@ static int zmk_ble_init(const struct device *_arg) { bt_conn_cb_register(&conn_callbacks); bt_conn_auth_cb_register(&zmk_ble_auth_cb_display); + bt_conn_auth_info_cb_register(&zmk_ble_auth_info_cb_display); zmk_ble_ready(0); From 35a1c5a3d44b92c050d28c0aca3d1cb9c7e53695 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Sep 2022 21:37:16 -0400 Subject: [PATCH 295/494] refactor(behaviors): Rename `reset` behavior. * Upstream now has a node w/ label `reset` on many boards, so renaming our reset behavior node label to `sys_reset`. --- app/boards/arm/bt60/bt60_v1.keymap | 10 +++++----- app/boards/arm/bt60/bt60_v1_hs.keymap | 2 +- app/boards/arm/planck/planck_rev6.keymap | 2 +- app/boards/arm/s40nc/s40nc.keymap | 2 +- app/boards/shields/bfo9000/bfo9000.keymap | 2 +- .../shields/boardsource3x4/boardsource3x4.keymap | 2 +- app/boards/shields/contra/contra.keymap | 2 +- app/boards/shields/cradio/cradio.keymap | 2 +- app/boards/shields/crbn/crbn.keymap | 2 +- app/boards/shields/eek/eek.keymap | 2 +- app/boards/shields/ergodash/ergodash.keymap | 4 ++-- .../shields/eternal_keypad/eternal_keypad.keymap | 4 ++-- .../shields/eternal_keypad/eternal_keypad_lefty.keymap | 4 ++-- app/boards/shields/jian/jian.keymap | 2 +- app/boards/shields/jiran/jiran.keymap | 2 +- app/boards/shields/jorne/jorne.keymap | 2 +- app/boards/shields/leeloo/leeloo.keymap | 2 +- app/boards/shields/lotus58/lotus58.keymap | 6 +++--- app/boards/shields/m60/m60.keymap | 2 +- app/boards/shields/murphpad/murphpad.keymap | 2 +- app/boards/shields/qaz/qaz.keymap | 2 +- app/boards/shields/redox/redox.keymap | 2 +- app/boards/shields/reviung41/reviung41.keymap | 2 +- .../shields/settings_reset/settings_reset.keymap | 2 +- app/boards/shields/tg4x/tg4x.keymap | 2 +- app/boards/shields/tidbit/tidbit.keymap | 2 +- app/boards/shields/tidbit/tidbit_19key.keymap | 2 +- app/boards/shields/waterfowl/waterfowl.keymap | 8 ++++---- app/boards/shields/zodiark/zodiark.keymap | 2 +- app/dts/behaviors/reset.dtsi | 4 ++-- docs/blog/2021-01-27-zmk-sotf-4.md | 2 +- docs/docs/behaviors/reset.md | 6 +++--- docs/src/data/keymap-upgrade.js | 1 + 33 files changed, 48 insertions(+), 47 deletions(-) diff --git a/app/boards/arm/bt60/bt60_v1.keymap b/app/boards/arm/bt60/bt60_v1.keymap index 0985a605..b42f3f3d 100644 --- a/app/boards/arm/bt60/bt60_v1.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -56,7 +56,7 @@ // ------------------------------------------------------------------------------------------ bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans @@ -84,7 +84,7 @@ raise { bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL - &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &reset + &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans &trans &trans &trans &bootloader &trans &trans &trans @@ -112,7 +112,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR @@ -140,7 +140,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR @@ -168,7 +168,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR diff --git a/app/boards/arm/bt60/bt60_v1_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap index 6e62e1bb..167460c6 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.keymap +++ b/app/boards/arm/bt60/bt60_v1_hs.keymap @@ -26,7 +26,7 @@ raise { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &reset + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/arm/planck/planck_rev6.keymap index bbfb770e..7e4f6732 100644 --- a/app/boards/arm/planck/planck_rev6.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -39,7 +39,7 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP >; }; }; diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index d7f349d9..c43bc671 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -50,7 +50,7 @@ &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP &bt BT_SEL 0 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &kp K_LOCK &bt BT_SEL 1 &out OUT_USB &kp CAPS &kp KP_NUM &kp SLCK &trans &trans &kp COMMA &kp DOT &kp K_VOL_UP &kp K_MUTE - &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP + &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &sys_reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP >; }; }; diff --git a/app/boards/shields/bfo9000/bfo9000.keymap b/app/boards/shields/bfo9000/bfo9000.keymap index fe904931..22186a1d 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -46,7 +46,7 @@ &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans - &reset &bootloader &trans &trans &trans &trans &trans &trans &trans &reset &bootloader &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans >; diff --git a/app/boards/shields/boardsource3x4/boardsource3x4.keymap b/app/boards/shields/boardsource3x4/boardsource3x4.keymap index add7efa0..c47126ab 100644 --- a/app/boards/shields/boardsource3x4/boardsource3x4.keymap +++ b/app/boards/shields/boardsource3x4/boardsource3x4.keymap @@ -32,7 +32,7 @@ lower_layer { bindings = < - &bt BT_CLR &none &reset &bootloader + &bt BT_CLR &none &sys_reset &bootloader &trans &bt BT_SEL 3 &bt BT_SEL 4 &none &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 >; diff --git a/app/boards/shields/contra/contra.keymap b/app/boards/shields/contra/contra.keymap index e24b5028..77b431b6 100644 --- a/app/boards/shields/contra/contra.keymap +++ b/app/boards/shields/contra/contra.keymap @@ -30,7 +30,7 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &kp TAB &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp PG_UP &kp LBKT &kp RBKT &kp BSLH &kp LSHFT &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp EQUAL &kp PG_DN &kp HOME &kp END &kp ENTER - &kp LCTRL &kp LGUI &kp LALT &reset &to DEFAULT &kp SPACE &trans &mo BT_CTRL &kp LEFT &kp RIGHT &kp UP &kp DOWN + &kp LCTRL &kp LGUI &kp LALT &sys_reset &to DEFAULT &kp SPACE &trans &mo BT_CTRL &kp LEFT &kp RIGHT &kp UP &kp DOWN >; }; diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index 587bc7aa..3f6670da 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -88,7 +88,7 @@ bindings = < //╭──────────┬──────────┬──────────┬──────────┬──────────╮ ╭──────────┬──────────┬──────────┬──────────┬──────────╮ //│ RESET │ │ │ │PROFILE 0 │ │ │ │ │ │ RESET │ - &reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &reset + &sys_reset &trans &trans &trans &bt BT_SEL 0 &trans &trans &trans &trans &sys_reset //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ //│BOOTLOADER│ │ │ │PROFILE 1 │ │ │ │ │ │BOOTLOADER│ &bootloader &trans &trans &trans &bt BT_SEL 1 &trans &trans &trans &trans &bootloader diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index 9423e1af..b967e5e2 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -52,7 +52,7 @@ control { bindings = < - &reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index 439c90aa..d250cb01 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -49,7 +49,7 @@ &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &out OUT_USB &out OUT_BLE &none &kp EQUAL &kp MINUS &kp CAPS &kp F5 &kp F6 &kp F7 &kp F8 &kp LBKT &kp RBKT &none &kp GRAVE &kp BSLH &kp LSHFT &kp F9 &kp F10 &kp F11 &kp F12 &none &none &none &none &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &reset &none &trans + &kp LCTRL &kp LGUI &kp LALT &sys_reset &none &trans >; }; }; diff --git a/app/boards/shields/ergodash/ergodash.keymap b/app/boards/shields/ergodash/ergodash.keymap index a85c58a6..e384e504 100644 --- a/app/boards/shields/ergodash/ergodash.keymap +++ b/app/boards/shields/ergodash/ergodash.keymap @@ -56,7 +56,7 @@ &kp F11 &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &none &none &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F12 &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none -&trans &bootloader &reset &none &none &none &none &none &none &none &none &none &none &trans +&trans &bootloader &sys_reset &none &none &none &none &none &none &none &none &none &none &trans &trans &none &none &trans &trans &none &trans &trans &none &trans &none &none &none &trans >; }; @@ -77,7 +77,7 @@ &none &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none &none -&trans &none &none &none &none &none &none &none &none &none &none &bootloader &reset &trans +&trans &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &trans &trans &none &none &trans &trans &none &trans &trans &none &trans &none &none &none &trans >; }; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad.keymap b/app/boards/shields/eternal_keypad/eternal_keypad.keymap index 0f3eda7b..da06d274 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad.keymap @@ -38,7 +38,7 @@ &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD &bt BT_CLR &trans &kp LEFT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD - &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &sys_reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR &bootloader &trans &trans &trans &trans &trans >; }; @@ -48,7 +48,7 @@ &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 - &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &sys_reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 &bootloader &trans &trans &trans &trans &kp F10 >; }; diff --git a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap index e1bddbad..81710032 100644 --- a/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap +++ b/app/boards/shields/eternal_keypad/eternal_keypad_lefty.keymap @@ -38,7 +38,7 @@ &bt BT_SEL 0 &bt BT_SEL 1 &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &kp UP &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_HUD &bt BT_CLR &trans &kp RIGHT &kp DOWN &kp RIGHT &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD - &reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR + &sys_reset &trans &trans &trans &trans &trans &rgb_ug RGB_EFF &rgb_ug RGB_EFR &bootloader &trans &trans &trans &trans &trans >; }; @@ -48,7 +48,7 @@ &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp P &kp O &kp I &kp U &kp Y &kp F7 &bt BT_CLR &kp BSPC &kp SEMI &kp L &kp K &kp J &kp H &kp F8 - &reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 + &sys_reset &trans &kp LGUI &kp M &kp N &kp F12 &kp F11 &kp F9 &bootloader &trans &trans &trans &trans &kp F10 >; }; diff --git a/app/boards/shields/jian/jian.keymap b/app/boards/shields/jian/jian.keymap index 7b8dd676..e8f7dcc8 100644 --- a/app/boards/shields/jian/jian.keymap +++ b/app/boards/shields/jian/jian.keymap @@ -67,7 +67,7 @@ // | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &reset + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &trans &none &trans &trans &none &trans diff --git a/app/boards/shields/jiran/jiran.keymap b/app/boards/shields/jiran/jiran.keymap index e6c073cc..6dcd733c 100644 --- a/app/boards/shields/jiran/jiran.keymap +++ b/app/boards/shields/jiran/jiran.keymap @@ -25,7 +25,7 @@ lower_layer { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp EQUAL - &kp F11 &kp TAB &bt BT_CLR &kp HOME &reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &reset &kp HOME &kp INS &kp DEL &kp F12 + &kp F11 &kp TAB &bt BT_CLR &kp HOME &sys_reset &kp PG_UP &kp C_VOL_UP &kp C_VOL_UP &kp PG_UP &sys_reset &kp HOME &kp INS &kp DEL &kp F12 &kp LSHIFT &bt BT_NXT &kp LEFT &kp UP &kp RIGHT &kp C_MUTE &kp C_MUTE &kp LEFT &kp UP &kp RIGHT &kp PSCRN &mt RSHIFT SLCK &kp LCTRL &bt BT_PRV &kp END &kp DOWN &kp PG_DN &kp C_VOL_DN &kp C_VOL_DN &kp PG_DN &kp DOWN &kp END &kp PAUSE_BREAK &mt RCTRL KP_NUM &trans &kp SPACE &kp LALT &mt RALT RET &kp BSPC &trans diff --git a/app/boards/shields/jorne/jorne.keymap b/app/boards/shields/jorne/jorne.keymap index 93c7691a..2a109fe8 100644 --- a/app/boards/shields/jorne/jorne.keymap +++ b/app/boards/shields/jorne/jorne.keymap @@ -64,7 +64,7 @@ // | | | | | | | | | | | | | | // | | | | | | | | bindings = < - &reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &reset + &sys_reset &bootloader &none &none &none &none &none &none &none &none &none &none &bootloader &sys_reset &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 4 &bt BT_SEL 3 &bt BT_SEL 2 &bt BT_SEL 1 &bt BT_SEL 0 &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &none &trans &none &trans &trans &none &trans diff --git a/app/boards/shields/leeloo/leeloo.keymap b/app/boards/shields/leeloo/leeloo.keymap index 4104cc3a..fc3b25e0 100644 --- a/app/boards/shields/leeloo/leeloo.keymap +++ b/app/boards/shields/leeloo/leeloo.keymap @@ -45,7 +45,7 @@ raise_layer { bindings = < &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &reset &bootloader +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans diff --git a/app/boards/shields/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index cfe4342c..50249146 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -57,7 +57,7 @@ bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &fofunc &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp EQUAL &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT -&kp LSHFT &kp A &sleft &kp D &fright &kp G &reset &reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT +&kp LSHFT &kp A &sleft &kp D &fright &kp G &sys_reset &sys_reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &kp C_PP &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RCTRL BSLH < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI >; @@ -91,8 +91,8 @@ // | | UNDO | CUT | COPY | PASTE | | | | | | |> | <|<| | |>|> | | | // | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &reset &bootloader -&trans &kp INS &kp PSCRN &kp K_CMENU &reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &sys_reset &bootloader +&trans &kp INS &kp PSCRN &kp K_CMENU &sys_reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans &trans &kp LALT &kp LCTRL &kp LSHFT &bootloader &kp CLCK &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &kp C_PP &kp C_PREV &kp C_NEXT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index 6caa6370..aa656929 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -32,7 +32,7 @@ fn_layer { bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader -&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &reset +&trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &none &none &trans &trans &none &none &none &none &none &none &none &none &none &none &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index aec58878..2e8c6f6e 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -31,7 +31,7 @@ combo_reset { timeout-ms = ; key-positions = <1 3>; - bindings = <&reset>; + bindings = <&sys_reset>; }; combo_bootloader { timeout-ms = ; diff --git a/app/boards/shields/qaz/qaz.keymap b/app/boards/shields/qaz/qaz.keymap index a832860e..e6794e7b 100644 --- a/app/boards/shields/qaz/qaz.keymap +++ b/app/boards/shields/qaz/qaz.keymap @@ -42,7 +42,7 @@ &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans &trans &trans &trans &kp EQUAL &kp MINUS &kp DEL &none &none &none &none &none &none &none &kp DOT - &bootloader &reset &none &trans &trans &kp RET &trans &kp FSLH + &bootloader &sys_reset &none &trans &trans &kp RET &trans &kp FSLH >; }; diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index aed22c42..a45595ff 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -73,7 +73,7 @@ bindings = < &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &none &none &none &none &none &bootloader &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG - &trans &kp K_MUTE &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE &none &reset &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 + &trans &kp K_MUTE &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE &none &sys_reset &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp PSCRN &kp PSCRN &kp CLCK &none &none &trans &trans &trans &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans >; diff --git a/app/boards/shields/reviung41/reviung41.keymap b/app/boards/shields/reviung41/reviung41.keymap index d291ca8b..12f15ad4 100644 --- a/app/boards/shields/reviung41/reviung41.keymap +++ b/app/boards/shields/reviung41/reviung41.keymap @@ -64,7 +64,7 @@ bindings = < &rgb_ug RGB_BRI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_EFF &none &rgb_ug RGB_TOG &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_CLR &rgb_ug RGB_BRD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_EFR &none &none &none &none &none &none &none &none - &none &none &none &none &none &none &reset &none &none &none &none &none + &none &none &none &none &none &none &sys_reset &none &none &none &none &none &trans &trans &tog 3 &trans &trans >; }; diff --git a/app/boards/shields/settings_reset/settings_reset.keymap b/app/boards/shields/settings_reset/settings_reset.keymap index 05236445..0afdcc2b 100644 --- a/app/boards/shields/settings_reset/settings_reset.keymap +++ b/app/boards/shields/settings_reset/settings_reset.keymap @@ -13,7 +13,7 @@ default_layer { bindings = < - &reset + &sys_reset >; }; }; diff --git a/app/boards/shields/tg4x/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index 84ca3273..e68d0f92 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -45,7 +45,7 @@ bindings = < &kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans -&trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &reset &trans +&trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &sys_reset &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_VOL_DN &kp C_PP >; }; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 7fa98af2..e8cb3789 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -36,7 +36,7 @@ func_layer { bindings = < - &none &reset &bootloader + &none &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 6e158b03..8414a012 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -37,7 +37,7 @@ func_layer { bindings = < - &tog 0 &reset &bootloader + &tog 0 &sys_reset &bootloader &out OUT_TOG &out OUT_USB &out OUT_BLE &none &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index 9a1dabac..d208fe49 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -99,10 +99,10 @@ * `-----' `--------------------' `--------------------' `-----' */ bindings = < - &trans &trans &bt BT_CLR &trans &reset &reset &kp F7 &kp F8 &kp F9 &kp F11 - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 - &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 >; sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap index 21fdef10..0211f818 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -56,7 +56,7 @@ // | | | | | | | | | | | | | | | | | | // | | | | | | | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &reset +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &sys_reset &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index cb246814..74a7163b 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -8,9 +8,9 @@ / { behaviors { - reset: behavior_reset { + sys_reset: behavior_reset { compatible = "zmk,behavior-reset"; - label = "RESET"; + label = "SYSRESET"; #binding-cells = <0>; }; diff --git a/docs/blog/2021-01-27-zmk-sotf-4.md b/docs/blog/2021-01-27-zmk-sotf-4.md index cd84da88..e7ff3232 100644 --- a/docs/blog/2021-01-27-zmk-sotf-4.md +++ b/docs/blog/2021-01-27-zmk-sotf-4.md @@ -164,7 +164,7 @@ For anyone looking to contribute, you can find the [ZMK Firmware project](https: Some items listed in the last coming soon section are still under active development. - A power profiler page for the website, to help users estimate their battery life for a given keyboard - [Nicell] -- Behavior "locality", allowing improved split usage for things like `&reset`, and controlling external power and RGB underglow for both sides - [petejohanson] +- Behavior "locality", allowing improved split usage for things like `&sys_reset`, and controlling external power and RGB underglow for both sides - [petejohanson] - More modular approach to external boards/shields, custom code, user keymaps, etc. - More shields and boards diff --git a/docs/docs/behaviors/reset.md b/docs/docs/behaviors/reset.md index c06a13b7..0fc62b2f 100644 --- a/docs/docs/behaviors/reset.md +++ b/docs/docs/behaviors/reset.md @@ -17,13 +17,13 @@ to the device ### Behavior Binding -- Reference: `&reset` +- Reference: `&sys_reset` - Parameters: None Example: ``` -&reset +&sys_reset ``` ## Bootloader Reset @@ -44,7 +44,7 @@ Example: ## Split Keyboards -Both basic and bootloader reset behaviors are source-specific: This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. +Both basic and bootloader reset behaviors are source-specific: This means that it affects the side of the keyboard that contains the behavior binding for split keyboards. For example if you press a key with the `&sys_reset` binding on the left half of the keyboard, the left half will be reset. If you want to be able to reset both sides you can put the bindings on both sides of the keyboard and activate it on the side you would like to reset. :::note Peripheral invocation The peripheral side of the keyboard has to be paired and connected to the central side in order to be able to activate these behaviors, even if it is possible to trigger the behavior using only keys on that side. This is because the key bindings are processed on the central side which would then instruct the peripheral side to reset. diff --git a/docs/src/data/keymap-upgrade.js b/docs/src/data/keymap-upgrade.js index 7936ca16..8e153828 100644 --- a/docs/src/data/keymap-upgrade.js +++ b/docs/src/data/keymap-upgrade.js @@ -81,4 +81,5 @@ export const Codes = { export const Behaviors = { cp: "kp", inc_dec_cp: "inc_dec_kp", + reset: "sys_reset", }; From 3a958c667fcbdf9940d115bbdf3f7fe61d821402 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 00:46:08 -0400 Subject: [PATCH 296/494] refactor: Move to `zephyr/` include paths. * Zephyr moved to properly namespaced headers, so major "rip the bandaid" commit to move us to those everywhere. --- app/boards/arm/mikoto/pinmux.c | 12 +++++----- app/boards/arm/nrfmicro/pinmux.c | 12 +++++----- app/boards/arm/puchi_ble/pinmux.c | 12 +++++----- app/drivers/display/il0323.c | 14 ++++++------ app/drivers/gpio/gpio_595.c | 14 ++++++------ app/drivers/gpio/gpio_mcp23017.c | 8 +++---- app/drivers/gpio/gpio_mcp23017.h | 2 +- app/drivers/kscan/debounce.h | 2 +- app/drivers/kscan/kscan_composite.c | 4 ++-- app/drivers/kscan/kscan_gpio_demux.c | 8 +++---- app/drivers/kscan/kscan_gpio_direct.c | 14 ++++++------ app/drivers/kscan/kscan_gpio_matrix.c | 16 +++++++------- app/drivers/kscan/kscan_mock.c | 6 ++--- app/drivers/sensor/battery/battery_common.c | 2 +- app/drivers/sensor/battery/battery_common.h | 2 +- app/drivers/sensor/battery/battery_nrf_vddh.c | 10 ++++----- .../sensor/battery/battery_voltage_divider.c | 6 ++--- app/drivers/sensor/ec11/ec11.c | 14 ++++++------ app/drivers/sensor/ec11/ec11.h | 6 ++--- app/drivers/sensor/ec11/ec11_trigger.c | 12 +++++----- app/include/drivers/behavior.h | 4 ++-- app/include/drivers/ext_power.h | 2 +- app/include/linker/zmk-events.ld | 2 +- app/include/zmk/behavior_queue.h | 2 +- app/include/zmk/ble/profile.h | 2 +- .../zmk/display/widgets/battery_status.h | 2 +- .../zmk/display/widgets/layer_status.h | 2 +- .../zmk/display/widgets/output_status.h | 2 +- .../zmk/display/widgets/peripheral_status.h | 2 +- app/include/zmk/display/widgets/wpm_status.h | 2 +- app/include/zmk/event_manager.h | 2 +- .../zmk/events/activity_state_changed.h | 2 +- .../zmk/events/battery_state_changed.h | 2 +- .../zmk/events/ble_active_profile_changed.h | 4 ++-- .../zmk/events/endpoint_selection_changed.h | 2 +- .../zmk/events/keycode_state_changed.h | 2 +- app/include/zmk/events/layer_state_changed.h | 2 +- .../zmk/events/modifiers_state_changed.h | 2 +- .../zmk/events/position_state_changed.h | 2 +- app/include/zmk/events/sensor_event.h | 4 ++-- .../events/split_peripheral_status_changed.h | 2 +- .../zmk/events/usb_conn_state_changed.h | 4 ++-- app/include/zmk/events/wpm_state_changed.h | 2 +- app/include/zmk/hid.h | 4 ++-- app/include/zmk/keys.h | 2 +- app/include/zmk/matrix.h | 2 +- app/include/zmk/split/bluetooth/central.h | 2 +- app/include/zmk/split/bluetooth/uuid.h | 2 +- app/include/zmk/usb.h | 4 ++-- app/src/activity.c | 14 ++++++------ app/src/backlight.c | 14 ++++++------ app/src/battery.c | 14 ++++++------ app/src/behavior_queue.c | 4 ++-- app/src/behaviors/behavior_backlight.c | 4 ++-- app/src/behaviors/behavior_bt.c | 10 +++++---- app/src/behaviors/behavior_caps_word.c | 4 ++-- app/src/behaviors/behavior_ext_power.c | 6 ++--- app/src/behaviors/behavior_hold_tap.c | 4 ++-- app/src/behaviors/behavior_key_press.c | 4 ++-- app/src/behaviors/behavior_key_repeat.c | 4 ++-- app/src/behaviors/behavior_key_toggle.c | 4 ++-- app/src/behaviors/behavior_macro.c | 4 ++-- app/src/behaviors/behavior_mod_morph.c | 4 ++-- app/src/behaviors/behavior_momentary_layer.c | 4 ++-- app/src/behaviors/behavior_none.c | 4 ++-- app/src/behaviors/behavior_outputs.c | 6 ++--- app/src/behaviors/behavior_reset.c | 7 +++--- app/src/behaviors/behavior_rgb_underglow.c | 4 ++-- .../behavior_sensor_rotate_key_press.c | 8 +++---- app/src/behaviors/behavior_sticky_key.c | 4 ++-- app/src/behaviors/behavior_tap_dance.c | 4 ++-- app/src/behaviors/behavior_to_layer.c | 4 ++-- app/src/behaviors/behavior_toggle_layer.c | 4 ++-- app/src/behaviors/behavior_transparent.c | 4 ++-- app/src/ble.c | 22 +++++++++---------- app/src/combo.c | 9 ++++---- app/src/conditional_layer.c | 6 ++--- app/src/display/main.c | 10 ++++----- app/src/display/status_screen.c | 2 +- app/src/display/widgets/battery_status.c | 6 ++--- app/src/display/widgets/layer_status.c | 4 ++-- app/src/display/widgets/output_status.c | 5 ++--- app/src/display/widgets/peripheral_status.c | 5 ++--- app/src/display/widgets/wpm_status.c | 2 +- app/src/endpoints.c | 6 ++--- app/src/event_manager.c | 4 ++-- app/src/events/activity_state_changed.c | 2 +- app/src/events/battery_state_changed.c | 2 +- app/src/events/ble_active_profile_changed.c | 2 +- app/src/events/endpoint_selection_changed.c | 2 +- app/src/events/keycode_state_changed.c | 2 +- app/src/events/layer_state_changed.c | 2 +- app/src/events/modifiers_state_changed.c | 2 +- app/src/events/position_state_changed.c | 2 +- app/src/events/sensor_event.c | 2 +- .../events/split_peripheral_status_changed.c | 2 +- app/src/events/usb_conn_state_changed.c | 2 +- app/src/events/wpm_state_changed.c | 2 +- app/src/ext_power_generic.c | 15 +++++++------ app/src/hid.c | 2 +- app/src/hid_listener.c | 2 +- app/src/hog.c | 10 ++++----- app/src/keymap.c | 10 ++++----- app/src/kscan.c | 10 ++++----- app/src/main.c | 10 ++++----- app/src/matrix_transform.c | 4 ++-- app/src/rgb_underglow.c | 12 +++++----- app/src/sensors.c | 8 +++---- app/src/split/bluetooth/central.c | 16 +++++++------- app/src/split/bluetooth/peripheral.c | 22 +++++++++---------- app/src/split/bluetooth/service.c | 10 ++++----- app/src/split/bluetooth/split_listener.c | 4 ++-- app/src/usb.c | 8 +++---- app/src/usb_hid.c | 8 +++---- app/src/wpm.c | 8 +++---- docs/docs/development/new-behavior.md | 4 ++-- 116 files changed, 332 insertions(+), 329 deletions(-) diff --git a/app/boards/arm/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c index 59a38fbf..6d7f46d1 100644 --- a/app/boards/arm/mikoto/pinmux.c +++ b/app/boards/arm/mikoto/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_mikoto_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c index ef5b5521..129530d4 100644 --- a/app/boards/arm/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_nrfmicro_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c index 78cea314..0817b6e0 100644 --- a/app/boards/arm/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include static int pinmux_puchi_ble_init(const struct device *port) { ARG_UNUSED(port); diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index f6c9037e..ec6da159 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -7,16 +7,16 @@ #define DT_DRV_COMPAT gooddisplay_il0323 #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include "il0323_regs.h" -#include +#include LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); /** diff --git a/app/drivers/gpio/gpio_595.c b/app/drivers/gpio/gpio_595.c index 32016702..3d385844 100644 --- a/app/drivers/gpio/gpio_595.c +++ b/app/drivers/gpio/gpio_595.c @@ -12,15 +12,15 @@ #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include +#include LOG_MODULE_REGISTER(gpio_595); /** Configuration data */ diff --git a/app/drivers/gpio/gpio_mcp23017.c b/app/drivers/gpio/gpio_mcp23017.c index 1df14e6b..feafbd0a 100644 --- a/app/drivers/gpio/gpio_mcp23017.c +++ b/app/drivers/gpio/gpio_mcp23017.c @@ -12,9 +12,9 @@ #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -22,7 +22,7 @@ #include "gpio_mcp23017.h" #define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include +#include LOG_MODULE_REGISTER(gpio_mcp23017); /** diff --git a/app/drivers/gpio/gpio_mcp23017.h b/app/drivers/gpio/gpio_mcp23017.h index 026565cd..01908c0c 100644 --- a/app/drivers/gpio/gpio_mcp23017.h +++ b/app/drivers/gpio/gpio_mcp23017.h @@ -11,7 +11,7 @@ #ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ #define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ -#include +#include #include #include diff --git a/app/drivers/kscan/debounce.h b/app/drivers/kscan/debounce.h index 9fa4531b..6e9faa66 100644 --- a/app/drivers/kscan/debounce.h +++ b/app/drivers/kscan/debounce.h @@ -8,7 +8,7 @@ #include #include -#include +#include #define DEBOUNCE_COUNTER_BITS 14 #define DEBOUNCE_COUNTER_MAX BIT_MASK(DEBOUNCE_COUNTER_BITS) diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index 35584d9c..e0cf47f9 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_kscan_composite -#include +#include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define MATRIX_NODE_ID DT_DRV_INST(0) diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index ff2c6c69..5fdd3a7e 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -6,10 +6,10 @@ #define DT_DRV_COMPAT zmk_kscan_gpio_demux -#include -#include -#include -#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 1e0576c5..18a9348d 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -6,13 +6,13 @@ #include "debounce.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index de65fd49..70502148 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -6,14 +6,14 @@ #include "debounce.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/kscan/kscan_mock.c b/app/drivers/kscan/kscan_mock.c index 4ccce69f..57862b0d 100644 --- a/app/drivers/kscan/kscan_mock.c +++ b/app/drivers/kscan/kscan_mock.c @@ -7,9 +7,9 @@ #define DT_DRV_COMPAT zmk_kscan_mock #include -#include -#include -#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/drivers/sensor/battery/battery_common.c b/app/drivers/sensor/battery/battery_common.c index 36e98aff..9afe2d5b 100644 --- a/app/drivers/sensor/battery/battery_common.c +++ b/app/drivers/sensor/battery/battery_common.c @@ -5,7 +5,7 @@ */ #include -#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/battery/battery_common.h b/app/drivers/sensor/battery/battery_common.h index d81c39e2..3e16ceed 100644 --- a/app/drivers/sensor/battery/battery_common.h +++ b/app/drivers/sensor/battery/battery_common.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct battery_value { diff --git a/app/drivers/sensor/battery/battery_nrf_vddh.c b/app/drivers/sensor/battery/battery_nrf_vddh.c index 60104a69..3f230812 100644 --- a/app/drivers/sensor/battery/battery_nrf_vddh.c +++ b/app/drivers/sensor/battery/battery_nrf_vddh.c @@ -9,11 +9,11 @@ #define DT_DRV_COMPAT zmk_battery_nrf_vddh -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index 09e5525e..bc35d002 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -6,12 +6,12 @@ #define DT_DRV_COMPAT zmk_battery_voltage_divider -#include -#include +#include +#include #include #include #include -#include +#include #include "battery_common.h" diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 2fe641fa..5f26ebc3 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -6,13 +6,13 @@ #define DT_DRV_COMPAT alps_ec11 -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include "ec11.h" diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 1cb9c5f7..04750df5 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -6,9 +6,9 @@ #pragma once -#include -#include -#include +#include +#include +#include struct ec11_config { const char *a_label; diff --git a/app/drivers/sensor/ec11/ec11_trigger.c b/app/drivers/sensor/ec11/ec11_trigger.c index 555e1f4a..804a21d9 100644 --- a/app/drivers/sensor/ec11/ec11_trigger.c +++ b/app/drivers/sensor/ec11/ec11_trigger.c @@ -6,17 +6,17 @@ #define DT_DRV_COMPAT alps_ec11 -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include "ec11.h" extern struct ec11_data ec11_driver; -#include +#include LOG_MODULE_DECLARE(EC11, CONFIG_SENSOR_LOG_LEVEL); static inline void setup_int(const struct device *dev, bool enable) { diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index fcb24f6f..71df7344 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -8,9 +8,9 @@ #include #include -#include +#include #include -#include +#include #include #include diff --git a/app/include/drivers/ext_power.h b/app/include/drivers/ext_power.h index b422750c..287679e1 100644 --- a/app/include/drivers/ext_power.h +++ b/app/include/drivers/ext_power.h @@ -8,7 +8,7 @@ #include #include -#include +#include #ifdef __cplusplus extern "C" { diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 78d00bb7..66c1264a 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include __event_type_start = .; \ KEEP(*(".event_type")); \ diff --git a/app/include/zmk/behavior_queue.h b/app/include/zmk/behavior_queue.h index 8a184e4a..307482e7 100644 --- a/app/include/zmk/behavior_queue.h +++ b/app/include/zmk/behavior_queue.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/ble/profile.h b/app/include/zmk/ble/profile.h index 1df27436..0a57f16f 100644 --- a/app/include/zmk/ble/profile.h +++ b/app/include/zmk/ble/profile.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define ZMK_BLE_PROFILE_NAME_MAX 15 diff --git a/app/include/zmk/display/widgets/battery_status.h b/app/include/zmk/display/widgets/battery_status.h index b87e87ee..ce22da4d 100644 --- a/app/include/zmk/display/widgets/battery_status.h +++ b/app/include/zmk/display/widgets/battery_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_battery_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/layer_status.h b/app/include/zmk/display/widgets/layer_status.h index 3779351a..a11c4039 100644 --- a/app/include/zmk/display/widgets/layer_status.h +++ b/app/include/zmk/display/widgets/layer_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_layer_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/output_status.h b/app/include/zmk/display/widgets/output_status.h index 66f09271..ed8ee813 100644 --- a/app/include/zmk/display/widgets/output_status.h +++ b/app/include/zmk/display/widgets/output_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_output_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/peripheral_status.h b/app/include/zmk/display/widgets/peripheral_status.h index e3b41355..07caeaa7 100644 --- a/app/include/zmk/display/widgets/peripheral_status.h +++ b/app/include/zmk/display/widgets/peripheral_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_peripheral_status { sys_snode_t node; diff --git a/app/include/zmk/display/widgets/wpm_status.h b/app/include/zmk/display/widgets/wpm_status.h index 0592299e..fbe96cc2 100644 --- a/app/include/zmk/display/widgets/wpm_status.h +++ b/app/include/zmk/display/widgets/wpm_status.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include struct zmk_widget_wpm_status { sys_snode_t node; diff --git a/app/include/zmk/event_manager.h b/app/include/zmk/event_manager.h index 5acb26eb..aa9942ea 100644 --- a/app/include/zmk/event_manager.h +++ b/app/include/zmk/event_manager.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include struct zmk_event_type { diff --git a/app/include/zmk/events/activity_state_changed.h b/app/include/zmk/events/activity_state_changed.h index 998fa2d4..6a3481f3 100644 --- a/app/include/zmk/events/activity_state_changed.h +++ b/app/include/zmk/events/activity_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/battery_state_changed.h b/app/include/zmk/events/battery_state_changed.h index 6a003d8d..5a8c625e 100644 --- a/app/include/zmk/events/battery_state_changed.h +++ b/app/include/zmk/events/battery_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_battery_state_changed { diff --git a/app/include/zmk/events/ble_active_profile_changed.h b/app/include/zmk/events/ble_active_profile_changed.h index 4d3bb7ae..620e19b4 100644 --- a/app/include/zmk/events/ble_active_profile_changed.h +++ b/app/include/zmk/events/ble_active_profile_changed.h @@ -6,9 +6,9 @@ #pragma once -#include +#include #include -#include +#include #include diff --git a/app/include/zmk/events/endpoint_selection_changed.h b/app/include/zmk/events/endpoint_selection_changed.h index 38a6a8e5..198fe5a1 100644 --- a/app/include/zmk/events/endpoint_selection_changed.h +++ b/app/include/zmk/events/endpoint_selection_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 233ec62f..c3a3ed30 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/layer_state_changed.h b/app/include/zmk/events/layer_state_changed.h index 33183546..405d1365 100644 --- a/app/include/zmk/events/layer_state_changed.h +++ b/app/include/zmk/events/layer_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_layer_state_changed { diff --git a/app/include/zmk/events/modifiers_state_changed.h b/app/include/zmk/events/modifiers_state_changed.h index 504c2c9c..3f772cdb 100644 --- a/app/include/zmk/events/modifiers_state_changed.h +++ b/app/include/zmk/events/modifiers_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/events/position_state_changed.h b/app/include/zmk/events/position_state_changed.h index 5323e943..3e4e9238 100644 --- a/app/include/zmk/events/position_state_changed.h +++ b/app/include/zmk/events/position_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #define ZMK_POSITION_STATE_CHANGE_SOURCE_LOCAL UINT8_MAX diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index f579bc39..9398bcbb 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,9 +6,9 @@ #pragma once -#include +#include #include -#include +#include struct zmk_sensor_event { uint8_t sensor_number; const struct device *sensor; diff --git a/app/include/zmk/events/split_peripheral_status_changed.h b/app/include/zmk/events/split_peripheral_status_changed.h index c75a879f..6ea59f60 100644 --- a/app/include/zmk/events/split_peripheral_status_changed.h +++ b/app/include/zmk/events/split_peripheral_status_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include struct zmk_split_peripheral_status_changed { diff --git a/app/include/zmk/events/usb_conn_state_changed.h b/app/include/zmk/events/usb_conn_state_changed.h index b40158c3..5f4ac5d2 100644 --- a/app/include/zmk/events/usb_conn_state_changed.h +++ b/app/include/zmk/events/usb_conn_state_changed.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/include/zmk/events/wpm_state_changed.h b/app/include/zmk/events/wpm_state_changed.h index 3d1a3695..76253e20 100644 --- a/app/include/zmk/events/wpm_state_changed.h +++ b/app/include/zmk/events/wpm_state_changed.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 01104d1c..ab42adaa 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/include/zmk/keys.h b/app/include/zmk/keys.h index 38777ec8..fa6e7cfe 100644 --- a/app/include/zmk/keys.h +++ b/app/include/zmk/keys.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include typedef uint32_t zmk_key_t; diff --git a/app/include/zmk/matrix.h b/app/include/zmk/matrix.h index b3e2323b..5f8cd7d7 100644 --- a/app/include/zmk/matrix.h +++ b/app/include/zmk/matrix.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define ZMK_MATRIX_NODE_ID DT_CHOSEN(zmk_kscan) diff --git a/app/include/zmk/split/bluetooth/central.h b/app/include/zmk/split/bluetooth/central.h index 07240860..443d9b1b 100644 --- a/app/include/zmk/split/bluetooth/central.h +++ b/app/include/zmk/split/bluetooth/central.h @@ -1,7 +1,7 @@ #pragma once -#include +#include #include int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *binding, diff --git a/app/include/zmk/split/bluetooth/uuid.h b/app/include/zmk/split/bluetooth/uuid.h index 735f5751..cbdb1772 100644 --- a/app/include/zmk/split/bluetooth/uuid.h +++ b/app/include/zmk/split/bluetooth/uuid.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #ifndef BT_UUID_NUM_OF_DIGITALS #define BT_UUID_NUM_OF_DIGITALS BT_UUID_DECLARE_16(0x2909) diff --git a/app/include/zmk/usb.h b/app/include/zmk/usb.h index 786d9c73..9e92a836 100644 --- a/app/include/zmk/usb.h +++ b/app/include/zmk/usb.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #include #include diff --git a/app/src/activity.c b/app/src/activity.c index 029908c0..41fe2e15 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/backlight.c b/app/src/backlight.c index 159c6fb2..f633ddb7 100644 --- a/app/src/backlight.c +++ b/app/src/backlight.c @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include +#include -#include -#include -#include +#include +#include #include #include diff --git a/app/src/battery.c b/app/src/battery.c index 3f662241..540f7c3e 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 617d5aad..529e5782 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -6,8 +6,8 @@ #include -#include -#include +#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/behaviors/behavior_backlight.c b/app/src/behaviors/behavior_backlight.c index a1eaaf86..fe2155b7 100644 --- a/app/src/behaviors/behavior_backlight.c +++ b/app/src/behaviors/behavior_backlight.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_backlight -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 79b805b6..71cf2322 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -6,14 +6,16 @@ #define DT_DRV_COMPAT zmk_behavior_bluetooth -#include +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + #include #include -#include -#include #include -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 7a9612b3..8ee5bb5c 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_caps_word -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_ext_power.c b/app/src/behaviors/behavior_ext_power.c index 5db8aac2..690ac971 100644 --- a/app/src/behaviors/behavior_ext_power.c +++ b/app/src/behaviors/behavior_ext_power.c @@ -6,14 +6,14 @@ #define DT_DRV_COMPAT zmk_behavior_ext_power -#include -#include +#include +#include #include #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index a9e4d642..6ea2fe97 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -6,11 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_hold_tap -#include +#include #include #include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_key_press.c b/app/src/behaviors/behavior_key_press.c index 215da41d..2765db9f 100644 --- a/app/src/behaviors/behavior_key_press.c +++ b/app/src/behaviors/behavior_key_press.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_press -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_key_repeat.c b/app/src/behaviors/behavior_key_repeat.c index ad29cb0a..033f498b 100644 --- a/app/src/behaviors/behavior_key_repeat.c +++ b/app/src/behaviors/behavior_key_repeat.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_repeat -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_key_toggle.c b/app/src/behaviors/behavior_key_toggle.c index cd2a5dcd..cbbdd0d9 100644 --- a/app/src/behaviors/behavior_key_toggle.c +++ b/app/src/behaviors/behavior_key_toggle.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_key_toggle -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index 5b215b93..c86d732a 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_macro -#include +#include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index effbe4ac..e5ba346e 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_mod_morph -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_momentary_layer.c b/app/src/behaviors/behavior_momentary_layer.c index 46e49fcc..c2bd0ffc 100644 --- a/app/src/behaviors/behavior_momentary_layer.c +++ b/app/src/behaviors/behavior_momentary_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_momentary_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c index 1e7eb2b0..613ecbad 100644 --- a/app/src/behaviors/behavior_none.c +++ b/app/src/behaviors/behavior_none.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_none -#include +#include #include -#include +#include #include diff --git a/app/src/behaviors/behavior_outputs.c b/app/src/behaviors/behavior_outputs.c index 366abd8f..7aab8ee3 100644 --- a/app/src/behaviors/behavior_outputs.c +++ b/app/src/behaviors/behavior_outputs.c @@ -6,8 +6,8 @@ #define DT_DRV_COMPAT zmk_behavior_outputs -#include -#include +#include +#include #include #include @@ -15,7 +15,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_reset.c b/app/src/behaviors/behavior_reset.c index 47b11fa4..0b983c84 100644 --- a/app/src/behaviors/behavior_reset.c +++ b/app/src/behaviors/behavior_reset.c @@ -6,10 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_reset -#include -#include +#include +#include +#include + #include -#include #include diff --git a/app/src/behaviors/behavior_rgb_underglow.c b/app/src/behaviors/behavior_rgb_underglow.c index 3459cd22..0af07f81 100644 --- a/app/src/behaviors/behavior_rgb_underglow.c +++ b/app/src/behaviors/behavior_rgb_underglow.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_rgb_underglow -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index c4a34a94..ed6eedae 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -6,11 +6,11 @@ #define DT_DRV_COMPAT zmk_behavior_sensor_rotate_key_press -#include -#include -#include +#include +#include +#include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 267b81ab..22936086 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_sticky_key -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index 6d78cb3e..ddb4aeab 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_tap_dance -#include +#include #include -#include +#include #include #include #include diff --git a/app/src/behaviors/behavior_to_layer.c b/app/src/behaviors/behavior_to_layer.c index cce39d5d..c05b83ea 100644 --- a/app/src/behaviors/behavior_to_layer.c +++ b/app/src/behaviors/behavior_to_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_to_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c index a682c6fe..73a700ed 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_toggle_layer -#include +#include #include -#include +#include #include #include diff --git a/app/src/behaviors/behavior_transparent.c b/app/src/behaviors/behavior_transparent.c index 2ba05747..eeb2242d 100644 --- a/app/src/behaviors/behavior_transparent.c +++ b/app/src/behaviors/behavior_transparent.c @@ -6,9 +6,9 @@ #define DT_DRV_COMPAT zmk_behavior_transparent -#include +#include #include -#include +#include #include diff --git a/app/src/ble.c b/app/src/ble.c index 4d2e4603..aee90d5d 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -4,29 +4,29 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if IS_ENABLED(CONFIG_SETTINGS) -#include +#include #endif -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/combo.c b/app/src/combo.c index e434ae17..2e237330 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -6,11 +6,12 @@ #define DT_DRV_COMPAT zmk_combos -#include +#include +#include +#include +#include + #include -#include -#include -#include #include #include diff --git a/app/src/conditional_layer.c b/app/src/conditional_layer.c index 572652ff..9ba02a5c 100644 --- a/app/src/conditional_layer.c +++ b/app/src/conditional_layer.c @@ -7,10 +7,10 @@ #define DT_DRV_COMPAT zmk_conditional_layers #include -#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/display/main.c b/app/src/display/main.c index 3fb4e8f6..52fa3c69 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 6b58c301..7c3870a8 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -11,7 +11,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) diff --git a/app/src/display/widgets/battery_status.c b/app/src/display/widgets/battery_status.c index 3480101d..e35f890a 100644 --- a/app/src/display/widgets/battery_status.c +++ b/app/src/display/widgets/battery_status.c @@ -4,10 +4,10 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/layer_status.c b/app/src/display/widgets/layer_status.c index 8dc0061c..c3ddd07c 100644 --- a/app/src/display/widgets/layer_status.c +++ b/app/src/display/widgets/layer_status.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 135770a6..1c6da4b9 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -4,10 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/peripheral_status.c b/app/src/display/widgets/peripheral_status.c index d0c33f20..fdfe4d9c 100644 --- a/app/src/display/widgets/peripheral_status.c +++ b/app/src/display/widgets/peripheral_status.c @@ -4,10 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/display/widgets/wpm_status.c b/app/src/display/widgets/wpm_status.c index f3d06d65..9ae8b540 100644 --- a/app/src/display/widgets/wpm_status.c +++ b/app/src/display/widgets/wpm_status.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 33760010..9c824f44 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include @@ -18,7 +18,7 @@ #include #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define DEFAULT_ENDPOINT \ diff --git a/app/src/event_manager.c b/app/src/event_manager.c index 471432a8..0f4a5547 100644 --- a/app/src/event_manager.c +++ b/app/src/event_manager.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/events/activity_state_changed.c b/app/src/events/activity_state_changed.c index 2c27ce74..95be678e 100644 --- a/app/src/events/activity_state_changed.c +++ b/app/src/events/activity_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_activity_state_changed); \ No newline at end of file diff --git a/app/src/events/battery_state_changed.c b/app/src/events/battery_state_changed.c index 435fb24d..508ee971 100644 --- a/app/src/events/battery_state_changed.c +++ b/app/src/events/battery_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_battery_state_changed); \ No newline at end of file diff --git a/app/src/events/ble_active_profile_changed.c b/app/src/events/ble_active_profile_changed.c index c4887f73..dccbc7e0 100644 --- a/app/src/events/ble_active_profile_changed.c +++ b/app/src/events/ble_active_profile_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_ble_active_profile_changed); \ No newline at end of file diff --git a/app/src/events/endpoint_selection_changed.c b/app/src/events/endpoint_selection_changed.c index 7f9014da..34bc39dd 100644 --- a/app/src/events/endpoint_selection_changed.c +++ b/app/src/events/endpoint_selection_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_endpoint_selection_changed); diff --git a/app/src/events/keycode_state_changed.c b/app/src/events/keycode_state_changed.c index c9ef6aa7..a134f341 100644 --- a/app/src/events/keycode_state_changed.c +++ b/app/src/events/keycode_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_keycode_state_changed); diff --git a/app/src/events/layer_state_changed.c b/app/src/events/layer_state_changed.c index bd6234c9..79326ccc 100644 --- a/app/src/events/layer_state_changed.c +++ b/app/src/events/layer_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_layer_state_changed); \ No newline at end of file diff --git a/app/src/events/modifiers_state_changed.c b/app/src/events/modifiers_state_changed.c index 3dfea25f..f44d90dd 100644 --- a/app/src/events/modifiers_state_changed.c +++ b/app/src/events/modifiers_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_modifiers_state_changed); \ No newline at end of file diff --git a/app/src/events/position_state_changed.c b/app/src/events/position_state_changed.c index bb40584e..7b9be89f 100644 --- a/app/src/events/position_state_changed.c +++ b/app/src/events/position_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_position_state_changed); \ No newline at end of file diff --git a/app/src/events/sensor_event.c b/app/src/events/sensor_event.c index 94ade947..bec1e6e7 100644 --- a/app/src/events/sensor_event.c +++ b/app/src/events/sensor_event.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_sensor_event); \ No newline at end of file diff --git a/app/src/events/split_peripheral_status_changed.c b/app/src/events/split_peripheral_status_changed.c index 1d70b2ff..3f4c967d 100644 --- a/app/src/events/split_peripheral_status_changed.c +++ b/app/src/events/split_peripheral_status_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_split_peripheral_status_changed); \ No newline at end of file diff --git a/app/src/events/usb_conn_state_changed.c b/app/src/events/usb_conn_state_changed.c index b3555569..ae1f0503 100644 --- a/app/src/events/usb_conn_state_changed.c +++ b/app/src/events/usb_conn_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_usb_conn_state_changed); \ No newline at end of file diff --git a/app/src/events/wpm_state_changed.c b/app/src/events/wpm_state_changed.c index 3d9830bf..f16f54d2 100644 --- a/app/src/events/wpm_state_changed.c +++ b/app/src/events/wpm_state_changed.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include ZMK_EVENT_IMPL(zmk_wpm_state_changed); \ No newline at end of file diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index aab09cec..654f683f 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -7,17 +7,18 @@ #define DT_DRV_COMPAT zmk_ext_power_generic #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include + #include #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct ext_power_generic_config { diff --git a/app/src/hid.c b/app/src/hid.c index b66a910d..2a6b5d39 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -5,7 +5,7 @@ */ #include "zmk/keys.h" -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index e233b0b8..3a11101d 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -5,7 +5,7 @@ */ #include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/hog.c b/app/src/hog.c index 3dd3e874..930714b0 100644 --- a/app/src/hog.c +++ b/app/src/hog.c @@ -4,15 +4,15 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include -#include +#include +#include #include #include diff --git a/app/src/keymap.c b/app/src/keymap.c index b00d0fba..0f06a39a 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -4,9 +4,9 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include @@ -37,7 +37,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ - {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (,), node)}, + {LISTIFY(DT_PROP_LEN(node, bindings), BINDING_WITH_COMMA, (, ), node)}, #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ @@ -52,7 +52,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #define SENSOR_LAYER(node) \ COND_CODE_1( \ DT_NODE_HAS_PROP(node, sensor_bindings), \ - ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (,), node)}), \ + ({LISTIFY(DT_PROP_LEN(node, sensor_bindings), _TRANSFORM_SENSOR_ENTRY, (, ), node)}), \ ({})), #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/kscan.c b/app/src/kscan.c index c7cf2881..f9db8b1c 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/main.c b/app/src/main.c index ae604a7b..8ea67057 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -4,12 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); #include diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index e7c6e95f..47256608 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -4,7 +4,7 @@ * SPDX-License-Identifier: MIT */ -#include +#include #include #include #include @@ -15,7 +15,7 @@ [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i -static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (,), 0)}; +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (, ), 0)}; #endif diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 18614a4e..47c3658e 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -4,17 +4,17 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include +#include +#include +#include +#include #include #include -#include +#include -#include +#include #include #include diff --git a/app/src/sensors.c b/app/src/sensors.c index 184061ac..9873de4f 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index e94a59ae..82cf7e01 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -5,15 +5,16 @@ */ #include +#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -24,7 +25,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include -#include static int start_scan(void); diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index aa690ab2..07d3ee3f 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -4,29 +4,29 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if IS_ENABLED(CONFIG_SETTINGS) -#include +#include #endif -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index 5da5401d..cc20c72f 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -5,15 +5,15 @@ */ #include -#include -#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include -#include +#include +#include #include #include diff --git a/app/src/split/bluetooth/split_listener.c b/app/src/split/bluetooth/split_listener.c index 3f3763ae..eb5398c4 100644 --- a/app/src/split/bluetooth/split_listener.c +++ b/app/src/split/bluetooth/split_listener.c @@ -4,8 +4,8 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include #include diff --git a/app/src/usb.c b/app/src/usb.c index 146e7bb7..cf04ef46 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 4b90cf96..f46c70a0 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include +#include +#include -#include -#include +#include +#include #include #include diff --git a/app/src/wpm.c b/app/src/wpm.c index bcabf377..00a5942e 100644 --- a/app/src/wpm.c +++ b/app/src/wpm.c @@ -4,11 +4,11 @@ * SPDX-License-Identifier: MIT */ -#include -#include -#include +#include +#include +#include -#include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index af98613e..e65bb296 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -137,9 +137,9 @@ The code snippet below shows the essential components of a new driver. #define DT_DRV_COMPAT zmk_ // Dependencies -#include +#include #include -#include +#include #include From e84b4299b5ee15a922397c3485de83468b7036fd Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 00:47:36 -0400 Subject: [PATCH 297/494] refactor: Remove deprecated Kconfig override. --- app/Kconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 358d5d14..cf2cc6b3 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -429,9 +429,6 @@ config USB_CDC_ACM_RINGBUF_SIZE config LOG_BUFFER_SIZE default 8192 -config LOG_STRDUP_BUF_COUNT - default 16 - config LOG_PROCESS_THREAD_STARTUP_DELAY_MS default 1000 From 062f94d0144530fa699e5158b87293e7ebb526fc Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 20:36:34 -0500 Subject: [PATCH 298/494] refactor: Remove v1 logging vestiges. --- app/drivers/kscan/kscan_composite.c | 4 ++-- app/drivers/kscan/kscan_gpio_demux.c | 4 ++-- app/drivers/kscan/kscan_gpio_direct.c | 2 +- app/drivers/kscan/kscan_gpio_matrix.c | 4 ++-- app/src/behavior_queue.c | 2 +- app/src/ble.c | 30 +++++++++++++-------------- app/src/endpoints.c | 2 +- app/src/keymap.c | 5 ++--- app/src/split/bluetooth/central.c | 14 ++++++------- app/src/split/bluetooth/peripheral.c | 8 +++---- app/src/split/bluetooth/service.c | 4 ++-- 11 files changed, 39 insertions(+), 40 deletions(-) diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index e0cf47f9..b452a9d2 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -43,7 +43,7 @@ static int kscan_composite_enable_callback(const struct device *dev) { const struct device *dev = device_get_binding(cfg->label); if (!dev) { - LOG_WRN("Failed to load child kscan device %s", log_strdup(cfg->label)); + LOG_WRN("Failed to load child kscan device %s", cfg->label); continue; } kscan_enable_callback(dev); @@ -57,7 +57,7 @@ static int kscan_composite_disable_callback(const struct device *dev) { const struct device *dev = device_get_binding(cfg->label); if (!dev) { - LOG_WRN("Failed to load child kscan device %s", log_strdup(cfg->label)); + LOG_WRN("Failed to load child kscan device %s", cfg->label); continue; } kscan_disable_callback(dev); diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 5fdd3a7e..3ca300a3 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -240,8 +240,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (,), n)}, \ - .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (,), n)}, \ + .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (, ), n)}, \ + .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (, ), n)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 18a9348d..586e0d95 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -327,7 +327,7 @@ static const struct kscan_driver_api kscan_direct_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ - LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (,), n)}; \ + LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index 70502148..d2121273 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -433,10 +433,10 @@ static const struct kscan_driver_api kscan_matrix_api = { "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ - LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (,), n)}; \ + LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (, ), n)}; \ \ static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ - LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (,), n)}; \ + LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ \ diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 529e5782..971816f2 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -28,7 +28,7 @@ static void behavior_queue_process_next(struct k_work *work) { struct q_item item = {.wait = 0}; while (k_msgq_get(&zmk_behavior_queue_msgq, &item, K_NO_WAIT) == 0) { - LOG_DBG("Invoking %s: 0x%02x 0x%02x", log_strdup(item.binding.behavior_dev), + LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, item.binding.param1, item.binding.param2); struct zmk_behavior_binding_event event = {.position = item.position, diff --git a/app/src/ble.c b/app/src/ble.c index aee90d5d..a7037d0c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -111,7 +111,7 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { memcpy(&profiles[index].peer, addr, sizeof(bt_addr_le_t)); sprintf(setting_name, "ble/profiles/%d", index); - LOG_DBG("Setting profile addr for %s to %s", log_strdup(setting_name), log_strdup(addr_str)); + LOG_DBG("Setting profile addr for %s to %s", setting_name, addr_str); settings_save_one(setting_name, &profiles[index], sizeof(struct zmk_ble_profile)); k_work_submit(&raise_profile_changed_event_work); } @@ -177,7 +177,7 @@ int update_advertising() { // addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(zmk_ble_active_profile_addr(), addr_str, // sizeof(addr_str)); - // LOG_DBG("Directed advertising to %s", log_strdup(addr_str)); + // LOG_DBG("Directed advertising to %s", addr_str); // desired_adv = ZMK_ADV_DIR; } LOG_DBG("advertising from %d to %d", advertising_status, desired_adv); @@ -293,13 +293,13 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c void *cb_arg) { const char *next; - LOG_DBG("Setting BLE value %s", log_strdup(name)); + LOG_DBG("Setting BLE value %s", name); if (settings_name_steq(name, "profiles", &next) && next) { char *endptr; uint8_t idx = strtoul(next, &endptr, 10); if (*endptr != '\0') { - LOG_WRN("Invalid profile index: %s", log_strdup(next)); + LOG_WRN("Invalid profile index: %s", next); return -EINVAL; } @@ -324,7 +324,7 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c char addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(&profiles[idx].peer, addr_str, sizeof(addr_str)); - LOG_DBG("Loaded %s address for profile %d", log_strdup(addr_str), idx); + LOG_DBG("Loaded %s address for profile %d", addr_str, idx); } else if (settings_name_steq(name, "active_profile", &next) && !next) { if (len != sizeof(active_profile)) { return -EINVAL; @@ -376,12 +376,12 @@ static void connected(struct bt_conn *conn, uint8_t err) { advertising_status = ZMK_ADV_NONE; if (err) { - LOG_WRN("Failed to connect to %s (%u)", log_strdup(addr), err); + LOG_WRN("Failed to connect to %s (%u)", addr, err); update_advertising(); return; } - LOG_DBG("Connected %s", log_strdup(addr)); + LOG_DBG("Connected %s", addr); if (bt_conn_set_security(conn, BT_SECURITY_L2)) { LOG_ERR("Failed to set security"); @@ -401,7 +401,7 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected from %s (reason 0x%02x)", log_strdup(addr), reason); + LOG_DBG("Disconnected from %s (reason 0x%02x)", addr, reason); bt_conn_get_info(conn, &info); @@ -426,9 +426,9 @@ static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_ bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); if (!err) { - LOG_DBG("Security changed: %s level %u", log_strdup(addr), level); + LOG_DBG("Security changed: %s level %u", addr, level); } else { - LOG_ERR("Security failed: %s level %u err %d", log_strdup(addr), level, err); + LOG_ERR("Security failed: %s level %u err %d", addr, level, err); } } @@ -438,7 +438,7 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t l bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("%s: interval %d latency %d timeout %d", log_strdup(addr), interval, latency, timeout); + LOG_DBG("%s: interval %d latency %d timeout %d", addr, interval, latency, timeout); } static struct bt_conn_cb conn_callbacks = { @@ -454,7 +454,7 @@ static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Passkey for %s: %06u", log_strdup(addr), passkey); + LOG_DBG("Passkey for %s: %06u", addr, passkey); } */ @@ -465,7 +465,7 @@ static void auth_passkey_entry(struct bt_conn *conn) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Passkey entry requested for %s", log_strdup(addr)); + LOG_DBG("Passkey entry requested for %s", addr); passkey_digit = 0; auth_passkey_entry_conn = bt_conn_ref(conn); } @@ -486,7 +486,7 @@ static void auth_cancel(struct bt_conn *conn) { passkey_digit = 0; #endif - LOG_DBG("Pairing cancelled: %s", log_strdup(addr)); + LOG_DBG("Pairing cancelled: %s", addr); } static enum bt_security_err auth_pairing_accept(struct bt_conn *conn, @@ -517,7 +517,7 @@ static void auth_pairing_complete(struct bt_conn *conn, bool bonded) { } if (!zmk_ble_active_profile_is_open()) { - LOG_ERR("Pairing completed but current profile is not open: %s", log_strdup(addr)); + LOG_ERR("Pairing completed but current profile is not open: %s", addr); bt_unpair(BT_ID_DEFAULT, dst); return; } diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 9c824f44..dbd1a3e6 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -148,7 +148,7 @@ int zmk_endpoints_send_report(uint16_t usage_page) { static int endpoints_handle_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) { - LOG_DBG("Setting endpoint value %s", log_strdup(name)); + LOG_DBG("Setting endpoint value %s", name); if (settings_name_steq(name, "preferred", NULL)) { if (len != sizeof(enum zmk_endpoint)) { diff --git a/app/src/keymap.c b/app/src/keymap.c index 0f06a39a..99483592 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -179,8 +179,7 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position .timestamp = timestamp, }; - LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, - log_strdup(binding.behavior_dev)); + LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, binding.behavior_dev); behavior = device_get_binding(binding.behavior_dev); @@ -260,7 +259,7 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens int ret; LOG_DBG("layer: %d sensor_number: %d, binding name: %s", layer, sensor_number, - log_strdup(binding->behavior_dev)); + binding->behavior_dev); behavior = device_get_binding(binding->behavior_dev); diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 82cf7e01..5b952dfc 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -377,8 +377,8 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { bt_uuid_to_str(&uuid.uuid, uuid_str, sizeof(uuid_str)); bt_uuid_to_str(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID), service_uuid_str, sizeof(service_uuid_str)); - LOG_DBG("UUID %s does not match split UUID: %s", log_strdup(uuid_str), - log_strdup(service_uuid_str)); + LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, + service_uuid_str); continue; } @@ -433,7 +433,7 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui char dev[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, dev, sizeof(dev)); - LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", log_strdup(dev), type, ad->len, + LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); /* We're only interested in connectable events */ @@ -469,7 +469,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { } if (conn_err) { - LOG_ERR("Failed to connect to %s (%u)", log_strdup(addr), conn_err); + LOG_ERR("Failed to connect to %s (%u)", addr, conn_err); release_peripheral_slot_for_conn(conn); @@ -477,7 +477,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { return; } - LOG_DBG("Connected: %s", log_strdup(addr)); + LOG_DBG("Connected: %s", addr); confirm_peripheral_slot_conn(conn); split_central_process_connection(conn); @@ -489,7 +489,7 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected: %s (reason %d)", log_strdup(addr), reason); + LOG_DBG("Disconnected: %s (reason %d)", addr, reason); err = release_peripheral_slot_for_conn(conn); @@ -579,7 +579,7 @@ int zmk_split_bt_invoke_behavior(uint8_t source, struct zmk_behavior_binding *bi if (strlcpy(payload.behavior_dev, binding->behavior_dev, payload_dev_size) >= payload_dev_size) { LOG_ERR("Truncated behavior label %s to %s before invoking peripheral behavior", - log_strdup(binding->behavior_dev), log_strdup(payload.behavior_dev)); + binding->behavior_dev, payload.behavior_dev); } struct zmk_split_run_behavior_payload_wrapper wrapper = {.source = source, .payload = payload}; diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index 07d3ee3f..6b767baa 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -59,7 +59,7 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("Disconnected from %s (reason 0x%02x)", log_strdup(addr), reason); + LOG_DBG("Disconnected from %s (reason 0x%02x)", addr, reason); is_connected = false; @@ -73,9 +73,9 @@ static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_ bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); if (!err) { - LOG_DBG("Security changed: %s level %u", log_strdup(addr), level); + LOG_DBG("Security changed: %s level %u", addr, level); } else { - LOG_ERR("Security failed: %s level %u err %d", log_strdup(addr), level, err); + LOG_ERR("Security failed: %s level %u err %d", addr, level, err); } } @@ -85,7 +85,7 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t l bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); - LOG_DBG("%s: interval %d latency %d timeout %d", log_strdup(addr), interval, latency, timeout); + LOG_DBG("%s: interval %d latency %d timeout %d", addr, interval, latency, timeout); } static struct bt_conn_cb conn_callbacks = { diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index cc20c72f..fa4b7718 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -60,7 +60,7 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt .param2 = payload->data.param2, .behavior_dev = payload->behavior_dev, }; - LOG_DBG("%s with params %d %d: pressed? %d", log_strdup(binding.behavior_dev), + LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, binding.param2, payload->data.state); struct zmk_behavior_binding_event event = {.position = payload->data.position, .timestamp = k_uptime_get()}; @@ -72,7 +72,7 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt } if (err) { - LOG_ERR("Failed to invoke behavior %s: %d", log_strdup(binding.behavior_dev), err); + LOG_ERR("Failed to invoke behavior %s: %d", binding.behavior_dev, err); } } From 09ed79a867b9d360270d505ff361a65ed66735e3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 17 Jan 2023 20:40:44 -0500 Subject: [PATCH 299/494] refactor: Move away from deprecated label usages. * Move away from DT_LABEL. * Move to DEVICE_DT_GET for non-behavior device access. * Move various drivers to `gpio_spec_dt` and `DT` related macros. * Remove mcp23017 while at it, since better upstream driver is available. --- app/boards/arm/ferris/ferris_rev02.dts | 3 +- app/boards/arm/ferris/ferris_rev02_defconfig | 3 - app/boards/arm/mikoto/pinmux.c | 4 +- app/boards/arm/nrfmicro/pinmux.c | 2 +- app/boards/arm/puchi_ble/pinmux.c | 2 +- app/drivers/display/il0323.c | 146 +++----- app/drivers/gpio/CMakeLists.txt | 1 - app/drivers/gpio/Kconfig | 1 - app/drivers/gpio/Kconfig.mcp23017 | 22 -- app/drivers/gpio/gpio_mcp23017.c | 332 ------------------ app/drivers/gpio/gpio_mcp23017.h | 86 ----- app/drivers/kscan/kscan_composite.c | 26 +- app/drivers/kscan/kscan_gpio_demux.c | 90 ++--- .../sensor/battery/battery_voltage_divider.c | 77 ++-- app/drivers/sensor/ec11/ec11.c | 30 +- app/drivers/sensor/ec11/ec11.h | 11 +- app/drivers/sensor/ec11/ec11_trigger.c | 15 +- .../dts/bindings/gpio/microchip,mcp23017.yaml | 29 -- .../dts/bindings/gpio/zmk,gpio-595.yaml | 3 - .../bindings/sensor/zmk,battery-nrf-vddh.yaml | 5 - .../sensor/zmk,battery-voltage-divider.yaml | 5 - app/include/zmk/keymap.h | 2 +- app/include/zmk/kscan.h | 4 +- app/src/activity.c | 4 +- app/src/behavior_queue.c | 4 +- app/src/behaviors/behavior_bt.c | 1 - app/src/behaviors/behavior_caps_word.c | 9 +- app/src/behaviors/behavior_hold_tap.c | 4 +- app/src/behaviors/behavior_macro.c | 14 +- app/src/behaviors/behavior_mod_morph.c | 2 +- app/src/behaviors/behavior_tap_dance.c | 2 +- app/src/display/main.c | 11 +- app/src/ext_power_generic.c | 30 +- app/src/keymap.c | 5 +- app/src/kscan.c | 3 +- app/src/main.c | 4 +- app/src/rgb_underglow.c | 18 +- app/src/sensors.c | 3 +- app/src/split/bluetooth/central.c | 6 +- app/src/split/bluetooth/service.c | 4 +- docs/docs/development/new-behavior.md | 4 +- 41 files changed, 199 insertions(+), 828 deletions(-) delete mode 100644 app/drivers/gpio/Kconfig.mcp23017 delete mode 100644 app/drivers/gpio/gpio_mcp23017.c delete mode 100644 app/drivers/gpio/gpio_mcp23017.h delete mode 100644 app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 50de9526..55055e9a 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -104,11 +104,10 @@ clock-frequency = ; right_io: mcp23017@20 { - compatible = "microchip,mcp23017"; + compatible = "microchip,mcp230xx"; status = "okay"; gpio-controller; reg = <0x20>; - label = "RIGHT_IO"; #gpio-cells = <2>; ngpios = <16>; }; diff --git a/app/boards/arm/ferris/ferris_rev02_defconfig b/app/boards/arm/ferris/ferris_rev02_defconfig index 934dc4a0..267035c9 100644 --- a/app/boards/arm/ferris/ferris_rev02_defconfig +++ b/app/boards/arm/ferris/ferris_rev02_defconfig @@ -20,9 +20,6 @@ CONFIG_ZMK_USB=y CONFIG_ZMK_KSCAN_MATRIX_POLLING=y CONFIG_USB_SELF_POWERED=n -# Enable IO multiplexer -CONFIG_GPIO_MCP23017=y - # Needed to reduce this to size that will fit on F072 CONFIG_HEAP_MEM_POOL_SIZE=1024 diff --git a/app/boards/arm/mikoto/pinmux.c b/app/boards/arm/mikoto/pinmux.c index 6d7f46d1..524aa17e 100644 --- a/app/boards/arm/mikoto/pinmux.c +++ b/app/boards/arm/mikoto/pinmux.c @@ -15,8 +15,8 @@ static int pinmux_mikoto_init(const struct device *port) { ARG_UNUSED(port); #if CONFIG_BOARD_MIKOTO_520 - const struct device *p0 = device_get_binding("GPIO_0"); - const struct device *p1 = device_get_binding("GPIO_1"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); + const struct device *p1 = DEVICE_DT_GET(DT_NODELABEL(gpio1)); #if CONFIG_BOARD_MIKOTO_CHARGER_CURRENT_40MA gpio_pin_configure(p0, 26, GPIO_INPUT | GPIO_PULL_DOWN); gpio_pin_configure(p1, 15, GPIO_INPUT); diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c index 129530d4..6362b392 100644 --- a/app/boards/arm/nrfmicro/pinmux.c +++ b/app/boards/arm/nrfmicro/pinmux.c @@ -15,7 +15,7 @@ static int pinmux_nrfmicro_init(const struct device *port) { ARG_UNUSED(port); #if (CONFIG_BOARD_NRFMICRO_13 || CONFIG_BOARD_NRFMICRO_13_52833) - const struct device *p0 = device_get_binding("GPIO_0"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_NRFMICRO_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); gpio_pin_set(p0, 5, 0); diff --git a/app/boards/arm/puchi_ble/pinmux.c b/app/boards/arm/puchi_ble/pinmux.c index 0817b6e0..28178274 100644 --- a/app/boards/arm/puchi_ble/pinmux.c +++ b/app/boards/arm/puchi_ble/pinmux.c @@ -15,7 +15,7 @@ static int pinmux_puchi_ble_init(const struct device *port) { ARG_UNUSED(port); #if CONFIG_BOARD_PUCHI_BLE_v1 - const struct device *p0 = device_get_binding("GPIO_0"); + const struct device *p0 = DEVICE_DT_GET(DT_NODELABEL(gpio0)); #if CONFIG_BOARD_PUCHI_BLE_CHARGER gpio_pin_configure(p0, 5, GPIO_OUTPUT); gpio_pin_set(p0, 5, 0); diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index ec6da159..94e38481 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -24,23 +24,6 @@ LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); * */ -#define IL0323_SPI_FREQ DT_INST_PROP(0, spi_max_frequency) -#define IL0323_BUS_NAME DT_INST_BUS_LABEL(0) -#define IL0323_DC_PIN DT_INST_GPIO_PIN(0, dc_gpios) -#define IL0323_DC_FLAGS DT_INST_GPIO_FLAGS(0, dc_gpios) -#define IL0323_DC_CNTRL DT_INST_GPIO_LABEL(0, dc_gpios) -#define IL0323_CS_PIN DT_INST_SPI_DEV_CS_GPIOS_PIN(0) -#define IL0323_CS_FLAGS DT_INST_SPI_DEV_CS_GPIOS_FLAGS(0) -#if DT_INST_SPI_DEV_HAS_CS_GPIOS(0) -#define IL0323_CS_CNTRL DT_INST_SPI_DEV_CS_GPIOS_LABEL(0) -#endif -#define IL0323_BUSY_PIN DT_INST_GPIO_PIN(0, busy_gpios) -#define IL0323_BUSY_CNTRL DT_INST_GPIO_LABEL(0, busy_gpios) -#define IL0323_BUSY_FLAGS DT_INST_GPIO_FLAGS(0, busy_gpios) -#define IL0323_RESET_PIN DT_INST_GPIO_PIN(0, reset_gpios) -#define IL0323_RESET_CNTRL DT_INST_GPIO_LABEL(0, reset_gpios) -#define IL0323_RESET_FLAGS DT_INST_GPIO_FLAGS(0, reset_gpios) - #define EPD_PANEL_WIDTH DT_INST_PROP(0, width) #define EPD_PANEL_HEIGHT DT_INST_PROP(0, height) #define IL0323_PIXELS_PER_BYTE 8U @@ -53,15 +36,11 @@ LOG_MODULE_REGISTER(il0323, CONFIG_DISPLAY_LOG_LEVEL); #define IL0323_PANEL_LAST_PAGE (IL0323_NUMOF_PAGES - 1) #define IL0323_BUFFER_SIZE 1280 -struct il0323_data { - const struct device *reset; - const struct device *dc; - const struct device *busy; - const struct device *spi_dev; - struct spi_config spi_config; -#if defined(IL0323_CS_CNTRL) - struct spi_cs_control cs_ctrl; -#endif +struct il0323_cfg { + struct gpio_dt_spec reset; + struct gpio_dt_spec dc; + struct gpio_dt_spec busy; + struct spi_dt_spec spi; }; static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); @@ -69,21 +48,21 @@ static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); static uint8_t last_buffer[IL0323_BUFFER_SIZE]; static bool blanking_on = true; -static inline int il0323_write_cmd(struct il0323_data *driver, uint8_t cmd, uint8_t *data, +static inline int il0323_write_cmd(const struct il0323_cfg *cfg, uint8_t cmd, uint8_t *data, size_t len) { struct spi_buf buf = {.buf = &cmd, .len = sizeof(cmd)}; struct spi_buf_set buf_set = {.buffers = &buf, .count = 1}; - gpio_pin_set(driver->dc, IL0323_DC_PIN, 1); - if (spi_write(driver->spi_dev, &driver->spi_config, &buf_set)) { + gpio_pin_set_dt(&cfg->dc, 1); + if (spi_write_dt(&cfg->spi, &buf_set)) { return -EIO; } if (data != NULL) { buf.buf = data; buf.len = len; - gpio_pin_set(driver->dc, IL0323_DC_PIN, 0); - if (spi_write(driver->spi_dev, &driver->spi_config, &buf_set)) { + gpio_pin_set_dt(&cfg->dc, 0); + if (spi_write_dt(&cfg->spi, &buf_set)) { return -EIO; } } @@ -91,22 +70,22 @@ static inline int il0323_write_cmd(struct il0323_data *driver, uint8_t cmd, uint return 0; } -static inline void il0323_busy_wait(struct il0323_data *driver) { - int pin = gpio_pin_get(driver->busy, IL0323_BUSY_PIN); +static inline void il0323_busy_wait(const struct il0323_cfg *cfg) { + int pin = gpio_pin_get_dt(&cfg->busy); while (pin > 0) { __ASSERT(pin >= 0, "Failed to get pin level"); // LOG_DBG("wait %u", pin); k_msleep(IL0323_BUSY_DELAY); - pin = gpio_pin_get(driver->busy, IL0323_BUSY_PIN); + pin = gpio_pin_get_dt(&cfg->busy); } } static int il0323_update_display(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; LOG_DBG("Trigger update sequence"); - if (il0323_write_cmd(driver, IL0323_CMD_DRF, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DRF, NULL, 0)) { return -EIO; } @@ -117,7 +96,7 @@ static int il0323_update_display(const struct device *dev) { static int il0323_write(const struct device *dev, const uint16_t x, const uint16_t y, const struct display_buffer_descriptor *desc, const void *buf) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; uint16_t x_end_idx = x + desc->width - 1; uint16_t y_end_idx = y + desc->height - 1; uint8_t ptl[IL0323_PTL_REG_LENGTH] = {0}; @@ -147,20 +126,20 @@ static int il0323_write(const struct device *dev, const uint16_t x, const uint16 ptl[sizeof(ptl) - 1] = IL0323_PTL_PT_SCAN; LOG_HEXDUMP_DBG(ptl, sizeof(ptl), "ptl"); - il0323_busy_wait(driver); - if (il0323_write_cmd(driver, IL0323_CMD_PIN, NULL, 0)) { + il0323_busy_wait(cfg); + if (il0323_write_cmd(cfg, IL0323_CMD_PIN, NULL, 0)) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_PTL, ptl, sizeof(ptl))) { + if (il0323_write_cmd(cfg, IL0323_CMD_PTL, ptl, sizeof(ptl))) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_DTM1, last_buffer, IL0323_BUFFER_SIZE)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DTM1, last_buffer, IL0323_BUFFER_SIZE)) { return -EIO; } - if (il0323_write_cmd(driver, IL0323_CMD_DTM2, (uint8_t *)buf, buf_len)) { + if (il0323_write_cmd(cfg, IL0323_CMD_DTM2, (uint8_t *)buf, buf_len)) { return -EIO; } @@ -173,7 +152,7 @@ static int il0323_write(const struct device *dev, const uint16_t x, const uint16 } } - if (il0323_write_cmd(driver, IL0323_CMD_POUT, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_POUT, NULL, 0)) { return -EIO; } @@ -217,11 +196,11 @@ static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t patte } static int il0323_blanking_off(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; if (blanking_on) { - /* Update EPD pannel in normal mode */ - il0323_busy_wait(driver); + /* Update EPD panel in normal mode */ + il0323_busy_wait(cfg); if (il0323_clear_and_write_buffer(dev, 0xff, true)) { return -EIO; } @@ -278,30 +257,30 @@ static int il0323_set_pixel_format(const struct device *dev, const enum display_ } static int il0323_controller_init(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; uint8_t tmp[IL0323_TRES_REG_LENGTH]; LOG_DBG(""); - gpio_pin_set(driver->reset, IL0323_RESET_PIN, 1); + gpio_pin_set_dt(&cfg->reset, 1); k_msleep(IL0323_RESET_DELAY); - gpio_pin_set(driver->reset, IL0323_RESET_PIN, 0); + gpio_pin_set_dt(&cfg->reset, 0); k_msleep(IL0323_RESET_DELAY); - il0323_busy_wait(driver); + il0323_busy_wait(cfg); LOG_DBG("Initialize IL0323 controller"); - if (il0323_write_cmd(driver, IL0323_CMD_PWR, il0323_pwr, sizeof(il0323_pwr))) { + if (il0323_write_cmd(cfg, IL0323_CMD_PWR, il0323_pwr, sizeof(il0323_pwr))) { return -EIO; } /* Turn on: booster, controller, regulators, and sensor. */ - if (il0323_write_cmd(driver, IL0323_CMD_PON, NULL, 0)) { + if (il0323_write_cmd(cfg, IL0323_CMD_PON, NULL, 0)) { return -EIO; } k_msleep(IL0323_PON_DELAY); - il0323_busy_wait(driver); + il0323_busy_wait(cfg); /* Pannel settings, KW mode */ tmp[0] = IL0323_PSR_UD | IL0323_PSR_SHL | IL0323_PSR_SHD | IL0323_PSR_RST; @@ -321,7 +300,7 @@ static int il0323_controller_init(const struct device *dev) { #endif /* panel width */ LOG_HEXDUMP_DBG(tmp, 1, "PSR"); - if (il0323_write_cmd(driver, IL0323_CMD_PSR, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_PSR, tmp, 1)) { return -EIO; } @@ -329,24 +308,24 @@ static int il0323_controller_init(const struct device *dev) { tmp[IL0323_TRES_HRES_IDX] = EPD_PANEL_WIDTH; tmp[IL0323_TRES_VRES_IDX] = EPD_PANEL_HEIGHT; LOG_HEXDUMP_DBG(tmp, IL0323_TRES_REG_LENGTH, "TRES"); - if (il0323_write_cmd(driver, IL0323_CMD_TRES, tmp, IL0323_TRES_REG_LENGTH)) { + if (il0323_write_cmd(cfg, IL0323_CMD_TRES, tmp, IL0323_TRES_REG_LENGTH)) { return -EIO; } tmp[IL0323_CDI_CDI_IDX] = DT_INST_PROP(0, cdi); LOG_HEXDUMP_DBG(tmp, IL0323_CDI_REG_LENGTH, "CDI"); - if (il0323_write_cmd(driver, IL0323_CMD_CDI, tmp, IL0323_CDI_REG_LENGTH)) { + if (il0323_write_cmd(cfg, IL0323_CMD_CDI, tmp, IL0323_CDI_REG_LENGTH)) { return -EIO; } tmp[0] = DT_INST_PROP(0, tcon); - if (il0323_write_cmd(driver, IL0323_CMD_TCON, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_TCON, tmp, 1)) { return -EIO; } /* Enable Auto Sequence */ tmp[0] = IL0323_AUTO_PON_DRF_POF; - if (il0323_write_cmd(driver, IL0323_CMD_AUTO, tmp, 1)) { + if (il0323_write_cmd(cfg, IL0323_CMD_AUTO, tmp, 1)) { return -EIO; } @@ -354,62 +333,43 @@ static int il0323_controller_init(const struct device *dev) { } static int il0323_init(const struct device *dev) { - struct il0323_data *driver = dev->data; + const struct il0323_cfg *cfg = dev->config; - LOG_DBG(""); - - driver->spi_dev = device_get_binding(IL0323_BUS_NAME); - if (driver->spi_dev == NULL) { - LOG_ERR("Could not get SPI device for IL0323"); + if (!spi_is_ready(&cfg->spi)) { + LOG_ERR("SPI device not ready for IL0323"); return -EIO; } - driver->spi_config.frequency = IL0323_SPI_FREQ; - driver->spi_config.operation = SPI_OP_MODE_MASTER | SPI_WORD_SET(8); - driver->spi_config.slave = DT_INST_REG_ADDR(0); - driver->spi_config.cs = NULL; - - driver->reset = device_get_binding(IL0323_RESET_CNTRL); - if (driver->reset == NULL) { + if (!device_is_ready(cfg->reset.port)) { LOG_ERR("Could not get GPIO port for IL0323 reset"); return -EIO; } - gpio_pin_configure(driver->reset, IL0323_RESET_PIN, GPIO_OUTPUT_INACTIVE | IL0323_RESET_FLAGS); + gpio_pin_configure_dt(&cfg->reset, GPIO_OUTPUT_INACTIVE); - driver->dc = device_get_binding(IL0323_DC_CNTRL); - if (driver->dc == NULL) { + if (!device_is_ready(cfg->dc.port)) { LOG_ERR("Could not get GPIO port for IL0323 DC signal"); return -EIO; } - gpio_pin_configure(driver->dc, IL0323_DC_PIN, GPIO_OUTPUT_INACTIVE | IL0323_DC_FLAGS); + gpio_pin_configure_dt(&cfg->dc, GPIO_OUTPUT_INACTIVE); - driver->busy = device_get_binding(IL0323_BUSY_CNTRL); - if (driver->busy == NULL) { + if (!device_is_ready(cfg->busy.port)) { LOG_ERR("Could not get GPIO port for IL0323 busy signal"); return -EIO; } - gpio_pin_configure(driver->busy, IL0323_BUSY_PIN, GPIO_INPUT | IL0323_BUSY_FLAGS); - -#if defined(IL0323_CS_CNTRL) - driver->cs_ctrl.gpio_dev = device_get_binding(IL0323_CS_CNTRL); - if (!driver->cs_ctrl.gpio_dev) { - LOG_ERR("Unable to get SPI GPIO CS device"); - return -EIO; - } - - driver->cs_ctrl.gpio_pin = IL0323_CS_PIN; - driver->cs_ctrl.gpio_dt_flags = IL0323_CS_FLAGS; - driver->cs_ctrl.delay = 0U; - driver->spi_config.cs = &driver->cs_ctrl; -#endif + gpio_pin_configure_dt(&cfg->busy, GPIO_INPUT); return il0323_controller_init(dev); } -static struct il0323_data il0323_driver; +static struct il0323_cfg il0323_config = { + .spi = SPI_DT_SPEC_INST_GET(0, SPI_OP_MODE_MASTER | SPI_WORD_SET(8), 0), + .reset = GPIO_DT_SPEC_INST_GET(0, reset_gpios), + .busy = GPIO_DT_SPEC_INST_GET(0, busy_gpios), + .dc = GPIO_DT_SPEC_INST_GET(0, dc_gpios), +}; static struct display_driver_api il0323_driver_api = { .blanking_on = il0323_blanking_on, @@ -424,5 +384,5 @@ static struct display_driver_api il0323_driver_api = { .set_orientation = il0323_set_orientation, }; -DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, &il0323_driver, NULL, POST_KERNEL, +DEVICE_DT_INST_DEFINE(0, il0323_init, NULL, NULL, &il0323_config, POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, &il0323_driver_api); diff --git a/app/drivers/gpio/CMakeLists.txt b/app/drivers/gpio/CMakeLists.txt index f4378151..0756ed38 100644 --- a/app/drivers/gpio/CMakeLists.txt +++ b/app/drivers/gpio/CMakeLists.txt @@ -5,5 +5,4 @@ zephyr_library_named(zmk__drivers__gpio) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_GPIO_595 gpio_595.c) -zephyr_library_sources_ifdef(CONFIG_GPIO_MCP23017 gpio_mcp23017.c) zephyr_library_sources_ifdef(CONFIG_GPIO_MAX7318 gpio_max7318.c) diff --git a/app/drivers/gpio/Kconfig b/app/drivers/gpio/Kconfig index 43c7c24e..54b30590 100644 --- a/app/drivers/gpio/Kconfig +++ b/app/drivers/gpio/Kconfig @@ -1,6 +1,5 @@ menuconfig ZMK_DRIVERS_GPIO bool "GPIO" -rsource "Kconfig.mcp23017" rsource "Kconfig.max7318" rsource "Kconfig.595" diff --git a/app/drivers/gpio/Kconfig.mcp23017 b/app/drivers/gpio/Kconfig.mcp23017 deleted file mode 100644 index 049ca82e..00000000 --- a/app/drivers/gpio/Kconfig.mcp23017 +++ /dev/null @@ -1,22 +0,0 @@ -# MCP23017 GPIO configuration options - -# Copyright (c) 2021 Pete Johanson -# SPDX-License-Identifier: Apache-2.0 - -menuconfig GPIO_MCP23017 - bool "MCP23017 I2C-based GPIO chip" - depends on I2C - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for MCP23017 I2C-based GPIO chip. - -if GPIO_MCP23017 - -config GPIO_MCP23017_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. - -endif #GPIO_MCP23017 diff --git a/app/drivers/gpio/gpio_mcp23017.c b/app/drivers/gpio/gpio_mcp23017.c deleted file mode 100644 index feafbd0a..00000000 --- a/app/drivers/gpio/gpio_mcp23017.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright (c) 2020 Geanix ApS - * - * SPDX-License-Identifier: Apache-2.0 - */ - -#define DT_DRV_COMPAT microchip_mcp23017 - -/** - * @file Driver for MCP23017 SPI-based GPIO driver. - */ - -#include - -#include -#include -#include -#include -#include -#include - -#include "gpio_mcp23017.h" - -#define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include -LOG_MODULE_REGISTER(gpio_mcp23017); - -/** - * @brief Read both port 0 and port 1 registers of certain register function. - * - * Given the register in reg, read the pair of port 0 and port 1. - * - * @param dev Device struct of the MCP23017. - * @param reg Register to read (the PORTA of the pair of registers). - * @param buf Buffer to read data into. - * - * @return 0 if successful, failed otherwise. - */ -static int read_port_regs(const struct device *dev, uint8_t reg, uint16_t *buf) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - uint16_t port_data; - - uint8_t addr = config->slave; - - ret = i2c_burst_read(drv_data->i2c, addr, reg, (uint8_t *)&port_data, sizeof(port_data)); - if (ret) { - LOG_DBG("i2c_write_read FAIL %d\n", ret); - return ret; - } - - *buf = sys_le16_to_cpu(port_data); - - LOG_DBG("MCP23017: Read: REG[0x%X] = 0x%X, REG[0x%X] = 0x%X", reg, (*buf & 0xFF), (reg + 1), - (*buf >> 8)); - - return 0; -} - -/** - * @brief Write both port 0 and port 1 registers of certain register function. - * - * Given the register in reg, write the pair of port 0 and port 1. - * - * @param dev Device struct of the MCP23017. - * @param reg Register to write into (the PORTA of the pair of registers). - * @param buf Buffer to write data from. - * - * @return 0 if successful, failed otherwise. - */ -static int write_port_regs(const struct device *dev, uint8_t reg, uint16_t value) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - uint16_t port_data; - - LOG_DBG("MCP23017: Write: REG[0x%X] = 0x%X, REG[0x%X] = 0x%X", reg, (value & 0xFF), (reg + 1), - (value >> 8)); - - port_data = sys_cpu_to_le16(value); - - ret = i2c_burst_write(drv_data->i2c, config->slave, reg, (uint8_t *)&port_data, - sizeof(port_data)); - if (ret) { - LOG_DBG("i2c_write FAIL %d\n", ret); - return ret; - } - - return 0; -} - -/** - * @brief Setup the pin direction (input or output) - * - * @param dev Device struct of the MCP23017 - * @param pin The pin number - * @param flags Flags of pin or port - * - * @return 0 if successful, failed otherwise - */ -static int setup_pin_dir(const struct device *dev, uint32_t pin, int flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t *dir = &drv_data->reg_cache.iodir; - uint16_t *output = &drv_data->reg_cache.gpio; - int ret; - - if ((flags & GPIO_OUTPUT) != 0U) { - if ((flags & GPIO_OUTPUT_INIT_HIGH) != 0U) { - *output |= BIT(pin); - } else if ((flags & GPIO_OUTPUT_INIT_LOW) != 0U) { - *output &= ~BIT(pin); - } - *dir &= ~BIT(pin); - } else { - *dir |= BIT(pin); - } - - ret = write_port_regs(dev, REG_GPIO_PORTA, *output); - if (ret != 0) { - return ret; - } - - ret = write_port_regs(dev, REG_IODIR_PORTA, *dir); - - return ret; -} - -/** - * @brief Setup the pin pull up/pull down status - * - * @param dev Device struct of the MCP23017 - * @param pin The pin number - * @param flags Flags of pin or port - * - * @return 0 if successful, failed otherwise - */ -static int setup_pin_pullupdown(const struct device *dev, uint32_t pin, int flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t port; - int ret; - - /* Setup pin pull up or pull down */ - port = drv_data->reg_cache.gppu; - - /* pull down == 0, pull up == 1 */ - if ((flags & GPIO_PULL_DOWN) != 0U) { - return -ENOTSUP; - } - - WRITE_BIT(port, pin, (flags & GPIO_PULL_UP) != 0U); - - ret = write_port_regs(dev, REG_GPPU_PORTA, port); - if (ret == 0) { - drv_data->reg_cache.gppu = port; - } - - return ret; -} - -static int mcp23017_config(const struct device *dev, gpio_pin_t pin, gpio_flags_t flags) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - if ((flags & GPIO_OPEN_DRAIN) != 0U) { - ret = -ENOTSUP; - goto done; - }; - - ret = setup_pin_dir(dev, pin, flags); - if (ret) { - LOG_ERR("MCP23017: error setting pin direction (%d)", ret); - goto done; - } - - ret = setup_pin_pullupdown(dev, pin, flags); - if (ret) { - LOG_ERR("MCP23017: error setting pin pull up/down (%d)", ret); - goto done; - } - -done: - k_sem_give(&drv_data->lock); - return ret; -} - -static int mcp23017_port_get_raw(const struct device *dev, uint32_t *value) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - ret = read_port_regs(dev, REG_GPIO_PORTA, &buf); - if (ret != 0) { - goto done; - } - - *value = buf; - -done: - k_sem_give(&drv_data->lock); - return ret; -} - -static int mcp23017_port_set_masked_raw(const struct device *dev, uint32_t mask, uint32_t value) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - buf = drv_data->reg_cache.gpio; - buf = (buf & ~mask) | (mask & value); - - ret = write_port_regs(dev, REG_GPIO_PORTA, buf); - if (ret == 0) { - drv_data->reg_cache.gpio = buf; - } - - k_sem_give(&drv_data->lock); - - return ret; -} - -static int mcp23017_port_set_bits_raw(const struct device *dev, uint32_t mask) { - return mcp23017_port_set_masked_raw(dev, mask, mask); -} - -static int mcp23017_port_clear_bits_raw(const struct device *dev, uint32_t mask) { - return mcp23017_port_set_masked_raw(dev, mask, 0); -} - -static int mcp23017_port_toggle_bits(const struct device *dev, uint32_t mask) { - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - uint16_t buf; - int ret; - - /* Can't do SPI bus operations from an ISR */ - if (k_is_in_isr()) { - return -EWOULDBLOCK; - } - - k_sem_take(&drv_data->lock, K_FOREVER); - - buf = drv_data->reg_cache.gpio; - buf ^= mask; - - ret = write_port_regs(dev, REG_GPIO_PORTA, buf); - if (ret == 0) { - drv_data->reg_cache.gpio = buf; - } - - k_sem_give(&drv_data->lock); - - return ret; -} - -static int mcp23017_pin_interrupt_configure(const struct device *dev, gpio_pin_t pin, - enum gpio_int_mode mode, enum gpio_int_trig trig) { - return -ENOTSUP; -} - -static const struct gpio_driver_api api_table = { - .pin_configure = mcp23017_config, - .port_get_raw = mcp23017_port_get_raw, - .port_set_masked_raw = mcp23017_port_set_masked_raw, - .port_set_bits_raw = mcp23017_port_set_bits_raw, - .port_clear_bits_raw = mcp23017_port_clear_bits_raw, - .port_toggle_bits = mcp23017_port_toggle_bits, - .pin_interrupt_configure = mcp23017_pin_interrupt_configure, -}; - -/** - * @brief Initialization function of MCP23017 - * - * @param dev Device struct - * @return 0 if successful, failed otherwise. - */ -static int mcp23017_init(const struct device *dev) { - const struct mcp23017_config *const config = dev->config; - struct mcp23017_drv_data *const drv_data = (struct mcp23017_drv_data *const)dev->data; - - drv_data->i2c = device_get_binding((char *)config->i2c_dev_name); - if (!drv_data->i2c) { - LOG_DBG("Unable to get i2c device"); - return -ENODEV; - } - - k_sem_init(&drv_data->lock, 1, 1); - - return 0; -} - -#define MCP23017_INIT(inst) \ - static struct mcp23017_config mcp23017_##inst##_config = { \ - .i2c_dev_name = DT_INST_BUS_LABEL(inst), \ - .slave = DT_INST_REG_ADDR(inst), \ - \ - }; \ - \ - static struct mcp23017_drv_data mcp23017_##inst##_drvdata = { \ - /* Default for registers according to datasheet */ \ - .reg_cache.iodir = 0xFFFF, .reg_cache.ipol = 0x0, .reg_cache.gpinten = 0x0, \ - .reg_cache.defval = 0x0, .reg_cache.intcon = 0x0, .reg_cache.iocon = 0x0, \ - .reg_cache.gppu = 0x0, .reg_cache.intf = 0x0, .reg_cache.intcap = 0x0, \ - .reg_cache.gpio = 0x0, .reg_cache.olat = 0x0, \ - }; \ - \ - /* This has to init after SPI master */ \ - DEVICE_DT_INST_DEFINE(inst, mcp23017_init, NULL, &mcp23017_##inst##_drvdata, \ - &mcp23017_##inst##_config, POST_KERNEL, \ - CONFIG_GPIO_MCP23017_INIT_PRIORITY, &api_table); - -DT_INST_FOREACH_STATUS_OKAY(MCP23017_INIT) diff --git a/app/drivers/gpio/gpio_mcp23017.h b/app/drivers/gpio/gpio_mcp23017.h deleted file mode 100644 index 01908c0c..00000000 --- a/app/drivers/gpio/gpio_mcp23017.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2020 Geanix ApS, Pete Johanson - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @file Header file for the MCP23017 driver. - */ - -#ifndef ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ -#define ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ - -#include - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* Register definitions */ -#define REG_IODIR_PORTA 0x00 -#define REG_IODIR_PORTB 0x01 -#define REG_IPOL_PORTA 0x02 -#define REG_IPOL_PORTB 0x03 -#define REG_GPINTEN_PORTA 0x04 -#define REG_GPINTEN_PORTB 0x05 -#define REG_DEFVAL_PORTA 0x06 -#define REG_DEFVAL_PORTB 0x07 -#define REG_INTCON_PORTA 0x08 -#define REG_INTCON_PORTB 0x09 -#define REG_GPPU_PORTA 0x0C -#define REG_GPPU_PORTB 0x0D -#define REG_INTF_PORTA 0x0E -#define REG_INTF_PORTB 0x0F -#define REG_INTCAP_PORTA 0x10 -#define REG_INTCAP_PORTB 0x11 -#define REG_GPIO_PORTA 0x12 -#define REG_GPIO_PORTB 0x13 -#define REG_OLAT_PORTA 0x14 -#define REG_OLAT_PORTB 0x15 - -#define MCP23017_ADDR 0x40 -#define MCP23017_READBIT 0x01 - -/** Configuration data */ -struct mcp23017_config { - /* gpio_driver_data needs to be first */ - struct gpio_driver_config common; - - const char *const i2c_dev_name; - const uint16_t slave; -}; - -/** Runtime driver data */ -struct mcp23017_drv_data { - /* gpio_driver_data needs to be first */ - struct gpio_driver_config data; - - /** Master SPI device */ - const struct device *i2c; - - struct k_sem lock; - - struct { - uint16_t iodir; - uint16_t ipol; - uint16_t gpinten; - uint16_t defval; - uint16_t intcon; - uint16_t iocon; - uint16_t gppu; - uint16_t intf; - uint16_t intcap; - uint16_t gpio; - uint16_t olat; - } reg_cache; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* ZEPHYR_DRIVERS_GPIO_GPIO_MCP23017_H_ */ diff --git a/app/drivers/kscan/kscan_composite.c b/app/drivers/kscan/kscan_composite.c index b452a9d2..9909a4cf 100644 --- a/app/drivers/kscan/kscan_composite.c +++ b/app/drivers/kscan/kscan_composite.c @@ -7,7 +7,7 @@ #define DT_DRV_COMPAT zmk_kscan_composite #include -#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -16,13 +16,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define MATRIX_COLS DT_PROP(MATRIX_NODE_ID, columns) struct kscan_composite_child_config { - char *label; + const struct device *child; uint8_t row_offset; uint8_t column_offset; }; #define CHILD_CONFIG(inst) \ - {.label = DT_LABEL(DT_PHANDLE(inst, kscan)), \ + {.child = DEVICE_DT_GET(DT_PHANDLE(inst, kscan)), \ .row_offset = DT_PROP(inst, row_offset), \ .column_offset = DT_PROP(inst, column_offset)}, @@ -41,12 +41,7 @@ static int kscan_composite_enable_callback(const struct device *dev) { for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - const struct device *dev = device_get_binding(cfg->label); - if (!dev) { - LOG_WRN("Failed to load child kscan device %s", cfg->label); - continue; - } - kscan_enable_callback(dev); + kscan_enable_callback(cfg->child); } return 0; } @@ -55,12 +50,7 @@ static int kscan_composite_disable_callback(const struct device *dev) { for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - const struct device *dev = device_get_binding(cfg->label); - if (!dev) { - LOG_WRN("Failed to load child kscan device %s", cfg->label); - continue; - } - kscan_disable_callback(dev); + kscan_disable_callback(cfg->child); } return 0; } @@ -68,13 +58,13 @@ static int kscan_composite_disable_callback(const struct device *dev) { static void kscan_composite_child_callback(const struct device *child_dev, uint32_t row, uint32_t column, bool pressed) { // TODO: Ideally we can get this passed into our callback! - const struct device *dev = device_get_binding(DT_INST_LABEL(0)); + const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(0)); struct kscan_composite_data *data = dev->data; for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - if (device_get_binding(cfg->label) != child_dev) { + if (cfg->child != child_dev) { continue; } @@ -92,7 +82,7 @@ static int kscan_composite_configure(const struct device *dev, kscan_callback_t for (int i = 0; i < ARRAY_SIZE(kscan_composite_children); i++) { const struct kscan_composite_child_config *cfg = &kscan_composite_children[i]; - kscan_config(device_get_binding(cfg->label), &kscan_composite_child_callback); + kscan_config(cfg->child, &kscan_composite_child_callback); } data->callback = callback; diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/drivers/kscan/kscan_gpio_demux.c index 3ca300a3..812a899d 100644 --- a/app/drivers/kscan/kscan_gpio_demux.c +++ b/app/drivers/kscan/kscan_gpio_demux.c @@ -13,26 +13,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -struct kscan_gpio_item_config { - char *label; - gpio_pin_t pin; - gpio_flags_t flags; -}; - // Helper macro #define PWR_TWO(x) (1 << (x)) -// Define GPIO cfg -#define _KSCAN_GPIO_ITEM_CFG_INIT(n, prop, idx) \ - { \ - .label = DT_INST_GPIO_LABEL_BY_IDX(n, prop, idx), \ - .pin = DT_INST_GPIO_PIN_BY_IDX(n, prop, idx), \ - .flags = DT_INST_GPIO_FLAGS_BY_IDX(n, prop, idx), \ - } - // Define row and col cfg -#define _KSCAN_GPIO_INPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, input_gpios, idx) -#define _KSCAN_GPIO_OUTPUT_CFG_INIT(idx, n) _KSCAN_GPIO_ITEM_CFG_INIT(n, output_gpios, idx) +#define _KSCAN_GPIO_CFG_INIT(n, prop, idx) GPIO_DT_SPEC_GET_BY_IDX(n, prop, idx), // Check debounce config #define CHECK_DEBOUNCE_CFG(n, a, b) COND_CODE_0(DT_INST_PROP(n, debounce_period), a, b) @@ -51,8 +36,8 @@ struct kscan_gpio_item_config { }; \ \ struct kscan_gpio_config_##n { \ - struct kscan_gpio_item_config rows[INST_MATRIX_INPUTS(n)]; \ - struct kscan_gpio_item_config cols[INST_DEMUX_GPIOS(n)]; \ + const struct gpio_dt_spec rows[INST_MATRIX_INPUTS(n)]; \ + const struct gpio_dt_spec cols[INST_DEMUX_GPIOS(n)]; \ }; \ \ struct kscan_gpio_data_##n { \ @@ -60,33 +45,16 @@ struct kscan_gpio_item_config { struct k_timer poll_timer; \ struct CHECK_DEBOUNCE_CFG(n, (k_work), (k_work_delayable)) work; \ bool matrix_state[INST_MATRIX_INPUTS(n)][INST_MATRIX_OUTPUTS(n)]; \ - const struct device *rows[INST_MATRIX_INPUTS(n)]; \ - const struct device *cols[INST_MATRIX_OUTPUTS(n)]; \ const struct device *dev; \ }; \ /* IO/GPIO SETUP */ \ - /* gpio_input_devices are PHYSICAL IO devices */ \ - static const struct device **kscan_gpio_input_devices_##n(const struct device *dev) { \ - struct kscan_gpio_data_##n *data = dev->data; \ - return data->rows; \ - } \ - \ - static const struct kscan_gpio_item_config *kscan_gpio_input_configs_##n( \ - const struct device *dev) { \ + static const struct gpio_dt_spec *kscan_gpio_input_specs_##n(const struct device *dev) { \ const struct kscan_gpio_config_##n *cfg = dev->config; \ return cfg->rows; \ } \ \ - /* gpio_output_devices are PHYSICAL IO devices */ \ - static const struct device **kscan_gpio_output_devices_##n(const struct device *dev) { \ - struct kscan_gpio_data_##n *data = dev->data; \ - return data->cols; \ - } \ - \ - static const struct kscan_gpio_item_config *kscan_gpio_output_configs_##n( \ - const struct device *dev) { \ + static const struct gpio_dt_spec *kscan_gpio_output_specs_##n(const struct device *dev) { \ const struct kscan_gpio_config_##n *cfg = dev->config; \ - /* If row2col, rows = outputs & cols = inputs */ \ return cfg->cols; \ } \ /* POLLING SETUP */ \ @@ -106,21 +74,16 @@ struct kscan_gpio_item_config { /* Iterate over bits and set GPIOs accordingly */ \ for (uint8_t bit = 0; bit < INST_DEMUX_GPIOS(n); bit++) { \ uint8_t state = (o & (0b1 << bit)) >> bit; \ - const struct device *out_dev = kscan_gpio_output_devices_##n(dev)[bit]; \ - const struct kscan_gpio_item_config *out_cfg = \ - &kscan_gpio_output_configs_##n(dev)[bit]; \ - gpio_pin_set(out_dev, out_cfg->pin, state); \ + const struct gpio_dt_spec *out_spec = &kscan_gpio_output_specs_##n(dev)[bit]; \ + gpio_pin_set_dt(out_spec, state); \ } \ /* Let the col settle before reading the rows */ \ k_usleep(1); \ \ for (int i = 0; i < INST_MATRIX_INPUTS(n); i++) { \ - /* Get the input device (port) */ \ - const struct device *in_dev = kscan_gpio_input_devices_##n(dev)[i]; \ - /* Get the input device config (pin) */ \ - const struct kscan_gpio_item_config *in_cfg = \ - &kscan_gpio_input_configs_##n(dev)[i]; \ - read_state[i][o] = gpio_pin_get(in_dev, in_cfg->pin) > 0; \ + /* Get the input spec */ \ + const struct gpio_dt_spec *in_spec = &kscan_gpio_input_specs_##n(dev)[i]; \ + read_state[i][o] = gpio_pin_get_dt(in_spec) > 0; \ } \ } \ for (int r = 0; r < INST_MATRIX_INPUTS(n); r++) { \ @@ -146,8 +109,7 @@ struct kscan_gpio_item_config { kscan_gpio_read_##n(data->dev); \ } \ \ - static struct kscan_gpio_data_##n kscan_gpio_data_##n = { \ - .rows = {[INST_MATRIX_INPUTS(n) - 1] = NULL}, .cols = {[INST_DEMUX_GPIOS(n) - 1] = NULL}}; \ + static struct kscan_gpio_data_##n kscan_gpio_data_##n = {}; \ \ /* KSCAN API configure function */ \ static int kscan_gpio_configure_##n(const struct device *dev, kscan_callback_t callback) { \ @@ -185,20 +147,18 @@ struct kscan_gpio_item_config { struct kscan_gpio_data_##n *data = dev->data; \ int err; \ /* configure input devices*/ \ - const struct device **input_devices = kscan_gpio_input_devices_##n(dev); \ for (int i = 0; i < INST_MATRIX_INPUTS(n); i++) { \ - const struct kscan_gpio_item_config *in_cfg = &kscan_gpio_input_configs_##n(dev)[i]; \ - input_devices[i] = device_get_binding(in_cfg->label); \ - if (!input_devices[i]) { \ + const struct gpio_dt_spec *in_spec = &kscan_gpio_input_specs_##n(dev)[i]; \ + if (!device_is_ready(in_spec->port)) { \ LOG_ERR("Unable to find input GPIO device"); \ return -EINVAL; \ } \ - err = gpio_pin_configure(input_devices[i], in_cfg->pin, GPIO_INPUT | in_cfg->flags); \ + err = gpio_pin_configure_dt(in_spec, GPIO_INPUT); \ if (err) { \ - LOG_ERR("Unable to configure pin %d on %s for input", in_cfg->pin, in_cfg->label); \ + LOG_ERR("Unable to configure pin %d for input", in_spec->pin); \ return err; \ } else { \ - LOG_DBG("Configured pin %d on %s for input", in_cfg->pin, in_cfg->label); \ + LOG_DBG("Configured pin %d for input", in_spec->pin); \ } \ if (err) { \ LOG_ERR("Error adding the callback to the column device"); \ @@ -206,22 +166,18 @@ struct kscan_gpio_item_config { } \ } \ /* configure output devices*/ \ - const struct device **output_devices = kscan_gpio_output_devices_##n(dev); \ for (int o = 0; o < INST_DEMUX_GPIOS(n); o++) { \ - const struct kscan_gpio_item_config *out_cfg = &kscan_gpio_output_configs_##n(dev)[o]; \ - output_devices[o] = device_get_binding(out_cfg->label); \ - if (!output_devices[o]) { \ + const struct gpio_dt_spec *out_spec = &kscan_gpio_output_specs_##n(dev)[o]; \ + if (!device_is_ready(out_spec->port)) { \ LOG_ERR("Unable to find output GPIO device"); \ return -EINVAL; \ } \ - err = gpio_pin_configure(output_devices[o], out_cfg->pin, \ - GPIO_OUTPUT_ACTIVE | out_cfg->flags); \ + err = gpio_pin_configure_dt(out_spec, GPIO_OUTPUT_ACTIVE); \ if (err) { \ - LOG_ERR("Unable to configure pin %d on %s for output", out_cfg->pin, \ - out_cfg->label); \ + LOG_ERR("Unable to configure pin %d for output", out_spec->pin); \ return err; \ } else { \ - LOG_DBG("Configured pin %d on %s for output", out_cfg->pin, out_cfg->label); \ + LOG_DBG("Configured pin %d for output", out_spec->pin); \ } \ } \ data->dev = dev; \ @@ -240,8 +196,8 @@ struct kscan_gpio_item_config { }; \ \ static const struct kscan_gpio_config_##n kscan_gpio_config_##n = { \ - .rows = {LISTIFY(INST_MATRIX_INPUTS(n), _KSCAN_GPIO_INPUT_CFG_INIT, (, ), n)}, \ - .cols = {LISTIFY(INST_DEMUX_GPIOS(n), _KSCAN_GPIO_OUTPUT_CFG_INIT, (, ), n)}, \ + .rows = {DT_FOREACH_PROP_ELEM(DT_DRV_INST(n), input_gpios, _KSCAN_GPIO_CFG_INIT)}, \ + .cols = {DT_FOREACH_PROP_ELEM(DT_DRV_INST(n), output_gpios, _KSCAN_GPIO_CFG_INIT)}, \ }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index bc35d002..655af3db 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -8,9 +8,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include "battery_common.h" @@ -21,22 +21,15 @@ struct io_channel_config { uint8_t channel; }; -struct gpio_channel_config { - const char *label; - uint8_t pin; - uint8_t flags; -}; - struct bvd_config { struct io_channel_config io_channel; - struct gpio_channel_config power_gpios; + struct gpio_dt_spec power; uint32_t output_ohm; uint32_t full_ohm; }; struct bvd_data { const struct device *adc; - const struct device *gpio; struct adc_channel_cfg acc; struct adc_sequence as; struct battery_value value; @@ -56,19 +49,19 @@ static int bvd_sample_fetch(const struct device *dev, enum sensor_channel chan) int rc = 0; - // Enable power GPIO if present - if (drv_data->gpio) { - rc = gpio_pin_set(drv_data->gpio, drv_cfg->power_gpios.pin, 1); +#if DT_INST_NODE_HAS_PROP(0, power_gpios) + // Enable power before sampling + rc = gpio_pin_set_dt(&drv_cfg->power, 1); - if (rc != 0) { - LOG_DBG("Failed to enable ADC power GPIO: %d", rc); - return rc; - } - - // wait for any capacitance to charge up - k_sleep(K_MSEC(10)); + if (rc != 0) { + LOG_DBG("Failed to enable ADC power GPIO: %d", rc); + return rc; } + // wait for any capacitance to charge up + k_sleep(K_MSEC(10)); +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) + // Read ADC rc = adc_read(drv_data->adc, as); as->calibrate = false; @@ -90,15 +83,15 @@ static int bvd_sample_fetch(const struct device *dev, enum sensor_channel chan) LOG_DBG("Failed to read ADC: %d", rc); } +#if DT_INST_NODE_HAS_PROP(0, power_gpios) // Disable power GPIO if present - if (drv_data->gpio) { - int rc2 = gpio_pin_set(drv_data->gpio, drv_cfg->power_gpios.pin, 0); + int rc2 = gpio_pin_set_dt(&drv_cfg->power, 0); - if (rc2 != 0) { - LOG_DBG("Failed to disable ADC power GPIO: %d", rc2); - return rc2; - } + if (rc2 != 0) { + LOG_DBG("Failed to disable ADC power GPIO: %d", rc2); + return rc2; } +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) return rc; } @@ -125,20 +118,17 @@ static int bvd_init(const struct device *dev) { int rc = 0; - if (drv_cfg->power_gpios.label) { - drv_data->gpio = device_get_binding(drv_cfg->power_gpios.label); - if (drv_data->gpio == NULL) { - LOG_ERR("Failed to get GPIO %s", drv_cfg->power_gpios.label); - return -ENODEV; - } - rc = gpio_pin_configure(drv_data->gpio, drv_cfg->power_gpios.pin, - GPIO_OUTPUT_INACTIVE | drv_cfg->power_gpios.flags); - if (rc != 0) { - LOG_ERR("Failed to control feed %s.%u: %d", drv_cfg->power_gpios.label, - drv_cfg->power_gpios.pin, rc); - return rc; - } +#if DT_INST_NODE_HAS_PROP(0, power_gpios) + if (!device_is_ready(drv_cfg->power.port)) { + LOG_ERR("GPIO port for power control is not ready"); + return -ENODEV; } + rc = gpio_pin_configure_dt(&drv_cfg->power, GPIO_OUTPUT_INACTIVE); + if (rc != 0) { + LOG_ERR("Failed to control feed %u: %d", drv_cfg->power.pin, rc); + return rc; + } +#endif // DT_INST_NODE_HAS_PROP(0, power_gpios) drv_data->as = (struct adc_sequence){ .channels = BIT(0), @@ -175,12 +165,7 @@ static const struct bvd_config bvd_cfg = { DT_IO_CHANNELS_INPUT(DT_DRV_INST(0)), }, #if DT_INST_NODE_HAS_PROP(0, power_gpios) - .power_gpios = - { - DT_INST_GPIO_LABEL(0, power_gpios), - DT_INST_GPIO_PIN(0, power_gpios), - DT_INST_GPIO_FLAGS(0, power_gpios), - }, + .power = GPIO_DT_SPEC_INST_GET(0, power_gpios), #endif .output_ohm = DT_INST_PROP(0, output_ohms), .full_ohm = DT_INST_PROP(0, full_ohms), diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 5f26ebc3..7091f73e 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -19,11 +19,9 @@ LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); static int ec11_get_ab_state(const struct device *dev) { - struct ec11_data *drv_data = dev->data; const struct ec11_config *drv_cfg = dev->config; - return (gpio_pin_get(drv_data->a, drv_cfg->a_pin) << 1) | - gpio_pin_get(drv_data->b, drv_cfg->b_pin); + return (gpio_pin_get_dt(&drv_cfg->a) << 1) | gpio_pin_get_dt(&drv_cfg->b); } static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) { @@ -94,27 +92,25 @@ int ec11_init(const struct device *dev) { struct ec11_data *drv_data = dev->data; const struct ec11_config *drv_cfg = dev->config; - LOG_DBG("A: %s %d B: %s %d resolution %d", drv_cfg->a_label, drv_cfg->a_pin, drv_cfg->b_label, - drv_cfg->b_pin, drv_cfg->resolution); + LOG_DBG("A: %s %d B: %s %d resolution %d", drv_cfg->a.port->name, drv_cfg->a.pin, + drv_cfg->b.port->name, drv_cfg->b.pin, drv_cfg->resolution); - drv_data->a = device_get_binding(drv_cfg->a_label); - if (drv_data->a == NULL) { - LOG_ERR("Failed to get pointer to A GPIO device"); + if (!device_is_ready(drv_cfg->a.port)) { + LOG_ERR("A GPIO device is not ready"); return -EINVAL; } - drv_data->b = device_get_binding(drv_cfg->b_label); - if (drv_data->b == NULL) { - LOG_ERR("Failed to get pointer to B GPIO device"); + if (!device_is_ready(drv_cfg->b.port)) { + LOG_ERR("B GPIO device is not ready"); return -EINVAL; } - if (gpio_pin_configure(drv_data->a, drv_cfg->a_pin, drv_cfg->a_flags | GPIO_INPUT)) { + if (gpio_pin_configure_dt(&drv_cfg->a, GPIO_INPUT)) { LOG_DBG("Failed to configure A pin"); return -EIO; } - if (gpio_pin_configure(drv_data->b, drv_cfg->b_pin, drv_cfg->b_flags | GPIO_INPUT)) { + if (gpio_pin_configure_dt(&drv_cfg->b, GPIO_INPUT)) { LOG_DBG("Failed to configure B pin"); return -EIO; } @@ -134,12 +130,8 @@ int ec11_init(const struct device *dev) { #define EC11_INST(n) \ struct ec11_data ec11_data_##n; \ const struct ec11_config ec11_cfg_##n = { \ - .a_label = DT_INST_GPIO_LABEL(n, a_gpios), \ - .a_pin = DT_INST_GPIO_PIN(n, a_gpios), \ - .a_flags = DT_INST_GPIO_FLAGS(n, a_gpios), \ - .b_label = DT_INST_GPIO_LABEL(n, b_gpios), \ - .b_pin = DT_INST_GPIO_PIN(n, b_gpios), \ - .b_flags = DT_INST_GPIO_FLAGS(n, b_gpios), \ + .a = GPIO_DT_SPEC_INST_GET(n, a_gpios), \ + .b = GPIO_DT_SPEC_INST_GET(n, b_gpios), \ COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ }; \ DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \ diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 04750df5..82c21572 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -11,20 +11,13 @@ #include struct ec11_config { - const char *a_label; - const uint8_t a_pin; - const uint8_t a_flags; - - const char *b_label; - const uint8_t b_pin; - const uint8_t b_flags; + const struct gpio_dt_spec a; + const struct gpio_dt_spec b; const uint8_t resolution; }; struct ec11_data { - const struct device *a; - const struct device *b; uint8_t ab_state; int8_t pulses; int8_t ticks; diff --git a/app/drivers/sensor/ec11/ec11_trigger.c b/app/drivers/sensor/ec11/ec11_trigger.c index 804a21d9..f9384a66 100644 --- a/app/drivers/sensor/ec11/ec11_trigger.c +++ b/app/drivers/sensor/ec11/ec11_trigger.c @@ -20,18 +20,15 @@ extern struct ec11_data ec11_driver; LOG_MODULE_DECLARE(EC11, CONFIG_SENSOR_LOG_LEVEL); static inline void setup_int(const struct device *dev, bool enable) { - struct ec11_data *data = dev->data; const struct ec11_config *cfg = dev->config; LOG_DBG("enabled %s", (enable ? "true" : "false")); - if (gpio_pin_interrupt_configure(data->a, cfg->a_pin, - enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { + if (gpio_pin_interrupt_configure_dt(&cfg->a, enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { LOG_WRN("Unable to set A pin GPIO interrupt"); } - if (gpio_pin_interrupt_configure(data->b, cfg->b_pin, - enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { + if (gpio_pin_interrupt_configure_dt(&cfg->b, enable ? GPIO_INT_EDGE_BOTH : GPIO_INT_DISABLE)) { LOG_WRN("Unable to set A pin GPIO interrupt"); } } @@ -121,16 +118,16 @@ int ec11_init_interrupt(const struct device *dev) { drv_data->dev = dev; /* setup gpio interrupt */ - gpio_init_callback(&drv_data->a_gpio_cb, ec11_a_gpio_callback, BIT(drv_cfg->a_pin)); + gpio_init_callback(&drv_data->a_gpio_cb, ec11_a_gpio_callback, BIT(drv_cfg->a.pin)); - if (gpio_add_callback(drv_data->a, &drv_data->a_gpio_cb) < 0) { + if (gpio_add_callback(drv_cfg->a.port, &drv_data->a_gpio_cb) < 0) { LOG_DBG("Failed to set A callback!"); return -EIO; } - gpio_init_callback(&drv_data->b_gpio_cb, ec11_b_gpio_callback, BIT(drv_cfg->b_pin)); + gpio_init_callback(&drv_data->b_gpio_cb, ec11_b_gpio_callback, BIT(drv_cfg->b.pin)); - if (gpio_add_callback(drv_data->b, &drv_data->b_gpio_cb) < 0) { + if (gpio_add_callback(drv_cfg->b.port, &drv_data->b_gpio_cb) < 0) { LOG_DBG("Failed to set B callback!"); return -EIO; } diff --git a/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml b/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml deleted file mode 100644 index 75e19c49..00000000 --- a/app/drivers/zephyr/dts/bindings/gpio/microchip,mcp23017.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright (c) 2020 Geanix ApS -# -# SPDX-License-Identifier: Apache-2.0 -# - -description: > - This is a representation of the Microchip MCP23017 I2C Gpio Expander. - -compatible: "microchip,mcp23017" - -include: [gpio-controller.yaml, i2c-device.yaml] - -properties: - label: - required: true - - "#gpio-cells": - const: 2 - - ngpios: - type: int - required: true - const: 16 - description: Number of gpios supported - -gpio-cells: - - pin - - flags diff --git a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml index 43fa7511..605c969d 100644 --- a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml +++ b/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml @@ -12,9 +12,6 @@ compatible: "zmk,gpio-595" include: [gpio-controller.yaml, spi-device.yaml] properties: - label: - required: true - "#gpio-cells": const: 2 diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml index a8904360..28b7541b 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml @@ -4,8 +4,3 @@ description: Battery SoC monitoring using nRF VDDH compatible: "zmk,battery-nrf-vddh" - -properties: - label: - required: true - type: string diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml index c4c6f80c..d9e07b79 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml @@ -6,8 +6,3 @@ description: Battery SoC monitoring using voltage divider compatible: "zmk,battery-voltage-divider" include: voltage-divider.yaml - -properties: - label: - required: true - type: string diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index 1195b943..a47cd505 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -25,7 +25,7 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr #define ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) \ { \ - .behavior_dev = DT_LABEL(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(drv_inst, bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(drv_inst, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(drv_inst, bindings, idx, param2), (0), \ diff --git a/app/include/zmk/kscan.h b/app/include/zmk/kscan.h index 33526008..eebe41e7 100644 --- a/app/include/zmk/kscan.h +++ b/app/include/zmk/kscan.h @@ -6,4 +6,6 @@ #pragma once -int zmk_kscan_init(char *name); +#include + +int zmk_kscan_init(const struct device *dev); diff --git a/app/src/activity.c b/app/src/activity.c index 41fe2e15..46af56fb 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/behavior_queue.c b/app/src/behavior_queue.c index 971816f2..1511e755 100644 --- a/app/src/behavior_queue.c +++ b/app/src/behavior_queue.c @@ -28,8 +28,8 @@ static void behavior_queue_process_next(struct k_work *work) { struct q_item item = {.wait = 0}; while (k_msgq_get(&zmk_behavior_queue_msgq, &item, K_NO_WAIT) == 0) { - LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, - item.binding.param1, item.binding.param2); + LOG_DBG("Invoking %s: 0x%02x 0x%02x", item.binding.behavior_dev, item.binding.param1, + item.binding.param2); struct zmk_behavior_binding_event event = {.position = item.position, .timestamp = k_uptime_get()}; diff --git a/app/src/behaviors/behavior_bt.c b/app/src/behaviors/behavior_bt.c index 71cf2322..6d44b5f5 100644 --- a/app/src/behaviors/behavior_bt.c +++ b/app/src/behaviors/behavior_bt.c @@ -16,7 +16,6 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include - #include #if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) diff --git a/app/src/behaviors/behavior_caps_word.c b/app/src/behaviors/behavior_caps_word.c index 8ee5bb5c..4c9fd711 100644 --- a/app/src/behaviors/behavior_caps_word.c +++ b/app/src/behaviors/behavior_caps_word.c @@ -166,9 +166,10 @@ static int behavior_caps_word_init(const struct device *dev) { #define CAPS_WORD_LABEL(i, _n) DT_INST_LABEL(i) #define PARSE_BREAK(i) \ - {.page = ZMK_HID_USAGE_PAGE(i), \ - .id = ZMK_HID_USAGE_ID(i), \ - .implicit_modifiers = SELECT_MODS(i)} + { \ + .page = ZMK_HID_USAGE_PAGE(i), .id = ZMK_HID_USAGE_ID(i), \ + .implicit_modifiers = SELECT_MODS(i) \ + } #define BREAK_ITEM(i, n) PARSE_BREAK(DT_INST_PROP_BY_IDX(n, continue_list, i)) @@ -177,7 +178,7 @@ static int behavior_caps_word_init(const struct device *dev) { static struct behavior_caps_word_config behavior_caps_word_config_##n = { \ .index = n, \ .mods = DT_INST_PROP_OR(n, mods, MOD_LSFT), \ - .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (,), n)}, \ + .continuations = {LISTIFY(DT_INST_PROP_LEN(n, continue_list), BREAK_ITEM, (, ), n)}, \ .continuations_count = DT_INST_PROP_LEN(n, continue_list), \ }; \ DEVICE_DT_INST_DEFINE(n, behavior_caps_word_init, NULL, &behavior_caps_word_data_##n, \ diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 6ea2fe97..30350ef2 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -700,8 +700,8 @@ static int behavior_hold_tap_init(const struct device *dev) { #define KP_INST(n) \ static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ - .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index c86d732a..e84f1fc8 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -44,13 +44,13 @@ struct behavior_macro_config { struct zmk_behavior_binding bindings[]; }; -#define TAP_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_tap)) -#define PRESS_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_press)) -#define REL_MODE DT_LABEL(DT_INST(0, zmk_macro_control_mode_release)) +#define TAP_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_tap), label) +#define PRESS_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_press), label) +#define REL_MODE DT_PROP(DT_INST(0, zmk_macro_control_mode_release), label) -#define TAP_TIME DT_LABEL(DT_INST(0, zmk_macro_control_tap_time)) -#define WAIT_TIME DT_LABEL(DT_INST(0, zmk_macro_control_wait_time)) -#define WAIT_REL DT_LABEL(DT_INST(0, zmk_macro_pause_for_release)) +#define TAP_TIME DT_PROP(DT_INST(0, zmk_macro_control_tap_time), label) +#define WAIT_TIME DT_PROP(DT_INST(0, zmk_macro_control_wait_time), label) +#define WAIT_REL DT_PROP(DT_INST(0, zmk_macro_pause_for_release), label) #define ZM_IS_NODE_MATCH(a, b) (strcmp(a, b) == 0) #define IS_TAP_MODE(dev) ZM_IS_NODE_MATCH(dev, TAP_MODE) @@ -169,7 +169,7 @@ static const struct behavior_driver_api behavior_macro_driver_api = { #define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) #define TRANSFORMED_BEHAVIORS(n) \ - {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (,), n)}, + {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (, ), n)}, #define MACRO_INST(n) \ static struct behavior_macro_state behavior_macro_state_##n = {}; \ diff --git a/app/src/behaviors/behavior_mod_morph.c b/app/src/behaviors/behavior_mod_morph.c index e5ba346e..d540abd9 100644 --- a/app/src/behaviors/behavior_mod_morph.c +++ b/app/src/behaviors/behavior_mod_morph.c @@ -81,7 +81,7 @@ static int behavior_mod_morph_init(const struct device *dev) { return 0; } #define _TRANSFORM_ENTRY(idx, node) \ { \ - .behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(node, bindings, idx)), \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ diff --git a/app/src/behaviors/behavior_tap_dance.c b/app/src/behaviors/behavior_tap_dance.c index ddb4aeab..fc685124 100644 --- a/app/src/behaviors/behavior_tap_dance.c +++ b/app/src/behaviors/behavior_tap_dance.c @@ -240,7 +240,7 @@ static int behavior_tap_dance_init(const struct device *dev) { #define _TRANSFORM_ENTRY(idx, node) ZMK_KEYMAP_EXTRACT_BINDING(idx, node) #define TRANSFORMED_BINDINGS(node) \ - { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (,), DT_DRV_INST(node)) } + { LISTIFY(DT_INST_PROP_LEN(node, bindings), _TRANSFORM_ENTRY, (, ), DT_DRV_INST(node)) } #define KP_INST(n) \ static struct zmk_behavior_binding \ diff --git a/app/src/display/main.c b/app/src/display/main.c index 52fa3c69..e34f8a53 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -12,7 +12,7 @@ #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#include +#include #include #include "theme.h" @@ -21,9 +21,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#define ZMK_DISPLAY_NAME CONFIG_LV_Z_DISPLAY_DEV_NAME - -static const struct device *display; +static const struct device *display = DEVICE_DT_GET(DT_CHOSEN(zephyr_display)); static bool initialized = false; static lv_obj_t *screen; @@ -103,8 +101,7 @@ static void initialize_theme() { void initialize_display(struct k_work *work) { LOG_DBG(""); - display = device_get_binding(ZMK_DISPLAY_NAME); - if (display == NULL) { + if (!device_is_ready(display)) { LOG_ERR("Failed to find display device"); return; } @@ -165,4 +162,4 @@ int display_event_handler(const zmk_event_t *eh) { ZMK_LISTENER(display, display_event_handler); ZMK_SUBSCRIPTION(display, zmk_activity_state_changed); -#endif /* IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) */ \ No newline at end of file +#endif /* IS_ENABLED(CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE) */ diff --git a/app/src/ext_power_generic.c b/app/src/ext_power_generic.c index 654f683f..e35714da 100644 --- a/app/src/ext_power_generic.c +++ b/app/src/ext_power_generic.c @@ -22,14 +22,11 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); struct ext_power_generic_config { - const char *label; - const uint8_t pin; - const uint8_t flags; + const struct gpio_dt_spec control; const uint16_t init_delay_ms; }; struct ext_power_generic_data { - const struct device *gpio; bool status; #if IS_ENABLED(CONFIG_SETTINGS) bool settings_init; @@ -39,10 +36,10 @@ struct ext_power_generic_data { #if IS_ENABLED(CONFIG_SETTINGS) static void ext_power_save_state_work(struct k_work *work) { char setting_path[40]; - const struct device *ext_power = device_get_binding(DT_INST_LABEL(0)); + const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; - snprintf(setting_path, 40, "ext_power/state/%s", DT_INST_LABEL(0)); + snprintf(setting_path, 40, "ext_power/state/%s", DT_INST_PROP(0, label)); settings_save_one(setting_path, &data->status, sizeof(data->status)); } @@ -62,7 +59,7 @@ static int ext_power_generic_enable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - if (gpio_pin_set(data->gpio, config->pin, 1)) { + if (gpio_pin_set_dt(&config->control, 1)) { LOG_WRN("Failed to set ext-power control pin"); return -EIO; } @@ -74,7 +71,8 @@ static int ext_power_generic_disable(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - if (gpio_pin_set(data->gpio, config->pin, 0)) { + if (gpio_pin_set_dt(&config->control, 0)) { + LOG_WRN("Failed to set ext-power control pin"); LOG_WRN("Failed to clear ext-power control pin"); return -EIO; } @@ -93,7 +91,7 @@ static int ext_power_settings_set(const char *name, size_t len, settings_read_cb const char *next; int rc; - if (settings_name_steq(name, DT_INST_LABEL(0), &next) && !next) { + if (settings_name_steq(name, DT_INST_PROP(0, label), &next) && !next) { const struct device *ext_power = DEVICE_DT_GET(DT_DRV_INST(0)); struct ext_power_generic_data *data = ext_power->data; @@ -106,7 +104,7 @@ static int ext_power_settings_set(const char *name, size_t len, settings_read_cb data->settings_init = true; if (ext_power == NULL) { - LOG_ERR("Unable to retrieve ext_power device: %s", DT_INST_LABEL(0)); + LOG_ERR("Unable to retrieve ext_power device: %s", DT_INST_PROP(0, label)); return -EIO; } @@ -131,13 +129,7 @@ static int ext_power_generic_init(const struct device *dev) { struct ext_power_generic_data *data = dev->data; const struct ext_power_generic_config *config = dev->config; - data->gpio = device_get_binding(config->label); - if (data->gpio == NULL) { - LOG_ERR("Failed to get ext-power control device"); - return -EINVAL; - } - - if (gpio_pin_configure(data->gpio, config->pin, config->flags | GPIO_OUTPUT)) { + if (gpio_pin_configure_dt(&config->control, GPIO_OUTPUT_INACTIVE)) { LOG_ERR("Failed to configure ext-power control pin"); return -EIO; } @@ -190,9 +182,7 @@ static int ext_power_generic_pm_action(const struct device *dev, enum pm_device_ #endif /* CONFIG_PM_DEVICE */ static const struct ext_power_generic_config config = { - .label = DT_INST_GPIO_LABEL(0, control_gpios), - .pin = DT_INST_GPIO_PIN(0, control_gpios), - .flags = DT_INST_GPIO_FLAGS(0, control_gpios), + .control = GPIO_DT_SPEC_INST_GET(0, control_gpios), .init_delay_ms = DT_INST_PROP_OR(0, init_delay_ms, 0)}; static struct ext_power_generic_data data = { diff --git a/app/src/keymap.c b/app/src/keymap.c index 99483592..c4e304d4 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -42,7 +42,7 @@ static uint8_t _zmk_keymap_layer_default = 0; #if ZMK_KEYMAP_HAS_SENSORS #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ { \ - .behavior_dev = DT_LABEL(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx)), \ + .behavior_dev = DT_PROP(DT_PHANDLE_BY_IDX(layer, sensor_bindings, idx), label), \ .param1 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param1), (0), \ (DT_PHA_BY_IDX(layer, sensor_bindings, idx, param1))), \ .param2 = COND_CODE_0(DT_PHA_HAS_CELL_AT_IDX(layer, sensor_bindings, idx, param2), (0), \ @@ -57,7 +57,8 @@ static uint8_t _zmk_keymap_layer_default = 0; #endif /* ZMK_KEYMAP_HAS_SENSORS */ -#define LAYER_LABEL(node) COND_CODE_0(DT_NODE_HAS_PROP(node, label), (NULL), (DT_LABEL(node))), +#define LAYER_LABEL(node) \ + COND_CODE_0(DT_NODE_HAS_PROP(node, label), (NULL), (DT_PROP(node, label))), // State diff --git a/app/src/kscan.c b/app/src/kscan.c index f9db8b1c..b0713320 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -58,8 +58,7 @@ void zmk_kscan_process_msgq(struct k_work *item) { } } -int zmk_kscan_init(char *name) { - const struct device *dev = device_get_binding(name); +int zmk_kscan_init(const struct device *dev) { if (dev == NULL) { LOG_ERR("Failed to get the KSCAN device"); return -EINVAL; diff --git a/app/src/main.c b/app/src/main.c index 8ea67057..3fd6b116 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -17,12 +17,10 @@ LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -#define ZMK_KSCAN_DEV DT_LABEL(ZMK_MATRIX_NODE_ID) - void main(void) { LOG_INF("Welcome to ZMK!\n"); - if (zmk_kscan_init(ZMK_KSCAN_DEV) != 0) { + if (zmk_kscan_init(DEVICE_DT_GET(ZMK_MATRIX_NODE_ID)) != 0) { return; } diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 47c3658e..0ed2087a 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -27,8 +27,14 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#define STRIP_LABEL DT_LABEL(DT_CHOSEN(zmk_underglow)) -#define STRIP_NUM_PIXELS DT_PROP(DT_CHOSEN(zmk_underglow), chain_length) +#if !DT_CHOSEN(zmk_underglow) + +#error "A zmk,underglow chosen node must be declared" + +#endif + +#define STRIP_CHOSEN DT_CHOSEN(zmk_underglow) +#define STRIP_NUM_PIXELS DT_PROP(STRIP_CHOSEN, chain_length) #define HUE_MAX 360 #define SAT_MAX 100 @@ -230,13 +236,7 @@ static struct k_work_delayable underglow_save_work; #endif static int zmk_rgb_underglow_init(const struct device *_arg) { - led_strip = device_get_binding(STRIP_LABEL); - if (led_strip) { - LOG_INF("Found LED strip device %s", STRIP_LABEL); - } else { - LOG_ERR("LED strip device %s not found", STRIP_LABEL); - return -EINVAL; - } + led_strip = DEVICE_DT_GET(STRIP_CHOSEN); #if IS_ENABLED(CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER) ext_power = device_get_binding("EXT_POWER"); diff --git a/app/src/sensors.c b/app/src/sensors.c index 9873de4f..efae2bd9 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -65,7 +65,8 @@ static void zmk_sensors_init_item(const char *node, uint8_t i, uint8_t abs_i) { sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); } -#define _SENSOR_INIT(node) zmk_sensors_init_item(DT_LABEL(node), local_index++, absolute_index++); +#define _SENSOR_INIT(node) \ + zmk_sensors_init_item(DT_PROP(node, label), local_index++, absolute_index++); #define SENSOR_INIT(idx, _i) \ COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ (_SENSOR_INIT(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), (absolute_index++;)) diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 5b952dfc..ac073c59 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -377,8 +377,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { bt_uuid_to_str(&uuid.uuid, uuid_str, sizeof(uuid_str)); bt_uuid_to_str(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID), service_uuid_str, sizeof(service_uuid_str)); - LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, - service_uuid_str); + LOG_DBG("UUID %s does not match split UUID: %s", uuid_str, service_uuid_str); continue; } @@ -433,8 +432,7 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui char dev[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, dev, sizeof(dev)); - LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, - rssi); + LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); /* We're only interested in connectable events */ if (type == BT_GAP_ADV_TYPE_ADV_IND || type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index fa4b7718..f7b0d587 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -60,8 +60,8 @@ static ssize_t split_svc_run_behavior(struct bt_conn *conn, const struct bt_gatt .param2 = payload->data.param2, .behavior_dev = payload->behavior_dev, }; - LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, - binding.param1, binding.param2, payload->data.state); + LOG_DBG("%s with params %d %d: pressed? %d", binding.behavior_dev, binding.param1, + binding.param2, payload->data.state); struct zmk_behavior_binding_event event = {.position = payload->data.position, .timestamp = k_uptime_get()}; int err; diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index e65bb296..6d026f2b 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -258,8 +258,8 @@ An example of this can be seen below, taking the `#define KP_INST(n)` from the h #define KP_INST(n) \ static struct behavior_hold_tap_config behavior_hold_tap_config_##n = { \ .tapping_term_ms = DT_INST_PROP(n, tapping_term_ms), \ - .hold_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 0)), \ - .tap_behavior_dev = DT_LABEL(DT_INST_PHANDLE_BY_IDX(n, bindings, 1)), \ + .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ + .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ From 4ff1a4d3ea98390325e6330802e56381f9e910d5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Oct 2022 01:52:25 -0400 Subject: [PATCH 300/494] refactor: Move to updated Docker images. --- .devcontainer/Dockerfile | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/hardware-metadata-validation.yml | 2 +- .github/workflows/test.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 21a7fd5a..5b69e180 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/zmkfirmware/zmk-dev-arm:3.0 +FROM docker.io/zmkfirmware/zmk-dev-arm:3.2 COPY .bashrc tmp RUN mv /tmp/.bashrc ~/.bashrc diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6305b741..f472f755 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: if: ${{ always() }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.0 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 needs: compile-matrix strategy: matrix: diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index c6566feb..4b10a28b 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -29,7 +29,7 @@ jobs: validate-metadata: runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-dev-arm:3.0 + image: docker.io/zmkfirmware/zmk-dev-arm:3.2 steps: - uses: actions/checkout@v3 - name: Install dependencies diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 38c61eea..e8a9d220 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,7 +33,7 @@ jobs: test: ${{ fromJSON(needs.collect-tests.outputs.test-dirs) }} runs-on: ubuntu-latest container: - image: docker.io/zmkfirmware/zmk-build-arm:3.0 + image: docker.io/zmkfirmware/zmk-build-arm:3.2 steps: - name: Checkout uses: actions/checkout@v3 From 31f664ffec0e90fe2123e1dfcaca4b34654d4714 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 23 Dec 2021 23:45:29 -0500 Subject: [PATCH 301/494] fix(boards): Base config/overlay for rp2040 boards Baseline config and overlay for the following: * `rpi_pico` * `adafruit_kb2040` * `sparkfun_pro_micro_rp2040` * `adafruit_qt_py_rp2040` * `seeeduino_xiao_rp2040` * `boardsource_blok` * `01space_rp2040_042lcd` Co-authored-by: Joel Spadin --- app/boards/01space_rp2040_042lcd.conf | 6 ++++++ app/boards/01space_rp2040_042lcd.overlay | 9 +++++++++ app/boards/adafruit_kb2040.conf | 4 ++++ app/boards/adafruit_kb2040.overlay | 9 +++++++++ app/boards/adafruit_qt_py_rp2040.conf | 4 ++++ app/boards/adafruit_qt_py_rp2040.overlay | 9 +++++++++ .../adafruit_kb2040/adafruit_kb2040.zmk.yml | 9 +++++++++ .../adafruit_qt_py_rp2040.zmk.yml | 9 +++++++++ .../boardsource_blok/boardsource_blok.zmk.yml | 9 +++++++++ .../seeeduino_xiao_rp2040.zmk.yml | 9 +++++++++ .../sparkfun_pro_micro_rp2040.zmk.yml | 9 +++++++++ app/boards/boardsource_blok.conf | 4 ++++ app/boards/boardsource_blok.overlay | 9 +++++++++ app/boards/rpi_pico.conf | 5 +++++ app/boards/rpi_pico.overlay | 8 ++++++++ app/boards/seeeduino_xiao_rp2040.conf | 4 ++++ app/boards/seeeduino_xiao_rp2040.overlay | 9 +++++++++ app/boards/sparkfun_pro_micro_rp2040.conf | 4 ++++ app/boards/sparkfun_pro_micro_rp2040.overlay | 9 +++++++++ app/boards/usb_console.dtsi | 20 +++++++++++++++++++ 20 files changed, 158 insertions(+) create mode 100644 app/boards/01space_rp2040_042lcd.conf create mode 100644 app/boards/01space_rp2040_042lcd.overlay create mode 100644 app/boards/adafruit_kb2040.conf create mode 100644 app/boards/adafruit_kb2040.overlay create mode 100644 app/boards/adafruit_qt_py_rp2040.conf create mode 100644 app/boards/adafruit_qt_py_rp2040.overlay create mode 100644 app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml create mode 100644 app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml create mode 100644 app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml create mode 100644 app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml create mode 100644 app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml create mode 100644 app/boards/boardsource_blok.conf create mode 100644 app/boards/boardsource_blok.overlay create mode 100644 app/boards/rpi_pico.conf create mode 100644 app/boards/rpi_pico.overlay create mode 100644 app/boards/seeeduino_xiao_rp2040.conf create mode 100644 app/boards/seeeduino_xiao_rp2040.overlay create mode 100644 app/boards/sparkfun_pro_micro_rp2040.conf create mode 100644 app/boards/sparkfun_pro_micro_rp2040.overlay create mode 100644 app/boards/usb_console.dtsi diff --git a/app/boards/01space_rp2040_042lcd.conf b/app/boards/01space_rp2040_042lcd.conf new file mode 100644 index 00000000..c520a3b7 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.conf @@ -0,0 +1,6 @@ +CONFIG_ZMK_DISPLAY=y +CONFIG_LV_FONT_UNSCII_8=n +CONFIG_ZMK_USB=y +CONFIG_I2C=y +CONFIG_I2C_DW=y +CONFIG_LV_Z_VDB_SIZE=50 diff --git a/app/boards/01space_rp2040_042lcd.overlay b/app/boards/01space_rp2040_042lcd.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/01space_rp2040_042lcd.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_kb2040.conf b/app/boards/adafruit_kb2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_kb2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/adafruit_kb2040.overlay b/app/boards/adafruit_kb2040.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/adafruit_kb2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/adafruit_qt_py_rp2040.conf b/app/boards/adafruit_qt_py_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/adafruit_qt_py_rp2040.overlay b/app/boards/adafruit_qt_py_rp2040.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/adafruit_qt_py_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml new file mode 100644 index 00000000..c8973f5c --- /dev/null +++ b/app/boards/arm/adafruit_kb2040/adafruit_kb2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: adafruit_kb2040 +name: Adafruit KB2040 +type: board +arch: arm +outputs: + - usb +url: https://www.adafruit.com/product/5302 +exposes: [pro_micro] diff --git a/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml new file mode 100644 index 00000000..9b9c1450 --- /dev/null +++ b/app/boards/arm/adafruit_qt_py_rp2040/adafruit_qt_py_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: adafruit_qt_py_rp2040 +name: Adafruit QT Py RP2040 +type: board +arch: arm +outputs: + - usb +url: https://www.adafruit.com/product/4900 +exposes: [seeed_xiao] diff --git a/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml new file mode 100644 index 00000000..a6e91afd --- /dev/null +++ b/app/boards/arm/boardsource_blok/boardsource_blok.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: boardsource_blok +name: BoardSource blok +type: board +arch: arm +outputs: + - usb +url: https://peg.software/docs/blok +exposes: [pro_micro] diff --git a/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml new file mode 100644 index 00000000..77d8d664 --- /dev/null +++ b/app/boards/arm/seeeduino_xiao_rp2040/seeeduino_xiao_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: seeeduino_xiao_rp2040 +name: Seeeduino XIAO RP2040 +type: board +arch: arm +outputs: + - usb +url: https://wiki.seeedstudio.com/XIAO-RP2040/ +exposes: [seeed_xiao] diff --git a/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml new file mode 100644 index 00000000..26a2ca64 --- /dev/null +++ b/app/boards/arm/sparkfun_pro_micro_rp2040/sparkfun_pro_micro_rp2040.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: sparkfun_pro_micro_rp2040 +name: SparkFun Pro Micro RP2040 +type: board +arch: arm +outputs: + - usb +url: https://www.sparkfun.com/products/18288 +exposes: [pro_micro] diff --git a/app/boards/boardsource_blok.conf b/app/boards/boardsource_blok.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/boardsource_blok.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/boardsource_blok.overlay b/app/boards/boardsource_blok.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/boardsource_blok.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/rpi_pico.conf b/app/boards/rpi_pico.conf new file mode 100644 index 00000000..f0db8ed1 --- /dev/null +++ b/app/boards/rpi_pico.conf @@ -0,0 +1,5 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_UART_INTERRUPT_DRIVEN=n +CONFIG_ZMK_USB=y diff --git a/app/boards/rpi_pico.overlay b/app/boards/rpi_pico.overlay new file mode 100644 index 00000000..efc8e080 --- /dev/null +++ b/app/boards/rpi_pico.overlay @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + diff --git a/app/boards/seeeduino_xiao_rp2040.conf b/app/boards/seeeduino_xiao_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/seeeduino_xiao_rp2040.overlay b/app/boards/seeeduino_xiao_rp2040.overlay new file mode 100644 index 00000000..d89e53f4 --- /dev/null +++ b/app/boards/seeeduino_xiao_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&xiao_serial { status = "disabled"; }; diff --git a/app/boards/sparkfun_pro_micro_rp2040.conf b/app/boards/sparkfun_pro_micro_rp2040.conf new file mode 100644 index 00000000..21c1893d --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=n +CONFIG_SERIAL=n +CONFIG_UART_CONSOLE=n +CONFIG_ZMK_USB=y diff --git a/app/boards/sparkfun_pro_micro_rp2040.overlay b/app/boards/sparkfun_pro_micro_rp2040.overlay new file mode 100644 index 00000000..b14e0d04 --- /dev/null +++ b/app/boards/sparkfun_pro_micro_rp2040.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "usb_console.dtsi" + +&pro_micro_serial { status = "disabled"; }; diff --git a/app/boards/usb_console.dtsi b/app/boards/usb_console.dtsi new file mode 100644 index 00000000..4ce59408 --- /dev/null +++ b/app/boards/usb_console.dtsi @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +/ { + chosen { + zephyr,console = &cdc_acm_uart; + }; +}; + +&usbd { + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + From 2f9bc2f1f7b2ad0e0662ef53f5479b72c0f84d02 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 13 Jul 2022 23:34:32 -0400 Subject: [PATCH 302/494] fix(logging): Disable USB driver logging. When enabling our high level USB logging, disable the USB driver logging itself entirely, to avoid logging in the driver causing errors when USB isn't up yet to send the logs. --- app/Kconfig | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index cf2cc6b3..01817107 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -419,9 +419,16 @@ if ZMK_USB_LOGGING config ZMK_LOG_LEVEL default 4 +choice USB_CDC_ACM_LOG_LEVEL_CHOICE + default USB_CDC_ACM_LOG_LEVEL_OFF +endchoice + +choice USB_DRIVER_LOG_LEVEL_CHOICE + default USB_DRIVER_LOG_LEVEL_OFF + +endchoice + # We do this to avoid log loop where logging to USB generates more log messages. -config USB_CDC_ACM_LOG_LEVEL - default 1 config USB_CDC_ACM_RINGBUF_SIZE default 1024 From a6ebdb7180f5b49d0603de91ca899ea789af0365 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 15 Jul 2022 11:14:51 -0400 Subject: [PATCH 303/494] fix(kscan): Default wait between outputs on RP2040. --- app/drivers/kscan/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index 51546006..216651a1 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -44,6 +44,7 @@ config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" + default 1 if SOC_RP2040 default 0 help When iterating over each output to drive it active, read inputs, then set From c3d06b22c8b501fc69f6c2c140c10c95f989c76b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 3 Aug 2022 20:24:45 -0400 Subject: [PATCH 304/494] fix(core): Bump system work queue stack on RP2040. --- app/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Kconfig b/app/Kconfig index 01817107..824d2700 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -121,6 +121,7 @@ menuconfig ZMK_BLE if ZMK_BLE config SYSTEM_WORKQUEUE_STACK_SIZE + default 4096 if SOC_RP2040 default 2048 config ZMK_BLE_THREAD_STACK_SIZE From 198daaf524a2c1223393922195d8f1004964ae2e Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Oct 2022 02:21:25 -0400 Subject: [PATCH 305/494] fix(shields): Don't try to disable xiao_i2c on Hummingbird. --- app/boards/shields/hummingbird/hummingbird.overlay | 1 - 1 file changed, 1 deletion(-) diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 327200a8..4af9cbdf 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -53,5 +53,4 @@ }; &xiao_spi { status = "disabled"; }; -&xiao_i2c { status = "disabled"; }; &xiao_serial { status = "disabled"; }; From 518f9a550f5016dad4e8d96ed68f1c4e6a8ccb93 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Oct 2022 17:23:43 +0000 Subject: [PATCH 306/494] fix(underglow): Use `DT_HAS_CHOSEN` properly. --- app/src/rgb_underglow.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 0ed2087a..048b58b4 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -27,7 +27,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if !DT_CHOSEN(zmk_underglow) +#if !DT_HAS_CHOSEN(zmk_underglow) #error "A zmk,underglow chosen node must be declared" From 1493620bf76e05d8419ceec37681b69ca024a871 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 5 Nov 2022 00:35:58 -0400 Subject: [PATCH 307/494] refactor(boards): Move to pinctrl. --- .../bluemicro840/bluemicro840_v1-pinctrl.dtsi | 39 ++++++++++ .../arm/bluemicro840/bluemicro840_v1.dts | 13 ++-- .../bluemicro840/bluemicro840_v1_defconfig | 4 +- .../arm/corneish_zen/corneish_zen_v2_left.dts | 27 ++++++- .../corneish_zen_v2_left_defconfig | 3 + .../corneish_zen/corneish_zen_v2_right.dts | 25 +++++- .../corneish_zen_v2_right_defconfig | 3 + app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/mikoto/mikoto_520.dts | 12 ++- app/boards/arm/mikoto/mikoto_520_defconfig | 2 + app/boards/arm/nice60/nice60-pinctrl.dtsi | 12 +++ app/boards/arm/nice60/nice60.dts | 7 +- app/boards/arm/nice60/nice60_defconfig | 2 + .../arm/nice_nano/nice_nano-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nice_nano/nice_nano.dtsi | 12 ++- app/boards/arm/nice_nano/nice_nano_defconfig | 5 +- .../arm/nice_nano/nice_nano_v2_defconfig | 5 +- .../nrfmicro/nrfmicro-flipped-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/nrfmicro/nrfmicro_11.dts | 13 ++-- app/boards/arm/nrfmicro/nrfmicro_11_defconfig | 2 + .../arm/nrfmicro/nrfmicro_11_flipped.dts | 15 ++-- .../nrfmicro/nrfmicro_11_flipped_defconfig | 2 + app/boards/arm/nrfmicro/nrfmicro_13.dts | 13 ++-- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 13 ++-- .../arm/nrfmicro/nrfmicro_13_52833_defconfig | 2 + app/boards/arm/nrfmicro/nrfmicro_13_defconfig | 2 + app/boards/arm/pillbug/pillbug-pinctrl.dtsi | 56 +++++++++++++ app/boards/arm/pillbug/pillbug.dts | 20 +++-- .../arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi | 39 ++++++++++ app/boards/arm/puchi_ble/puchi_ble_v1.dts | 11 ++- .../arm/puchi_ble/puchi_ble_v1_defconfig | 3 + .../shields/chalice/boards/nice_nano.overlay | 25 ++++-- .../chalice/boards/nice_nano_v2.overlay | 25 ++++-- .../shields/corne/boards/nice_nano.overlay | 28 +++++-- .../shields/corne/boards/nice_nano_v2.overlay | 47 +++++++++++ .../elephant42/boards/nice_nano.overlay | 47 +++++++++++ .../elephant42/boards/nice_nano_v2.overlay | 29 +++++-- .../eternal_keypad/boards/nice_nano.overlay | 47 +++++++++++ .../boards/nice_nano_v2.overlay | 35 +++++---- .../shields/helix/boards/nice_nano.overlay | 65 +++++++++------- .../shields/helix/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/jorne/boards/nice_nano.overlay | 27 +++++-- .../shields/jorne/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/kyria/boards/nice_nano.overlay | 24 +++++- .../shields/kyria/boards/nice_nano_v2.overlay | 23 +++++- .../shields/kyria/boards/nrfmicro_11.overlay | 25 ++++-- .../kyria/boards/nrfmicro_11_flipped.overlay | 24 +++++- .../shields/kyria/boards/nrfmicro_13.overlay | 24 +++++- .../shields/lily58/boards/nice_nano.overlay | 32 +++++--- .../lily58/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/microdox/boards/nice_nano.overlay | 35 +++++---- .../microdox/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/murphpad/boards/nice_nano.overlay | 33 +++++--- .../murphpad/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/nibble/boards/nice_nano.overlay | 32 +++++--- .../nibble/boards/nice_nano_v2.overlay | 47 +++++++++++ .../boards/bluemicro840_v1.overlay | 16 +++- .../boards/mikoto_520.overlay | 15 +++- .../boards/nice_nano.overlay | 15 +++- .../boards/nice_nano_v2.overlay | 15 +++- .../boards/nrfmicro_11.overlay | 16 +++- .../boards/nrfmicro_11_flipped.overlay | 15 +++- .../boards/nrfmicro_13.overlay | 15 +++- .../boards/puchi_ble_v1.overlay | 15 +++- .../shields/redox/boards/nice_nano.overlay | 31 +++++--- .../shields/redox/boards/nice_nano_v2.overlay | 47 +++++++++++ .../reviung41/boards/nice_nano.overlay | 26 +++++-- .../reviung41/boards/nice_nano_v2.overlay | 47 +++++++++++ .../romac_plus/boards/nice_nano.overlay | 78 +++++++++++-------- .../romac_plus/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/snap/boards/nice_nano.overlay | 32 +++++--- .../shields/snap/boards/nice_nano_v2.overlay | 32 +++++--- .../boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../boards/nice_nano.overlay | 24 +++++- .../boards/nice_nano_v2.overlay | 23 +++++- .../boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../shields/tg4x/boards/nice_nano.overlay | 32 +++++--- .../shields/tg4x/boards/nice_nano_v2.overlay | 47 +++++++++++ .../shields/tidbit/boards/nice_nano.overlay | 32 +++++--- .../tidbit/boards/nice_nano_v2.overlay | 47 +++++++++++ .../two_percent_milk/boards/nice_nano.overlay | 26 +++++-- .../boards/nice_nano_v2.overlay | 26 +++++-- .../boards/nrfmicro_11.overlay | 27 +++++-- .../boards/nrfmicro_11_flipped.overlay | 26 +++++-- .../boards/nrfmicro_13.overlay | 26 +++++-- docs/docs/features/underglow.md | 28 ++++--- 89 files changed, 1981 insertions(+), 376 deletions(-) create mode 100644 app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi create mode 100644 app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi create mode 100644 app/boards/arm/nice60/nice60-pinctrl.dtsi create mode 100644 app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi create mode 100644 app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi create mode 100644 app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi create mode 100644 app/boards/arm/pillbug/pillbug-pinctrl.dtsi create mode 100644 app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi create mode 100644 app/boards/shields/corne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/elephant42/boards/nice_nano.overlay create mode 100644 app/boards/shields/eternal_keypad/boards/nice_nano.overlay create mode 100644 app/boards/shields/helix/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/jorne/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/lily58/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/microdox/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/murphpad/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/nibble/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/redox/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/reviung41/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/romac_plus/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/tg4x/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/tidbit/boards/nice_nano_v2.overlay diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi new file mode 100644 index 00000000..18b90f21 --- /dev/null +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index 29bf0f8d..c636ca31 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "bluemicro840_v1-pinctrl.dtsi" / { model = "BlueMicro840_V1"; @@ -62,15 +63,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig index b8e4e805..99d51a94 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig +++ b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_BLUEMICRO840_V1=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y @@ -18,4 +20,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 2d8f0a81..4dbdaef5 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -53,12 +53,31 @@ }; +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + &spi0 { status = "okay"; compatible = "nordic,nrf-spim"; - sck-pin = <27>; - mosi-pin = <8>; - miso-pin = <22>; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; epd: il0323@0 { @@ -75,4 +94,4 @@ cdi = <0xd2>; tcon = <0x22>; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 42e27037..305ce72e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -13,6 +13,9 @@ CONFIG_ZMK_DISPLAY=y # Enable MPU CONFIG_ARM_MPU=y +# enable pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 097872f5..52439e4f 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -60,12 +60,31 @@ col-offset = <6>; }; +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; + &spi0 { status = "okay"; compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <24>; - miso-pin = <27>; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; epd: il0323@0 { diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index e9b36f2e..0fd0fd6c 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -13,6 +13,9 @@ CONFIG_ZMK_DISPLAY=y # Enable MPU CONFIG_ARM_MPU=y +# enable pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi new file mode 100644 index 00000000..4a8ff82c --- /dev/null +++ b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 49d9d6be..3fff0835 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "mikoto_520-pinctrl.dtsi" / { model = "mikoto"; @@ -62,14 +63,17 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <8>; - rx-pin = <4>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/mikoto/mikoto_520_defconfig b/app/boards/arm/mikoto/mikoto_520_defconfig index d5fd8958..c755633e 100644 --- a/app/boards/arm/mikoto/mikoto_520_defconfig +++ b/app/boards/arm/mikoto/mikoto_520_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_MIKOTO_520=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi new file mode 100644 index 00000000..aced76b4 --- /dev/null +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = ; + }; + }; +}; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index bb058da8..c982f88e 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -10,6 +10,8 @@ #include #include +#include "nice60-pinctrl.dtsi" + / { model = "nice!60"; compatible = "nice,60"; @@ -110,10 +112,9 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R &spi0 { compatible = "nordic,nrf-spim"; /* Cannot be used together with i2c0. */ + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; status = "okay"; - sck-pin = <12>; - mosi-pin = <27>; - miso-pin = <13>; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/arm/nice60/nice60_defconfig b/app/boards/arm/nice60/nice60_defconfig index 9fac3a30..48936a04 100644 --- a/app/boards/arm/nice60/nice60_defconfig +++ b/app/boards/arm/nice60/nice60_defconfig @@ -8,6 +8,8 @@ CONFIG_BOARD_NICE60=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi new file mode 100644 index 00000000..18b90f21 --- /dev/null +++ b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index 6c9d081c..ad5ef278 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -5,6 +5,7 @@ */ #include +#include "nice_nano-pinctrl.dtsi" #include "arduino_pro_micro_pins.dtsi" / { @@ -45,14 +46,17 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nice_nano/nice_nano_defconfig b/app/boards/arm/nice_nano/nice_nano_defconfig index 1ff025ec..a837b7d2 100644 --- a/app/boards/arm/nice_nano/nice_nano_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_defconfig @@ -10,6 +10,9 @@ CONFIG_ARM_MPU=y # enable GPIO CONFIG_GPIO=y +# Use pinctrl +CONFIG_PINCTRL=y + CONFIG_USE_DT_CODE_PARTITION=y CONFIG_BUILD_OUTPUT_UF2=y @@ -18,4 +21,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/nice_nano/nice_nano_v2_defconfig b/app/boards/arm/nice_nano/nice_nano_v2_defconfig index 206e51c2..667cf71a 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_v2_defconfig @@ -7,6 +7,9 @@ CONFIG_BOARD_NICE_NANO_V2=y # Enable MPU CONFIG_ARM_MPU=y +# Use pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y @@ -18,4 +21,4 @@ CONFIG_NVS=y CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y -CONFIG_FLASH_MAP=y \ No newline at end of file +CONFIG_FLASH_MAP=y diff --git a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi new file mode 100644 index 00000000..a54c2598 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi new file mode 100644 index 00000000..a5385690 --- /dev/null +++ b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 82951b5f..48186ac9 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -47,15 +48,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig index 3f6a447d..b51929b0 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_11=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index fdfba507..656873a0 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins_flipped.dtsi" +#include "nrfmicro-flipped-pinctrl.dtsi" / { model = "nrfmicro"; @@ -47,15 +48,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <30>; - scl-pin = <31>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { @@ -105,4 +108,4 @@ reg = <0x000f4000 0x0000c000>; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig index efe924f2..335a2d75 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_11_FLIPPED=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index a0f74170..9fb68562 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -60,15 +61,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 7f833ff5..9ade364d 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins_52833.dtsi" +#include "nrfmicro-pinctrl.dtsi" / { model = "nrfmicro"; @@ -60,15 +61,17 @@ }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig index 112e0344..4af1ff86 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_13_52833=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig index 06758784..43ba40e2 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig @@ -7,6 +7,8 @@ CONFIG_BOARD_NRFMICRO_13=y # Enable MPU CONFIG_ARM_MPU=y +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y diff --git a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi new file mode 100644 index 00000000..8751bc4b --- /dev/null +++ b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts index 85c5cccd..c1330319 100644 --- a/app/boards/arm/pillbug/pillbug.dts +++ b/app/boards/arm/pillbug/pillbug.dts @@ -7,6 +7,7 @@ /dts-v1/; #include +#include "pillbug-pinctrl.dtsi" #include "blackpill_pins.dtsi" / { @@ -63,22 +64,25 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <13>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; -&spi1{ +&spi1 { status = "disabled"; compatible = "nordic,nrf-spim"; - sck-pin = <40>; - mosi-pin = <11>; - miso-pin = <26>; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi new file mode 100644 index 00000000..a5385690 --- /dev/null +++ b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts index e324cccc..a8f25c37 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.dts +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -7,6 +7,7 @@ /dts-v1/; #include #include "arduino_pro_micro_pins.dtsi" +#include "puchi_ble_v1-pinctrl.dtsi" / { model = "puchi_ble"; @@ -61,14 +62,16 @@ &i2c0 { compatible = "nordic,nrf-twi"; - sda-pin = <15>; - scl-pin = <17>; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig index e32886d0..1adb9217 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig +++ b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig @@ -11,6 +11,9 @@ CONFIG_ARM_MPU=y # enable GPIO CONFIG_GPIO=y +# Use pinctrl +CONFIG_PINCTRL=y + CONFIG_USE_DT_CODE_PARTITION=y CONFIG_BUILD_OUTPUT_UF2=y diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index 5a74582a..172859ae 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <14>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index 5a74582a..172859ae 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <14>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index e5f84063..172859ae 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,24 +1,38 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index 87c8da21..172859ae 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,23 +1,38 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; label = "WS2812"; + /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <27>; /* There are per-key RGB and the LAST 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; @@ -29,4 +44,4 @@ chosen { zmk,underglow = &led_strip; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index 61950d18..172859ae 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,32 +1,41 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index da7deed1..172859ae 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,38 +1,47 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + compatible = "nordic,nrf-spim"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* WS2812 */ - chain-length = <32>; /* number of LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - - color-mapping = ; - }; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index 2864fd60..172859ae 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,13 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -18,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index b774b4ba..172859ae 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index b1e7fbb5..172859ae 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay index 1cff5f77..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; @@ -29,4 +45,3 @@ zmk,underglow = &led_strip; }; }; - diff --git a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index 80d0c898..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_13.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay index 80d0c898..172859ae 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_13.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -20,6 +35,7 @@ chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index 69bfffa0..172859ae 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index 360e7098..172859ae 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,32 +1,41 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "SK6812mini"; + label = "WS2812"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* There are per-key RGB, but the first 6 are underglow */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index d7cdcff7..89ba4f9d 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +#include - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <31>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; @@ -35,4 +44,4 @@ chosen { zmk,underglow = &led_strip; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..89ba4f9d --- /dev/null +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index 0a08c770..ece699e2 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <11>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..ece699e2 --- /dev/null +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 9d9ab734..27d76b07 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -4,11 +4,21 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index 9f6fad1c..fc2667f3 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <5>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 3a0ad462..c9a0e788 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 3a0ad462..0068b5b2 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <20>; - mosi-pin = <17>; - miso-pin = <25>; + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 9d9ab734..27d76b07 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -4,11 +4,21 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 7b12c252..5074d0f9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <31>; - mosi-pin = <30>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 9d9ab734..9a4f3170 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 9d9ab734..9a4f3170 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -4,11 +4,20 @@ * SPDX-License-Identifier: MIT */ +&pinctrl { + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; +}; + nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - sck-pin = <17>; - mosi-pin = <15>; - miso-pin = <25>; + pinctrl-0 = &spi0_default; + pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index d67e46f9..172859ae 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2021 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ +#include - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index b52faac6..172859ae 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <11>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index dc686af8..172859ae 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,31 +1,47 @@ -#include - -&spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; - - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; - - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; - - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; -}; - -/ { - chosen { - zmk,underglow = &led_strip; - }; -}; \ No newline at end of file +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..172859ae --- /dev/null +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index f869db5d..15c5801e 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <10>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index f869db5d..15c5801e 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2022 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <10>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index eb838b24..4a6b717d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -1,12 +1,28 @@ #include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index eb838b24..ed03ed0d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index 0087208c..172859ae 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <6>; /* arbitrary; change at will */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index fe7fbf18..62f20140 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <8>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <7>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..62f20140 --- /dev/null +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index d8a647e9..08379e30 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,18 +1,27 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -23,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <8>; /* number of LEDs */ + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..08379e30 --- /dev/null +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index dd7e34c4..08379e30 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index dd7e34c4..08379e30 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <9>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay index c2dab5a6..64d16572 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <43>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; @@ -29,4 +45,3 @@ zmk,underglow = &led_strip; }; }; - diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay index e53b149a..b84beb93 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <38>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay index 252329b4..64d16572 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -1,12 +1,27 @@ #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <43>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <12>; // 0.12 is not broken out on the nRFMicro - miso-pin = <22>; // 0.22 is not broken out on the nRFMicro + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; @@ -17,9 +32,10 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <2>; + chain-length = <10>; /* arbitrary; change at will */ spi-one-frame = <0x70>; spi-zero-frame = <0x40>; + color-mapping = ; }; }; diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index 020701fd..c70ffffb 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -54,23 +54,33 @@ For example, the Kyria shield has a `boards/nice_nano.overlay` file that defines With nRF52 boards, you can just use `&spi1` and define the pins you want to use. -To identify which pin number you need to put in the config you need do to a bit of math. You need the hardware port and run it through a function. -**32 \* X + Y** = `` where X is first part of the hardware port "PX.01" and Y is the second part of the hardware port "P1.Y". - -(_P1.13_ would give you _32 \* 1 + 13_ = `<45>` and P0.15 would give you _32 \* 0 + 15_ = `<15>`) - Here's an example on a definition that uses P0.06: ``` #include +&pinctrl { + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + &spi1 { compatible = "nordic,nrf-spim"; status = "okay"; - mosi-pin = <6>; - // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. - sck-pin = <5>; - miso-pin = <7>; + + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; From 0c5bcf5fe4dff38f55219c213a745a6731544896 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 16 Jan 2023 04:28:35 +0000 Subject: [PATCH 308/494] feat(docs): Add BLE feature/config pages. Co-authored-by: Cem Aksoylar --- docs/docs/config/bluetooth.md | 14 ++++++++ docs/docs/features/bluetooth.md | 59 +++++++++++++++++++++++++++++++++ docs/sidebars.js | 2 ++ 3 files changed, 75 insertions(+) create mode 100644 docs/docs/config/bluetooth.md create mode 100644 docs/docs/features/bluetooth.md diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md new file mode 100644 index 00000000..420dd5c3 --- /dev/null +++ b/docs/docs/config/bluetooth.md @@ -0,0 +1,14 @@ +--- +title: Bluetooth Configuration +sidebar_label: Bluetooth +--- + +See the [bluetooth feature page](../features/bluetooth.md) for more details on the general Bluetooth functionality in ZMK. + +See [Configuration Overview](index.md) for instructions on how to change these settings. + +## Kconfig + +| Option | Type | Description | Default | +| ------------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------- | ------- | +| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md new file mode 100644 index 00000000..f1a3e241 --- /dev/null +++ b/docs/docs/features/bluetooth.md @@ -0,0 +1,59 @@ +--- +title: Bluetooth +sidebar_label: Bluetooth +--- + +ZMK's bluetooth functionality allows users to connect their keyboards to hosts using Bluetooth Low Energy (BLE) technology. It also is used for split keyboards to connect the two halves wirelessly. + +:::note + +Bluetooth 4.2 or newer is required in order to connect to a ZMK keyboard. ZMK implements advanced security using BLE's Secure Connection feature, which requires Bluetooth 4.2 at a minimum. To avoid well-known security vulnerabilities, we disallow using Legacy pairing. + +::: + +## Security + +BLE connections between keyboards and hosts are secured by an initial pairing/bonding process that establishes long term keys (LTK) shared between the two sides, using Elliptic Curve Diffie Hellman (ECDH) for key generation. The same security is used to secure the communication between the two sides of split keyboards running ZMK. + +The only known vulnerability in the protocol is a risk of an active man-in-the-middle (MITM) attack exactly during the initial pairing, which can be mitigated in the future using the Numeric Comparison association model. Support for that in ZMK is still experimental, so if you have serious concerns about an active attacker with physical proximity to your device, consider only pairing/bonding your keyboards in a controlled environment. + +## Profiles + +By default, ZMK supports five "profiles" for selecting which bonded host +device should receive the keyboard input. + +:::note Connection Management + +When pairing to a host device ZMK saves bond information to the selected profile. It will not replace this automatically when you initiate pairing with another device. To pair with a new device select an unused profile with or clearing the current profile, using the [`&bt` behavior](../behaviors/bluetooth.md) on your keyboard. + +A ZMK device may show as "connected" on multiple hosts at the same time. This is working as intended, and only the host associated with the active profile will receive keystrokes. + +::: + +Failure to manage the profiles can result in unexpected/broken behavior with hosts due to bond key mismatches, so it is an important aspect of ZMK to understand. + +## Bluetooth Behavior + +Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](../behaviors/bluetooth.md). Be sure to refer to that documentation to learn how to manage profiles, switch between connected hosts, etc. + +## Troubleshooting + +## Known Issues + +There are a few known issues related to BLE and ZMK: + +### Windows Battery Reporting + +There is a known issue with Windows failing to update the battery information after connecting to a ZMK keyboard. You can work around this Windows bug by overriding a [Bluetooth config variable](../config/bluetooth.md) to force battery notifications even if a host neglects to subscribe to them: + +``` +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +``` + +### macOS Connected But Not Working + +If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding issue, macOS may report the keyboard as connected, but fail to actually work. If this occurs: + +1. Remove the keyboard from macOS using the Bluetooth control panel. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. +1. Try connecting again from macOS. diff --git a/docs/sidebars.js b/docs/sidebars.js index 7b445a29..a52f3302 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -10,6 +10,7 @@ module.exports = { ], Features: [ "features/keymaps", + "features/bluetooth", "features/combos", "features/conditional-layers", "features/debouncing", @@ -57,6 +58,7 @@ module.exports = { "config/backlight", "config/battery", "config/behaviors", + "config/bluetooth", "config/combos", "config/displays", "config/encoders", From 313ed6adb6db3154c14f783b791255b6f3422fb3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 17 Mar 2023 06:20:33 +0000 Subject: [PATCH 309/494] fix(display): Tweak EPD driver init/blanking. Ensure we only clear the display when turning blanking off the first time, not every time, to avoid duplicate clears. --- app/drivers/display/il0323.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/drivers/display/il0323.c b/app/drivers/display/il0323.c index 94e38481..6555e5c1 100644 --- a/app/drivers/display/il0323.c +++ b/app/drivers/display/il0323.c @@ -47,6 +47,7 @@ static uint8_t il0323_pwr[] = DT_INST_PROP(0, pwr); static uint8_t last_buffer[IL0323_BUFFER_SIZE]; static bool blanking_on = true; +static bool init_clear_done = false; static inline int il0323_write_cmd(const struct il0323_cfg *cfg, uint8_t cmd, uint8_t *data, size_t len) { @@ -198,16 +199,21 @@ static int il0323_clear_and_write_buffer(const struct device *dev, uint8_t patte static int il0323_blanking_off(const struct device *dev) { const struct il0323_cfg *cfg = dev->config; - if (blanking_on) { + if (!init_clear_done) { /* Update EPD panel in normal mode */ il0323_busy_wait(cfg); if (il0323_clear_and_write_buffer(dev, 0xff, true)) { return -EIO; } + init_clear_done = true; } blanking_on = false; + if (il0323_update_display(dev)) { + return -EIO; + } + return 0; } From 2614b856349a39a39ddb88c71b695c70a6fa1c05 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 24 Oct 2022 03:54:49 +0000 Subject: [PATCH 310/494] feat(docs): Add blog post for Zephyr 3.2. Co-authored-by: Cem Aksoylar --- docs/blog/2023-04-06-zephyr-3-2.md | 303 +++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 docs/blog/2023-04-06-zephyr-3-2.md diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md new file mode 100644 index 00000000..b60ad27c --- /dev/null +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -0,0 +1,303 @@ +--- +title: "Zephyr 3.2 Update" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [firmware, zephyr, core] +--- + +I'm happy to announce that we have completed the [work](https://github.com/zmkfirmware/zmk/pull/1499) to upgrade ZMK to [Zephyr 3.2](https://docs.zephyrproject.org/3.2.0/releases/release-notes-3.2.html)! + +[petejohanson] did the upgrade work to adjust ZMK for the Zephyr changes, with help from [Nicell] on the LVGL pieces. + +- Upgrade to LVGL 8.x API, and move to the new Kconfig settings. +- Tons of RP2040 work. +- Zephyr core API changes, including DTS `label` use changes. +- Move to [pinctrl](https://docs.zephyrproject.org/3.2.0/hardware/pinctrl/index.html) Zephyr subsystem. + +## Getting The Changes + +Use the following steps to update to the latest tooling in order to properly use the new ZMK changes: + +### User Config Repositories Using GitHub Actions + +Existing user config repositories using Github Actions to build will pull down Zephyr 3.2 automatically, however if you created your user config a while ago, you may need to update it to reference our shared build configuration to leverage the correct Docker image. + +1. Replace the contents of your `.github/workflows/build.yml` with: + + ``` + on: [push, pull_request, workflow_dispatch] + + jobs: + build: + uses: zmkfirmware/zmk/.github/workflows/build-user-config.yml@main + ``` + +1. If it doesn't exist already, add a new file to your repository named `build.yaml`: + + ``` + # This file generates the GitHub Actions matrix + # For simple board + shield combinations, add them + # to the top level board and shield arrays, for more + # control, add individual board + shield combinations to + # the `include` property, e.g: + # + # board: [ "nice_nano_v2" ] + # shield: [ "corne_left", "corne_right" ] + # include: + # - board: bdn9_rev2 + # - board: nice_nano_v2 + # shield: reviung41 + # + --- + ``` + +and then update it as appropriate to build the right shields/boards for your configuration. + +### Upgrade a manual script + +If you have a custom GitHub Actions workflow you need to maintain for some reason, you can update the workflow to to use the `stable` Docker image tag for the build: + +- Open `.github/workflows/build.yml` in your editor/IDE +- Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found +- Locate and delete the lines for the DTS output step, which is no longer needed: + + ``` + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + ``` + +### VS Code & Docker (Dev Container) + +If you build locally using VS Code & Docker then: + +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- reload the project +- if you are prompted to rebuild the remote container, click `Rebuild` +- otherwise, press `F1` and run `Remote Containers: Rebuild Container` +- Once the container has rebuilt and reloaded, run `west update` to pull the updated Zephyr version and its dependencies. + +Once the container has rebuilt, VS Code will be running the 3.2 Docker image. + +### Local Host Development + +The following steps will get you building ZMK locally against Zephyr 3.2: + +- Run the updated [toolchain installation](/docs/development/setup#toolchain-installation) steps, and once completed, remove the previously installed SDK version (optional, existing SDK should still work) +- Install the latest version of `west` by running `pip3 install --user --update west`. +- pull the latest ZMK `main` with `git pull` for your ZMK checkout +- run `west update` to pull the updated Zephyr version and its dependencies + +From there, you should be ready to build as normal! + +## Known Issues + +A few testers have reported inconsistent issues with bluetooth connections on Windows after upgrading, which can be resolved by re-pairing your keyboard by: + +1. Remove the device from Windows. +1. Clear the profile on your keyboard that is associated with the Windows device by triggering `&bt BT_CLR` on your keymap while that profile is active. +1. Restart Windows. +1. Re-connect Windows to your keyboard. + +## Windows Battery Reporting Fix + +Zephyr 3.2 introduced [a new Kconfig setting](https://github.com/zephyrproject-rtos/zephyr/pull/48929) that can be used to work around a bug in Windows related to battery reporting. Check out our [bluetooth config](/docs/config/bluetooth) for the full details. The key new configuration that can be set if using Windows is: + +``` +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n +``` + +## Keymap Changes + +Due to conflicts with new devicetree node labels added for Zephyr's [reset system](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/reset.html), the `&reset` behavior has been renamed to `&sys_reset`. + +All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](docs/codes/keymap-upgrader) and this will get fixed for you automatically. + +## Board/Shield Changes + +The following changes have [already been completed](https://github.com/zmkfirmware/zmk/pull/1499/commits) for all boards/shields in ZMK `main` branch. For existing or new PRs, or out of tree boards, the following changes are necessary to properly work with the latest changes. + +### Move to `pinctrl` driver + +Before this change, setting up the details of pins to use them for peripherals like SPI, I2C, etc. was a mix of platform specific driver code. Zephyr has moved to the newer `pinctrl` system to unify the handling of pin configuration, with additional flexibility for things like low power modes for those pins, etc. + +#### Board specific shield overlays + +The main area this affects existing shields is those with board specific overrides, e.g. `/boards/seeeduino_xiao_ble.overlay`, that sets up additional components on custom buses, e.g. addressable RGB LEDs leveraging the SPI MOSI pin. + +#### nRF52 Pin Assignments + +Previously in ZMK, we relied on per-driver devicetree source properties to set the alternate pin functions for things like SPI or I2C. For example, here is the I2C bus setup as it was previously on the `nice_nano` board: + +``` +&i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <17>; + scl-pin = <20>; +}; +``` + +With the move to the `pinctrl` system, this setup now look like: + +``` + &i2c0 { + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + }; +``` + +which references the `pinctrl` configuration: + +``` +&pinctrl { + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; +``` + +Although slightly more _verbose_ this allows pin configuration infrastructure to be re-used, specify other modes, like sleep, etc. in a standard way across architectures. + +#### Out of Tree Boards/Shields + +All of the in-tree boards and shields have been upgraded, but if you maintain/use an out-of-tree board or shield that uses the converted boards and overrides pins for various buses, you may need to switch to `pinctrl` to match ZMK's new approach. + +The approach is the following when updating a _board_: + +1. Add an entry `CONFIG_PINCTRL=y` to the `_defconfig` file in the board directory. +1. Add a new file with the naming convention `-pinctrl.dtsi` to your board directory. +1. In the new file, add your `pinctrl` entries that set up different pin control configurations for whatever peripherals/buses are needed. Here's the nice!nano file as an example: + + ``` + /* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + + &pinctrl { + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + }; + ``` + +1. From the main `.dts` file, add an `#include "-pinctrl.dtsi"` to have the C-preprocessor combine the files. +1. Update the various peripheral nodes to use the new `pinctrl` configurations. For example, the following old configuration: + + ``` + &i2c0 { + compatible = "nordic,nrf-twi"; + sda-pin = <15>; + scl-pin = <17>; + }; + ``` + + would be changed to: + + ``` + &i2c0 { + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + }; + ``` + +Because `pinctrl` configuration is very dependent on the specific target SoC, you will rarely need to consider it for a shield overlay that leverages a pro micro or XIAO abstraction. As noted, you're more likely to need to fix up pinctrl settings is using a board specific shield overlay, e.g. `/boards/.overlay` to set things up. + +### LVGL Kconfig changes. + +With the update to LVGL 8.x, Zephyr now leverages an upstream Kconfig file for most LVGL settings. Due to this, the naming for many existing configs has been adjusted. For any configs moved upstream, the naming mostly involves a prefix change from `LVGL_` to the shorter `LV_`. For any that are still Zephyr specific configs, they are now prefixed with `LV_Z_` prefix. + +If you maintain or use an out of tree board/shield with a display, the following will need to be changed in your Kconfig files: + +- `LVGL_VDB_SIZE` -> `LV_Z_VDB_SIZE` +- `LVGL_DPI` -> `LV_DPI_DEF` +- `LVGL_BITS_PER_PIXEL` -> `LV_Z_BITS_PER_PIXEL` + +Other than those specific examples, most other Kconfig values can simply change the `LVGL_` prefix to `LV_`. + +## Raspberry Pi Pico/RP2040 Support + +This Zephyr update allows ZMK to support the new(-ish) RP2040 SoC found in the Raspberry Pi Pico. + +:::note + +ZMK does _not_ support wired split communication yet, so RP2040 is only usable for non-split keyboards. To follow progress on wired splits, see [#1117](https://github.com/zmkfirmware/zmk/pull/1117). + +::: + +### Supported Controllers + +The following RP2040 powered controllers have board definitions for folks to test: + +- Raspberry Pi Pico (`rpi_pico`) +- SparkFun Pro Micro RP2040 (`sparkfun_pro_micro_rp2040`) +- Adafruit Keyboar/KB2040 (`adafruit_kb2040`) +- Seeeduino XIAO RP2040 (`seeeduino_xiao_rp2040`) +- Adafruit Qt PY RP2040 (`adafruit_qt_py_rp2040`) +- BoardSource blok (`boardsource_blok`) +- Elite-Pi (compatible with the `sparkfun_pro_micro_rp2040` board) + +## Upcoming Changes + +### Display re-init + +Zephyr's improved [power domain](https://docs.zephyrproject.org/3.2.0/services/pm/power_domain.html#pm-power-domain) support is a foundation +upon which we can provide a proper fix for the [longstanding display re-init bug](https://github.com/zmkfirmware/zmk/issues/674) which has prevented +ZMK from formally supporting our display code. + +There is work still remaining to fully leverage the power domain system within ZMK to fix the bug, but upgrading Zephyr is the first necessary step. + +## Thanks! + +Thanks to all the testers who have helped verify ZMK functionality on the newer Zephyr version. + +[petejohanson]: https://github.com/petejohanson +[nicell]: https://github.com/Nicell From 134b64ef5bbc67dd9f1c2a961609c62d4f226711 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 6 Apr 2023 06:14:44 +0000 Subject: [PATCH 311/494] fix(docs): Make link to keymap upgrader work. --- docs/blog/2023-04-06-zephyr-3-2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md index b60ad27c..693d93dc 100644 --- a/docs/blog/2023-04-06-zephyr-3-2.md +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -115,7 +115,7 @@ CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n Due to conflicts with new devicetree node labels added for Zephyr's [reset system](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/reset.html), the `&reset` behavior has been renamed to `&sys_reset`. -All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](docs/codes/keymap-upgrader) and this will get fixed for you automatically. +All of the in-tree keymaps have been fixed, but you may encounter build failures about duplicate names, requiring you rename the behavior reference in your keymap. Use the [Keymap Upgrader](/docs/codes/keymap-upgrader) and this will get fixed for you automatically. ## Board/Shield Changes From 9dcc3ac3753d06db752a1fa7610df1f1be376bd2 Mon Sep 17 00:00:00 2001 From: Hooky <117450225+HookyKB@users.noreply.github.com> Date: Fri, 7 Apr 2023 21:53:10 +0800 Subject: [PATCH 312/494] fix(shields): Fixup nice!view adapter pinctrl props. `pinctrl-0` setting missing `<>`. --- .../shields/nice_view_adapter/boards/bluemicro840_v1.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nice_nano.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay | 2 +- .../nice_view_adapter/boards/nrfmicro_11_flipped.overlay | 2 +- app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay | 2 +- .../shields/nice_view_adapter/boards/puchi_ble_v1.overlay | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 27d76b07..9667edf9 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -17,7 +17,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index fc2667f3..21383c70 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index c9a0e788..0068b5b2 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 27d76b07..9667edf9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -17,7 +17,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 5074d0f9..09b57d16 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 9a4f3170..0cdb933a 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 9a4f3170..0cdb933a 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -16,7 +16,7 @@ nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; - pinctrl-0 = &spi0_default; + pinctrl-0 = <&spi0_default>; pinctrl-names = "default"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; From 7434a6b99b01561ea20088819dd1e3cc2b989973 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 8 Apr 2023 00:30:20 -0700 Subject: [PATCH 313/494] fix(shields): Fix nice!view for deep sleep --- .../nice_view_adapter/boards/bluemicro840_v1.overlay | 12 ++++++++++-- .../nice_view_adapter/boards/mikoto_520.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nice_nano.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nice_nano_v2.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nrfmicro_11.overlay | 12 ++++++++++-- .../boards/nrfmicro_11_flipped.overlay | 11 ++++++++++- .../nice_view_adapter/boards/nrfmicro_13.overlay | 11 ++++++++++- .../nice_view_adapter/boards/puchi_ble_v1.overlay | 11 ++++++++++- 8 files changed, 80 insertions(+), 10 deletions(-) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index 9667edf9..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -12,13 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; - nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index 21383c70..d9cc0835 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 0068b5b2..2a1b757d 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 0068b5b2..2a1b757d 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index 9667edf9..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -12,13 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; - nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 09b57d16..1cd19db9 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index 0cdb933a..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index 0cdb933a..b8b07258 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -12,12 +12,21 @@ ; }; }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; - pinctrl-names = "default"; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; From b31b42018ae4368b03b72f038d4dfbbeb31a630a Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 8 Apr 2023 11:08:12 -0500 Subject: [PATCH 314/494] fix: Remove deprecated labels from zmk_uno --- app/boards/shields/zmk_uno/zmk_uno.overlay | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index f10d18af..12b5e2b3 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -16,7 +16,6 @@ led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; - label = "RGB"; /* SPI */ reg = <0>; /* ignored, but necessary for SPI bindings */ @@ -126,8 +125,6 @@ kscan_matrix: kscan_matrix { compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_MATRIX"; - diode-direction = "col2row"; col-gpios @@ -146,8 +143,6 @@ compatible = "zmk,kscan-gpio-direct"; status = "disabled"; - label = "KSCAN_DIRECT"; - input-gpios = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> @@ -161,8 +156,6 @@ compatible = "zmk,kscan-gpio-direct"; toggle-mode; - label = "KSCAN_TOGGLE"; - input-gpios = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> From 374104dec616013bd85bcdf095e1ecc4fea40954 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 9 Apr 2023 12:35:34 -0700 Subject: [PATCH 315/494] fix(underglow): Move to spi3 for underglow bus. * Workaround Zephyr bug for Nordic SPI(M) driver after the pinctrl refactor by using spi3 peripheral for the SPI bus for the WS2812 led_strip driver. --- .../shields/chalice/boards/nice_nano.overlay | 10 +++++----- .../shields/chalice/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/corne/boards/nice_nano.overlay | 10 +++++----- .../shields/corne/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/elephant42/boards/nice_nano.overlay | 10 +++++----- .../elephant42/boards/nice_nano_v2.overlay | 10 +++++----- .../eternal_keypad/boards/nice_nano.overlay | 10 +++++----- .../eternal_keypad/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/helix/boards/nice_nano.overlay | 10 +++++----- .../shields/helix/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/jorne/boards/nice_nano.overlay | 10 +++++----- .../shields/jorne/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/kyria/boards/nice_nano.overlay | 10 +++++----- .../shields/kyria/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/lily58/boards/nice_nano.overlay | 10 +++++----- .../shields/lily58/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/microdox/boards/nice_nano.overlay | 10 +++++----- .../shields/microdox/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/murphpad/boards/nice_nano.overlay | 10 +++++----- .../shields/murphpad/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/nibble/boards/nice_nano.overlay | 10 +++++----- .../shields/nibble/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/redox/boards/nice_nano.overlay | 10 +++++----- .../shields/redox/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/reviung41/boards/nice_nano.overlay | 12 ++++++------ .../reviung41/boards/nice_nano_v2.overlay | 12 ++++++------ .../shields/romac_plus/boards/nice_nano.overlay | 10 +++++----- .../romac_plus/boards/nice_nano_v2.overlay | 10 +++++----- app/boards/shields/snap/boards/nice_nano.overlay | 10 +++++----- .../shields/snap/boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- .../boards/nice_nano.overlay | 10 +++++----- .../boards/nice_nano_v2.overlay | 10 +++++----- app/boards/shields/tg4x/boards/nice_nano.overlay | 10 +++++----- .../shields/tg4x/boards/nice_nano_v2.overlay | 10 +++++----- .../shields/tidbit/boards/nice_nano.overlay | 10 +++++----- .../shields/tidbit/boards/nice_nano_v2.overlay | 10 +++++----- .../two_percent_milk/boards/nice_nano.overlay | 10 +++++----- .../two_percent_milk/boards/nice_nano_v2.overlay | 10 +++++----- docs/docs/features/underglow.md | 16 ++++++++-------- 43 files changed, 220 insertions(+), 220 deletions(-) diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/elephant42/boards/nice_nano.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/helix/boards/nice_nano_v2.overlay +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/jorne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/microdox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index 89ba4f9d..3e2241a2 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay index 89ba4f9d..3e2241a2 100644 --- a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index ece699e2..54ab9fec 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay index ece699e2..54ab9fec 100644 --- a/app/boards/shields/nibble/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/redox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index 172859ae..741237e1 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -32,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ + chain-length = <11>; spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay index 172859ae..741237e1 100644 --- a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -32,7 +32,7 @@ spi-max-frequency = <4000000>; /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ + chain-length = <11>; spi-one-frame = <0x70>; spi-zero-frame = <0x40>; diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index 15c5801e..28e9ce69 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index 15c5801e..28e9ce69 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index 4a6b717d..5b9ce4a8 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -2,13 +2,13 @@ &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -16,12 +16,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index ed03ed0d..9e168625 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index 172859ae..f1330669 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index 62f20140..54046bf5 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay index 62f20140..54046bf5 100644 --- a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index 08379e30..ad66feac 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,13 +1,13 @@ #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -15,12 +15,12 @@ }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index c70ffffb..c1dc68d3 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -52,7 +52,7 @@ For example, the Kyria shield has a `boards/nice_nano.overlay` file that defines ### nRF52-based boards -With nRF52 boards, you can just use `&spi1` and define the pins you want to use. +With nRF52 boards, you can just use `&spi3` and define the pins you want to use. Here's an example on a definition that uses P0.06: @@ -60,13 +60,13 @@ Here's an example on a definition that uses P0.06: #include &pinctrl { - spi1_default: spi1_default { + spi3_default: spi3_default { group1 { psels = ; }; }; - spi1_sleep: spi1_sleep { + spi3_sleep: spi3_sleep { group1 { psels = ; low-power-enable; @@ -74,12 +74,12 @@ Here's an example on a definition that uses P0.06: }; }; -&spi1 { +&spi3 { compatible = "nordic,nrf-spim"; status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; pinctrl-names = "default", "sleep"; led_strip: ws2812@0 { @@ -119,12 +119,12 @@ If your board/shield uses LEDs that require the data sent in a different order, For other boards, you must select an SPI definition that has the `MOSI` pin as your data pin going to your LED strip. -Here's another example for a non-nRF52 board on `spi1`: +Here's another example for a non-nRF52 board on `spi3`: ``` #include -&spi1 { +&spi3 { led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; From 064aff6bc074febd394a288403129e95c386395d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 8 Apr 2023 16:32:29 -0500 Subject: [PATCH 316/494] fix(behaviors): Fix use after free in sticky key Fixed an issue where the sticky key behavior would call ZMK_EVENT_RAISE_AFTER(), which would free the provided event, but then it would keep using that now-freed event data. --- app/src/behaviors/behavior_sticky_key.c | 30 +++++++++++++++---------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/behaviors/behavior_sticky_key.c b/app/src/behaviors/behavior_sticky_key.c index 22936086..6697b9b1 100644 --- a/app/src/behaviors/behavior_sticky_key.c +++ b/app/src/behaviors/behavior_sticky_key.c @@ -191,6 +191,11 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { // keep track whether the event has been reraised, so we only reraise it once bool event_reraised = false; + + // reraising the event frees it, so make a copy of any event data we might + // need after it's been freed. + const struct zmk_keycode_state_changed ev_copy = *ev; + for (int i = 0; i < ZMK_BHV_STICKY_KEY_MAX_HELD; i++) { struct active_sticky_key *sticky_key = &active_sticky_keys[i]; if (sticky_key->position == ZMK_BHV_STICKY_KEY_POSITION_FREE) { @@ -198,23 +203,24 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { } if (strcmp(sticky_key->config->behavior.behavior_dev, "KEY_PRESS") == 0 && - ZMK_HID_USAGE_ID(sticky_key->param1) == ev->keycode && - ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev->usage_page && - SELECT_MODS(sticky_key->param1) == ev->implicit_modifiers) { + ZMK_HID_USAGE_ID(sticky_key->param1) == ev_copy.keycode && + ZMK_HID_USAGE_PAGE(sticky_key->param1) == ev_copy.usage_page && + SELECT_MODS(sticky_key->param1) == ev_copy.implicit_modifiers) { // don't catch key down events generated by the sticky key behavior itself continue; } // If this event was queued, the timer may be triggered late or not at all. // Release the sticky key if the timer should've run out in the meantime. - if (sticky_key->release_at != 0 && ev->timestamp > sticky_key->release_at) { + if (sticky_key->release_at != 0 && ev_copy.timestamp > sticky_key->release_at) { stop_timer(sticky_key); release_sticky_key_behavior(sticky_key, sticky_key->release_at); continue; } - if (ev->state) { // key down - if (sticky_key->config->ignore_modifiers && is_mod(ev->usage_page, ev->keycode)) { + if (ev_copy.state) { // key down + if (sticky_key->config->ignore_modifiers && + is_mod(ev_copy.usage_page, ev_copy.keycode)) { // ignore modifier key press so we can stack sticky keys and combine with other // modifiers continue; @@ -231,17 +237,17 @@ static int sticky_key_keycode_state_changed_listener(const zmk_event_t *eh) { ZMK_EVENT_RAISE_AFTER(eh, behavior_sticky_key); event_reraised = true; } - release_sticky_key_behavior(sticky_key, ev->timestamp); + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } - sticky_key->modified_key_usage_page = ev->usage_page; - sticky_key->modified_key_keycode = ev->keycode; + sticky_key->modified_key_usage_page = ev_copy.usage_page; + sticky_key->modified_key_keycode = ev_copy.keycode; } else { // key up if (sticky_key->timer_started && - sticky_key->modified_key_usage_page == ev->usage_page && - sticky_key->modified_key_keycode == ev->keycode) { + sticky_key->modified_key_usage_page == ev_copy.usage_page && + sticky_key->modified_key_keycode == ev_copy.keycode) { stop_timer(sticky_key); - release_sticky_key_behavior(sticky_key, ev->timestamp); + release_sticky_key_behavior(sticky_key, ev_copy.timestamp); } } } From 3c8f55ede0a8f08f0cc11e500c0f2e3d05a87f7c Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 9 Apr 2023 18:08:35 -0700 Subject: [PATCH 317/494] fix(display): Do not override font size in status screen --- app/src/display/status_screen.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/src/display/status_screen.c b/app/src/display/status_screen.c index 7c3870a8..58de09ae 100644 --- a/app/src/display/status_screen.c +++ b/app/src/display/status_screen.c @@ -34,16 +34,9 @@ static struct zmk_widget_layer_status layer_status_widget; static struct zmk_widget_wpm_status wpm_status_widget; #endif -lv_style_t global_style; - lv_obj_t *zmk_display_status_screen() { lv_obj_t *screen; - - lv_style_init(&global_style); - lv_style_set_text_font(&global_style, &lv_font_montserrat_12); - screen = lv_obj_create(NULL); - lv_obj_add_style(screen, &global_style, LV_PART_MAIN); #if IS_ENABLED(CONFIG_ZMK_WIDGET_BATTERY_STATUS) zmk_widget_battery_status_init(&battery_status_widget, screen); From 702d79c108bfd02d85dda3dda55f31ce8316cfd8 Mon Sep 17 00:00:00 2001 From: nguyendown <50001260+nguyendown@users.noreply.github.com> Date: Mon, 10 Apr 2023 12:50:57 +0700 Subject: [PATCH 318/494] test(behaviors): add unit tests for sticky key `quick-release` Duplicate the existing tests with `quick-release` enabled: - 8-lsk-osk-combination-quick-release - 10-callum-mods-quick-release --- .../events.patterns | 1 + .../keycode_events.snapshot | 10 ++++ .../native_posix_64.keymap | 40 +++++++++++++ .../events.patterns | 1 + .../keycode_events.snapshot | 12 ++++ .../native_posix_64.keymap | 56 +++++++++++++++++++ 6 files changed, 120 insertions(+) create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot create mode 100644 app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot create mode 100644 app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns b/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns new file mode 100644 index 00000000..b1342af4 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot b/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot new file mode 100644 index 00000000..5ee7c103 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/keycode_events.snapshot @@ -0,0 +1,10 @@ +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE2 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap new file mode 100644 index 00000000..5c1c2264 --- /dev/null +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap @@ -0,0 +1,40 @@ +#include +#include +#include + +&sk { + quick-release; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &sk LEFT_CONTROL &kp A + &sk LEFT_SHIFT &sk LEFT_ALT>; + }; + }; +}; + +&kscan { + events = < + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap sk LEFT_ALT */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* tap A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns new file mode 100644 index 00000000..b1342af4 --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot new file mode 100644 index 00000000..d71c3968 --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/keycode_events.snapshot @@ -0,0 +1,12 @@ +pressed: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE0 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0xE1 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap new file mode 100644 index 00000000..6d88a9ea --- /dev/null +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap @@ -0,0 +1,56 @@ +#include +#include +#include + +&sk { + quick-release; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &sk LEFT_SHIFT &sl 1 + &kp A &kp B>; + }; + + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; +}; + +&kscan { + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; +}; From 3f48062225e0382de35cecc3da6914be89a2c91e Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:11:46 -0500 Subject: [PATCH 319/494] feat(core): Add Kconfig option to exclude debug log messages --- app/Kconfig | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 824d2700..794b6762 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -402,6 +402,17 @@ endmenu menu "USB Logging" +config ZMK_LOGGING_MINIMAL + bool "Suppress all ZMK debug log messages" + default false + +if !ZMK_LOGGING_MINIMAL + +config ZMK_LOG_LEVEL + default 4 + +endif + config ZMK_USB_LOGGING bool "Enable USB CDC ACM logging to help debug" select LOG @@ -417,16 +428,12 @@ config ZMK_USB_LOGGING if ZMK_USB_LOGGING -config ZMK_LOG_LEVEL - default 4 - choice USB_CDC_ACM_LOG_LEVEL_CHOICE default USB_CDC_ACM_LOG_LEVEL_OFF endchoice choice USB_DRIVER_LOG_LEVEL_CHOICE default USB_DRIVER_LOG_LEVEL_OFF - endchoice # We do this to avoid log loop where logging to USB generates more log messages. From a20b9502bc069cac94a55243cf091e3174a9992b Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:14:23 -0500 Subject: [PATCH 320/494] feat(core): Add RTT logging Kconfig option --- app/Kconfig | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 794b6762..75a37f63 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -400,7 +400,7 @@ config ZMK_KSCAN_EVENT_QUEUE_SIZE #KSCAN Settings endmenu -menu "USB Logging" +menu "Logging" config ZMK_LOGGING_MINIMAL bool "Suppress all ZMK debug log messages" @@ -441,16 +441,38 @@ endchoice config USB_CDC_ACM_RINGBUF_SIZE default 1024 -config LOG_BUFFER_SIZE - default 8192 - config LOG_PROCESS_THREAD_STARTUP_DELAY_MS default 1000 #ZMK_USB_LOGGING endif -#USB Logging +config ZMK_RTT_LOGGING + bool "Enable RTT logging to help debug" + select LOG + select DEBUG + select ASSERT + select USE_SEGGER_RTT + select CONSOLE + select RTT_CONSOLE + +if ZMK_RTT_LOGGING + +config SEGGER_RTT_BUFFER_SIZE_UP + default 8192 + +#ZMK_RTT_LOGGING +endif + +if ZMK_USB_LOGGING || ZMK_RTT_LOGGING + +config LOG_BUFFER_SIZE + default 8192 + +#ZMK_USB_LOGGING || ZMK_RTT_LOGGING +endif + +#Logging endmenu if SETTINGS From ee9fcec3c97c23e15a2369b95cc0a590f04f1875 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 24 Feb 2023 18:16:18 -0500 Subject: [PATCH 321/494] feat(core): Process log every 100ms --- app/Kconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 75a37f63..431a1bb1 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -469,6 +469,9 @@ if ZMK_USB_LOGGING || ZMK_RTT_LOGGING config LOG_BUFFER_SIZE default 8192 +config LOG_PROCESS_THREAD_SLEEP_MS + default 100 + #ZMK_USB_LOGGING || ZMK_RTT_LOGGING endif From 309359b32f2ce46adc2b720b1cca20d9ac333d6c Mon Sep 17 00:00:00 2001 From: Purdea Andrei Date: Mon, 10 Apr 2023 10:27:19 +0300 Subject: [PATCH 322/494] fix(keymaps): fix keypresses that are not in the transform Before this change, if a matrix position was not present in the transform, various incorrect behaviors would happen: 1) In some cases out-of-bounds accesses: Note that the size of the`transform[]` array does not necessarily match the size of the matrix. So for example if key position (ZMK_MATRIX_COLS-1, ZMK_MATRIX_ROWS-1) is not present in the transform, but ends up being pressed, then the array will be accessed beyond its size, and any data could be returned. 2) In other cases the 0th position in the keymap will be used because the `transform[]` array is initialized to all zeros. --- app/include/zmk/matrix_transform.h | 2 +- app/src/kscan.c | 9 ++++++- app/src/matrix_transform.c | 43 +++++++++++++++++++++++------- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/include/zmk/matrix_transform.h b/app/include/zmk/matrix_transform.h index 413678a7..ffd3e3f1 100644 --- a/app/include/zmk/matrix_transform.h +++ b/app/include/zmk/matrix_transform.h @@ -6,4 +6,4 @@ #pragma once -uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column); \ No newline at end of file +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column); \ No newline at end of file diff --git a/app/src/kscan.c b/app/src/kscan.c index b0713320..62d0cf07 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -47,7 +47,14 @@ void zmk_kscan_process_msgq(struct k_work *item) { while (k_msgq_get(&zmk_kscan_msgq, &ev, K_NO_WAIT) == 0) { bool pressed = (ev.state == ZMK_KSCAN_EVENT_STATE_PRESSED); - uint32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + int32_t position = zmk_matrix_transform_row_column_to_position(ev.row, ev.column); + + if (position < 0) { + LOG_WRN("Not found in transform: row: %d, col: %d, pressed: %s", ev.row, ev.column, + (pressed ? "true" : "false")); + continue; + } + LOG_DBG("Row: %d, col: %d, position: %d, pressed: %s", ev.row, ev.column, position, (pressed ? "true" : "false")); ZMK_EVENT_RAISE(new_zmk_position_state_changed( diff --git a/app/src/matrix_transform.c b/app/src/matrix_transform.c index 47256608..6c616d5e 100644 --- a/app/src/matrix_transform.c +++ b/app/src/matrix_transform.c @@ -11,17 +11,32 @@ #ifdef ZMK_KEYMAP_TRANSFORM_NODE -#define _TRANSFORM_ENTRY(i, _) \ - [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ - KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i +/* the transform in the device tree is a list of (row,column) pairs that is + * indexed by by the keymap position of that key. We want to invert this in + * order to be able to quickly determine what keymap position a particular + * row,column pair is associated with, using a single lookup. + * + * We do this by creating the `transform` array at compile time, which is + * indexed by (row * ZMK_MATRIX_COLS) + column, and the value contains an + * encoded keymap index it is associated with. The keymap index is encoded + * by adding INDEX_OFFSET to it, because not all row,column pairs have an + * associated keymap index (some matrices are sparse), C globals are + * initialized to 0, and the keymap index of 0 is a valid index. We want to + * be able to detect the condition when an unassigned matrix position is + * pressed and we want to return an error. + */ -static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, _TRANSFORM_ENTRY, (, ), 0)}; +#define INDEX_OFFSET 1 + +#define TRANSFORM_ENTRY(i, _) \ + [(KT_ROW(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i)) * ZMK_MATRIX_COLS) + \ + KT_COL(DT_PROP_BY_IDX(ZMK_KEYMAP_TRANSFORM_NODE, map, i))] = i + INDEX_OFFSET + +static uint32_t transform[] = {LISTIFY(ZMK_KEYMAP_LEN, TRANSFORM_ENTRY, (, ), 0)}; #endif -uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column) { - uint32_t matrix_index; - +int32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t column) { #if DT_NODE_HAS_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset) column += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, col_offset); #endif @@ -30,10 +45,20 @@ uint32_t zmk_matrix_transform_row_column_to_position(uint32_t row, uint32_t colu row += DT_PROP(ZMK_KEYMAP_TRANSFORM_NODE, row_offset); #endif - matrix_index = (row * ZMK_MATRIX_COLS) + column; + const uint32_t matrix_index = (row * ZMK_MATRIX_COLS) + column; #ifdef ZMK_KEYMAP_TRANSFORM_NODE - return transform[matrix_index]; + if (matrix_index >= ARRAY_SIZE(transform)) { + return -EINVAL; + } + + const uint32_t value = transform[matrix_index]; + + if (!value) { + return -EINVAL; + } + + return value - INDEX_OFFSET; #else return matrix_index; #endif /* ZMK_KEYMAP_TRANSFORM_NODE */ From f1b138cbf0a37147f24150af2721899fa17e9fd4 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 14 Apr 2023 14:22:53 -0700 Subject: [PATCH 323/494] fix(boards): Fix Zen logo alignment --- app/boards/arm/corneish_zen/custom_status_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/arm/corneish_zen/custom_status_screen.c b/app/boards/arm/corneish_zen/custom_status_screen.c index c45a6243..492239c8 100644 --- a/app/boards/arm/corneish_zen/custom_status_screen.c +++ b/app/boards/arm/corneish_zen/custom_status_screen.c @@ -70,7 +70,7 @@ lv_obj_t *zmk_display_status_screen() { lv_obj_t *zenlogo_icon; zenlogo_icon = lv_img_create(screen); lv_img_set_src(zenlogo_icon, &zenlogo); - lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 2, -5); + lv_obj_align(zenlogo_icon, LV_ALIGN_BOTTOM_MID, 0, -5); #endif return screen; From 71855af14fa079606d4cbdd3d6403e8956c136f8 Mon Sep 17 00:00:00 2001 From: Josep Roca Date: Sun, 16 Apr 2023 10:04:49 +0300 Subject: [PATCH 324/494] fix(docs): ignore-modifiers clarification * Clarify the potential need of adding the ignore-modifiers setting for new sticky key behaviors. * Add ignore-modifiers setting to skq example * Update docs/docs/behaviors/sticky-key.md Co-authored-by: Cem Aksoylar --- docs/docs/behaviors/sticky-key.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/docs/behaviors/sticky-key.md b/docs/docs/behaviors/sticky-key.md index 12541ed8..d881e6b0 100644 --- a/docs/docs/behaviors/sticky-key.md +++ b/docs/docs/behaviors/sticky-key.md @@ -36,7 +36,7 @@ Some typists may find that using a sticky shift key interspersed with rapid typi #### `ignore-modifiers` -This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. +This setting is enabled by default. It ensures that if a sticky key modifier is pressed before a previously pressed sticky key is released, the modifiers will get combined so you can add more sticky keys or press a regular key to apply the modifiers. This is to accommodate _callum-style mods_ where you are prone to rolling sticky keys. If you want sticky key modifiers to only chain after release, you can disable this setting. Please note that activating multiple modifiers via [modifier functions](https://zmk.dev/docs/codes/modifiers#modifier-functions) such as `&sk LS(LALT)`, require `ignore-modifiers` enabled in order to function properly. #### Example @@ -66,6 +66,7 @@ This configuration would apply to all sticky keys. This may not be appropriate i bindings = <&kp>; release-after-ms = <1000>; quick-release; + ignore-modifiers; }; }; From 83a151890cd9491036ef2d73cd22db86a7a55f5c Mon Sep 17 00:00:00 2001 From: sporkus <102923689+sporkus@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:28:08 -0700 Subject: [PATCH 325/494] fix(docs): Correct example keymap filename --- docs/docs/development/boards-shields-keymaps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/development/boards-shields-keymaps.md b/docs/docs/development/boards-shields-keymaps.md index 4644ee79..77d8361a 100644 --- a/docs/docs/development/boards-shields-keymaps.md +++ b/docs/docs/development/boards-shields-keymaps.md @@ -30,7 +30,7 @@ in the `app/boards/${arch}/${board_name}` directory, e.g. `app/boards/arm/planck - A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,kscan` which references the configured KSCAN driver (usually a GPIO matrix) - (Optional) A [chosen](https://docs.zephyrproject.org/2.5.0/guides/dts/intro.html#aliases-and-chosen-nodes) node named `zmk,matrix_transform` that defines the mapping from KSCAN row/column values to the logical key position for the keyboard. - A `board.cmake` file with CMake directives for how to flash to the device. -- A `keymap/keymap.overlay` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. +- A `${board_name}.keymap` file that includes the default keymap for that keyboard. Users will be able to override this keymap in their user configs. ## Pro Micro Compatible Keyboard From e7a6e4016d757d37f0b8df28d7b78f38554e0b27 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 29 Oct 2022 23:17:12 -0500 Subject: [PATCH 326/494] feat(behaviors): Add key position to key events Extended the virtual key position system from combos so that each sensor also gets a virtual key position. This allows sensor behaviors to use the behavior queue API. --- app/include/drivers/behavior.h | 13 +++++++----- app/include/zmk/sensors.h | 7 ++++++- app/include/zmk/virtual_key_position.h | 20 +++++++++++++++++++ .../behavior_sensor_rotate_key_press.c | 3 ++- app/src/combo.c | 3 ++- app/src/keymap.c | 10 ++++++---- 6 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 app/include/zmk/virtual_key_position.h diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 71df7344..df18385f 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -26,6 +26,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b struct zmk_behavior_binding_event event); typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp); enum behavior_locality { @@ -150,21 +151,23 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi /** * @brief Handle the a sensor keymap binding being triggered - * @param dev Pointer to the device structure for the driver instance. + * @param binding Sensor keymap binding which was triggered. * @param sensor Pointer to the sensor device structure for the sensor driver instance. - * @param param1 User parameter specified at time of behavior binding. - * @param param2 User parameter specified at time of behavior binding. + * @param virtual_key_position ZMK_KEYMAP_LEN + sensor number + * @param timestamp Time at which the binding was triggered. * * @retval 0 If successful. * @retval Negative errno code if failure. */ __syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp); static inline int z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, int64_t timestamp) { + const struct device *sensor, + uint32_t virtual_key_position, int64_t timestamp) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -177,7 +180,7 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, timestamp); + return api->sensor_binding_triggered(binding, sensor, virtual_key_position, timestamp); } /** diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 8c6c28b3..9e54695f 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -8,5 +8,10 @@ #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) -#define ZMK_KEYMAP_SENSORS_LEN DT_PROP_LEN(ZMK_KEYMAP_SENSORS_NODE, sensors) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) + +#if ZMK_KEYMAP_HAS_SENSORS +#define ZMK_KEYMAP_SENSORS_LEN DT_PROP_LEN(ZMK_KEYMAP_SENSORS_NODE, sensors) +#else +#define ZMK_KEYMAP_SENSORS_LEN 0 +#endif diff --git a/app/include/zmk/virtual_key_position.h b/app/include/zmk/virtual_key_position.h new file mode 100644 index 00000000..48deee5c --- /dev/null +++ b/app/include/zmk/virtual_key_position.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +/** + * Gets the virtual key position to use for the sensor with the given index. + */ +#define ZMK_VIRTUAL_KEY_POSITION_SENSOR(index) (ZMK_KEYMAP_LEN + (index)) + +/** + * Gets the virtual key position to use for the combo with the given index. + */ +#define ZMK_VIRTUAL_KEY_POSITION_COMBO(index) (ZMK_KEYMAP_LEN + ZMK_KEYMAP_SENSORS_LEN + (index)) diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index ed6eedae..72e33ea4 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -21,7 +21,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static int behavior_sensor_rotate_key_press_init(const struct device *dev) { return 0; }; static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, int64_t timestamp) { + const struct device *sensor, uint32_t virtual_key_position, + int64_t timestamp) { struct sensor_value value; int err; uint32_t keycode; diff --git a/app/src/combo.c b/app/src/combo.c index 2e237330..90c89c15 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -19,6 +19,7 @@ #include #include #include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -476,7 +477,7 @@ ZMK_SUBSCRIPTION(combo, zmk_position_state_changed); .key_positions = DT_PROP(n, key_positions), \ .key_position_len = DT_PROP_LEN(n, key_positions), \ .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, n), \ - .virtual_key_position = ZMK_KEYMAP_LEN + __COUNTER__, \ + .virtual_key_position = ZMK_VIRTUAL_KEY_POSITION_COMBO(__COUNTER__), \ .slow_release = DT_PROP(n, slow_release), \ .layers = DT_PROP(n, layers), \ .layers_len = DT_PROP_LEN(n, layers), \ diff --git a/app/src/keymap.c b/app/src/keymap.c index c4e304d4..825246fa 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -4,16 +4,17 @@ * SPDX-License-Identifier: MIT */ +#include #include #include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); +#include +#include #include #include -#include -#include -#include +#include #include #if ZMK_BLE_IS_CENTRAL @@ -269,7 +270,8 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens continue; } - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, timestamp); + const uint32_t position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number); + ret = behavior_sensor_keymap_binding_triggered(binding, sensor, position, timestamp); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); From 5c6f21b0e0fe0e85b43056e1ec8b6087b5d31e29 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 29 Oct 2022 23:26:25 -0500 Subject: [PATCH 327/494] fix: Fix compiler warnings in sensor code --- app/src/keymap.c | 2 +- app/src/sensors.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/keymap.c b/app/src/keymap.c index 825246fa..1f55ad03 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -255,7 +255,7 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sensor, int64_t timestamp) { for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { - if (zmk_keymap_layer_active(layer) && zmk_sensor_keymap[layer] != NULL) { + if (zmk_keymap_layer_active(layer)) { struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_number]; const struct device *behavior; int ret; diff --git a/app/src/sensors.c b/app/src/sensors.c index efae2bd9..1b92147f 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -35,9 +35,10 @@ struct sensors_data_item { static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; -static void zmk_sensors_trigger_handler(const struct device *dev, struct sensor_trigger *trigger) { +static void zmk_sensors_trigger_handler(const struct device *dev, + const struct sensor_trigger *trigger) { int err; - struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); + const struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); LOG_DBG("sensor %d", item->sensor_number); From 9a73650041da7008fa2df7bd8bbb02ecc8efd9b4 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 21 Apr 2023 09:16:28 -0700 Subject: [PATCH 328/494] fix(boards): Move nice!60 to SPI3 for underglow * Move to SPI3 for underglow peripheral, needed after the move to pinctrl. --- app/boards/arm/nice60/nice60-pinctrl.dtsi | 2 +- app/boards/arm/nice60/nice60.dts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi index aced76b4..ace80f10 100644 --- a/app/boards/arm/nice60/nice60-pinctrl.dtsi +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -4,7 +4,7 @@ */ &pinctrl { - spi0_default: spi0_default { + spi3_default: spi3_default { group1 { psels = ; }; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index c982f88e..fdc65d6b 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -109,10 +109,10 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R status = "okay"; }; -&spi0 { +&spi3 { compatible = "nordic,nrf-spim"; - /* Cannot be used together with i2c0. */ - pinctrl-0 = <&spi0_default>; + + pinctrl-0 = <&spi3_default>; pinctrl-names = "default"; status = "okay"; From 3db163aa2cf7db2bd710ba93b57f3eb804b086c7 Mon Sep 17 00:00:00 2001 From: Nick Conway Date: Mon, 23 May 2022 16:33:08 -0400 Subject: [PATCH 329/494] feat(behaviors): Add reusable sensor behaviors. * Add new sensor behaviors that either take full bindings add definition, or accept parameters when bound in the keymap. * Remove existing hard-coded key press sensor behavior and instead leverage new generic sensor behaviors to achieve the same functionality. Co-authored-by: nick@conway.dev --- app/CMakeLists.txt | 4 +- app/Kconfig | 6 +- app/Kconfig.behaviors | 24 ++++++ .../behaviors/sensor_rotate_key_press.dtsi | 3 +- .../zmk,behavior-sensor-rotate-key-press.yaml | 19 ----- .../zmk,behavior-sensor-rotate-var.yaml | 25 ++++++ .../behaviors/zmk,behavior-sensor-rotate.yaml | 21 +++++ app/include/drivers/behavior.h | 10 +-- app/src/behaviors/behavior_sensor_rotate.c | 40 ++++++++++ .../behaviors/behavior_sensor_rotate_common.c | 52 +++++++++++++ .../behaviors/behavior_sensor_rotate_common.h | 13 ++++ .../behavior_sensor_rotate_key_press.c | 69 ----------------- .../behaviors/behavior_sensor_rotate_var.c | 31 ++++++++ app/src/keymap.c | 5 +- docs/docs/behaviors/sensor-rotate.md | 77 +++++++++++++++++++ docs/docs/features/encoders.md | 8 +- docs/sidebars.js | 1 + 17 files changed, 301 insertions(+), 107 deletions(-) create mode 100644 app/Kconfig.behaviors delete mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml create mode 100644 app/src/behaviors/behavior_sensor_rotate.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_common.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_common.h delete mode 100644 app/src/behaviors/behavior_sensor_rotate_key_press.c create mode 100644 app/src/behaviors/behavior_sensor_rotate_var.c create mode 100644 docs/docs/behaviors/sensor-rotate.md diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 3da50b57..a647e883 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -51,7 +51,9 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_to_layer.c) target_sources(app PRIVATE src/behaviors/behavior_transparent.c) target_sources(app PRIVATE src/behaviors/behavior_none.c) - target_sources(app PRIVATE src/behaviors/behavior_sensor_rotate_key_press.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE app PRIVATE src/behaviors/behavior_sensor_rotate.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c) target_sources(app PRIVATE src/combo.c) target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) diff --git a/app/Kconfig b/app/Kconfig index 431a1bb1..ccc5f42d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -350,11 +350,7 @@ config ZMK_BEHAVIORS_QUEUE_SIZE int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" default 64 -DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE := zmk,behavior-key-toggle - -config ZMK_BEHAVIOR_KEY_TOGGLE - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BEHAVIOR_KEY_TOGGLE)) +rsource "Kconfig.behaviors" config ZMK_MACRO_DEFAULT_WAIT_MS int "Default time to wait (in milliseconds) before triggering the next behavior in macros" diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors new file mode 100644 index 00000000..17850eae --- /dev/null +++ b/app/Kconfig.behaviors @@ -0,0 +1,24 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config ZMK_BEHAVIOR_KEY_TOGGLE + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_KEY_TOGGLE_ENABLED + + +config ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + bool + default n + +config ZMK_BEHAVIOR_SENSOR_ROTATE + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_ENABLED + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + +config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON \ No newline at end of file diff --git a/app/dts/behaviors/sensor_rotate_key_press.dtsi b/app/dts/behaviors/sensor_rotate_key_press.dtsi index d3f084b0..ed1b4cd0 100644 --- a/app/dts/behaviors/sensor_rotate_key_press.dtsi +++ b/app/dts/behaviors/sensor_rotate_key_press.dtsi @@ -8,9 +8,10 @@ behaviors { /* DEPRECATED: `inc_dec_cp` will be removed in the future */ /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { - compatible = "zmk,behavior-sensor-rotate-key-press"; + compatible = "zmk,behavior-sensor-rotate-var"; label = "ENC_KEY_PRESS"; #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; }; }; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml deleted file mode 100644 index 1fc60fcf..00000000 --- a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-key-press.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -description: Sensor rotate key press/release behavior - -compatible: "zmk,behavior-sensor-rotate-key-press" - -properties: - label: - type: string - required: true - "#sensor-binding-cells": - type: int - required: true - const: 2 - -sensor-binding-cells: - - param1 - - param2 diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml new file mode 100644 index 00000000..0da3b4db --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate-var.yaml @@ -0,0 +1,25 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Sensor rotate behavior + +compatible: "zmk,behavior-sensor-rotate-var" + +properties: + label: + type: string + required: true + "#sensor-binding-cells": + type: int + required: true + const: 2 + bindings: + type: phandles + required: true + tap-ms: + type: int + default: 5 + +sensor-binding-cells: + - param1 + - param2 diff --git a/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml new file mode 100644 index 00000000..d20777b8 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-sensor-rotate.yaml @@ -0,0 +1,21 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Sensor rotate behavior + +compatible: "zmk,behavior-sensor-rotate" + +properties: + label: + type: string + required: true + "#sensor-binding-cells": + type: int + required: true + const: 0 + bindings: + type: phandle-array + required: true + tap-ms: + type: int + default: 5 diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index df18385f..380fc76f 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -26,8 +26,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b struct zmk_behavior_binding_event event); typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, - int64_t timestamp); + struct zmk_behavior_binding_event event); enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, @@ -161,13 +160,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi */ __syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, - int64_t timestamp); + struct zmk_behavior_binding_event event); static inline int z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, const struct device *sensor, - uint32_t virtual_key_position, int64_t timestamp) { + struct zmk_behavior_binding_event event) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -180,7 +178,7 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, virtual_key_position, timestamp); + return api->sensor_binding_triggered(binding, sensor, event); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c new file mode 100644 index 00000000..e12278bb --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_sensor_rotate + +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { + .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + +static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; + +#define _TRANSFORM_ENTRY(idx, node) \ + { \ + .behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(node, bindings, idx), label), \ + .param1 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param1), (0), \ + (DT_INST_PHA_BY_IDX(node, bindings, idx, param1))), \ + .param2 = COND_CODE_0(DT_INST_PHA_HAS_CELL_AT_IDX(node, bindings, idx, param2), (0), \ + (DT_INST_PHA_BY_IDX(node, bindings, idx, param2))), \ + } + +#define SENSOR_ROTATE_INST(n) \ + static struct behavior_sensor_rotate_config behavior_sensor_rotate_config_##n = { \ + .cw_binding = _TRANSFORM_ENTRY(0, n), \ + .ccw_binding = _TRANSFORM_ENTRY(1, n), \ + .tap_ms = DT_INST_PROP_OR(n, tap_ms, 5), \ + .override_params = false, \ + }; \ + DEVICE_DT_INST_DEFINE( \ + n, behavior_sensor_rotate_init, NULL, NULL, &behavior_sensor_rotate_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_INST) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c new file mode 100644 index 00000000..bd31170e --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -0,0 +1,52 @@ + +#include +#include +#include +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, + const struct device *sensor, + struct zmk_behavior_binding_event event) { + const struct device *dev = device_get_binding(binding->behavior_dev); + const struct behavior_sensor_rotate_config *cfg = dev->config; + + struct sensor_value value; + + const int err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); + + if (err < 0) { + LOG_WRN("Failed to get sensor rotation value: %d", err); + return err; + } + + struct zmk_behavior_binding triggered_binding; + switch (value.val1) { + case 1: + triggered_binding = cfg->cw_binding; + if (cfg->override_params) { + triggered_binding.param1 = binding->param1; + } + break; + case -1: + triggered_binding = cfg->ccw_binding; + if (cfg->override_params) { + triggered_binding.param1 = binding->param2; + } + break; + default: + return -ENOTSUP; + } + + LOG_DBG("Sensor binding: %s", binding->behavior_dev); + + zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); + zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + + return ZMK_BEHAVIOR_OPAQUE; +} diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h new file mode 100644 index 00000000..2d58218d --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -0,0 +1,13 @@ + +#include + +struct behavior_sensor_rotate_config { + struct zmk_behavior_binding cw_binding; + struct zmk_behavior_binding ccw_binding; + int tap_ms; + bool override_params; +}; + +int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, + const struct device *sensor, + struct zmk_behavior_binding_event event); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c deleted file mode 100644 index 72e33ea4..00000000 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#define DT_DRV_COMPAT zmk_behavior_sensor_rotate_key_press - -#include -#include -#include - -#include -#include -#include - -LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); - -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - -static int behavior_sensor_rotate_key_press_init(const struct device *dev) { return 0; }; - -static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, uint32_t virtual_key_position, - int64_t timestamp) { - struct sensor_value value; - int err; - uint32_t keycode; - LOG_DBG("inc keycode 0x%02X dec keycode 0x%02X", binding->param1, binding->param2); - - err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); - - if (err) { - LOG_WRN("Failed to ge sensor rotation value: %d", err); - return err; - } - - switch (value.val1) { - case 1: - keycode = binding->param1; - break; - case -1: - keycode = binding->param2; - break; - default: - return -ENOTSUP; - } - - LOG_DBG("SEND %d", keycode); - - ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, true, timestamp)); - - // TODO: Better way to do this? - k_msleep(5); - - return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, false, timestamp)); -} - -static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_api = { - .sensor_binding_triggered = on_sensor_binding_triggered}; - -#define KP_INST(n) \ - DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_key_press_init, NULL, NULL, NULL, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ - &behavior_sensor_rotate_key_press_driver_api); - -DT_INST_FOREACH_STATUS_OKAY(KP_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c new file mode 100644 index 00000000..a82267a5 --- /dev/null +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_sensor_rotate_var + +#include + +#include + +#include "behavior_sensor_rotate_common.h" + +static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { + .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + +static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; + +#define SENSOR_ROTATE_VAR_INST(n) \ + static struct behavior_sensor_rotate_config behavior_sensor_rotate_var_config_##n = { \ + .cw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label)}, \ + .ccw_binding = {.behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label)}, \ + .tap_ms = DT_INST_PROP(n, tap_ms), \ + .override_params = true, \ + }; \ + DEVICE_DT_INST_DEFINE( \ + n, behavior_sensor_rotate_var_init, NULL, NULL, &behavior_sensor_rotate_var_config_##n, \ + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_var_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_VAR_INST) diff --git a/app/src/keymap.c b/app/src/keymap.c index 1f55ad03..909fd20d 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -270,8 +270,9 @@ int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sens continue; } - const uint32_t position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number); - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, position, timestamp); + struct zmk_behavior_binding_event event = { + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number), .timestamp = timestamp}; + ret = behavior_sensor_keymap_binding_triggered(binding, sensor, event); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); diff --git a/docs/docs/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md new file mode 100644 index 00000000..bd8a50bc --- /dev/null +++ b/docs/docs/behaviors/sensor-rotate.md @@ -0,0 +1,77 @@ +--- +title: Sensor Rotation +sidebar_label: Sensor Rotation +--- + +## Summary + +The Sensor Rotation behavior triggers a different behavior, depending on whether the sensor is rotated clockwise or counter-clockwise. Two variants of this behavior are available, allowing either fully specifying the +two behaviors and their parameters together, or allowing binding the sensor rotation with different clockwise and counterclockwise parameters in the keymap itself. + +## Sensor Rotation + +The standard sensor rotation behavior allows fully binding behaviors to be invoked: + +- If rotated counter-clockwise, the first bound behavior is triggered. +- If rotated clockwise, the second bound behavior is triggered. + +### Configuration + +Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/underglow.md) to change the RGB brightness: + +``` +/ { + behaviors { + rgb_encoder: rgb_encoder { + compatible = "zmk,behavior-sensor-rotate"; + label = "RGB_ENCODER"; + #sensor-binding-cells = <0>; + bindings = <&rgb_ug RGB_BRD>, <&rgb_ug RGB_BRI>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + base { + ... + sensor-bindings = <&rgb_encoder>; + } + }; +}; +``` + +## Variable Sensor Rotation + +The variable sensor rotation behavior is configured with two behaviors that each expect a single parameter, +allowing the sensor rotation instance to be bound with two parameters at usage time. + +- If rotated counter-clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. +- If rotated clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. + +### Configuration + +Here is an example, showing how send key presses on rotation: + +First, defining the sensor rotation itself, binding the [Key Press Behavior](/docs/behaviors/key-press.md) twice, then binding it in the `sensor-bindings` property of a keymap layer: + +``` +/ { + behaviors { + rot_kp: behavior_sensor_rotate_kp { + compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KP"; + #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + base { + ... + sensor-bindings = <&rot_kp PG_DN PG_UP>; + } + } +}; +``` diff --git a/docs/docs/features/encoders.md b/docs/docs/features/encoders.md index 225ee6f3..29906c90 100644 --- a/docs/docs/features/encoders.md +++ b/docs/docs/features/encoders.md @@ -23,17 +23,17 @@ Keyboards and macropads with encoder support will typically take the two EC11 pi ### Rotation -Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`, which is defined in each keymap layer in the following format: +Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`. See [Sensor Rotation](../behaviors/sensor-rotate.md) for customizing this behavior. ``` -sensor-bindings = ; +sensor-bindings = ; ``` -- `BINDING`, for now, has only one behavior available; `&inc_dec_kp` for key presses (see [Key Press](../behaviors/key-press.md) for details on available keycodes). +- `BINDING` is either a user-defined behavior, or `&inc_dec_kp` for key presses (see [Key Press](../behaviors/key-press.md) for details on available keycodes). - `CW_KEY` is the keycode activated by a clockwise turn. - `CCW_KEY` is the keycode activated by a counter-clockwise turn. -Additional encoders can be configured by adding more `BINDING CW_KEY CCW_KEY` sets immediately after the first. +Additional encoders can be configured by adding more bindings immediately after the first. As an example, a complete `sensor-bindings` for a Kyria with two encoders could look like: diff --git a/docs/sidebars.js b/docs/sidebars.js index a52f3302..21585747 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -35,6 +35,7 @@ module.exports = { "behaviors/tap-dance", "behaviors/caps-word", "behaviors/key-repeat", + "behaviors/sensor-rotate", "behaviors/reset", "behaviors/bluetooth", "behaviors/outputs", From 9d64c2a3a0bdd3d092585be1c6ba86fc8e26d084 Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Sat, 22 Apr 2023 20:14:08 -0400 Subject: [PATCH 330/494] fix(docs): switch sensor rotate parameter order --- docs/docs/behaviors/sensor-rotate.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/docs/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md index bd8a50bc..02e56924 100644 --- a/docs/docs/behaviors/sensor-rotate.md +++ b/docs/docs/behaviors/sensor-rotate.md @@ -12,8 +12,8 @@ two behaviors and their parameters together, or allowing binding the sensor rota The standard sensor rotation behavior allows fully binding behaviors to be invoked: -- If rotated counter-clockwise, the first bound behavior is triggered. -- If rotated clockwise, the second bound behavior is triggered. +- If rotated clockwise, the first bound behavior is triggered. +- If rotated counter-clockwise, the second bound behavior is triggered. ### Configuration @@ -26,7 +26,7 @@ Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/under compatible = "zmk,behavior-sensor-rotate"; label = "RGB_ENCODER"; #sensor-binding-cells = <0>; - bindings = <&rgb_ug RGB_BRD>, <&rgb_ug RGB_BRI>; + bindings = <&rgb_ug RGB_BRI>, <&rgb_ug RGB_BRD>; }; }; @@ -46,8 +46,8 @@ Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/under The variable sensor rotation behavior is configured with two behaviors that each expect a single parameter, allowing the sensor rotation instance to be bound with two parameters at usage time. -- If rotated counter-clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. -- If rotated clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. +- If rotated clockwise, the first bound behavior is triggered with the first parameter passed to the sensor rotation. +- If rotated counter-clockwise, the second bound behavior is triggered with the second parameter passed to the sensor rotation. ### Configuration @@ -70,7 +70,7 @@ First, defining the sensor rotation itself, binding the [Key Press Behavior](/do compatible = "zmk,keymap"; base { ... - sensor-bindings = <&rot_kp PG_DN PG_UP>; + sensor-bindings = <&rot_kp PG_UP PG_DN>; } } }; From 53dea223b73922e385ecf11883e5327a4f328eae Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 14 Jan 2023 12:01:33 -0500 Subject: [PATCH 331/494] feat(shields): Add splitkb.com Kyria Rev3. --- app/boards/shields/kyria/Kconfig.defconfig | 2 +- app/boards/shields/kyria/Kconfig.shield | 8 ++++ app/boards/shields/kyria/kyria_rev3.conf | 10 +++++ app/boards/shields/kyria/kyria_rev3.dtsi | 41 +++++++++++++++++++ app/boards/shields/kyria/kyria_rev3.keymap | 38 +++++++++++++++++ app/boards/shields/kyria/kyria_rev3.zmk.yml | 15 +++++++ .../shields/kyria/kyria_rev3_left.overlay | 29 +++++++++++++ .../shields/kyria/kyria_rev3_right.overlay | 33 +++++++++++++++ 8 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 app/boards/shields/kyria/kyria_rev3.conf create mode 100644 app/boards/shields/kyria/kyria_rev3.dtsi create mode 100644 app/boards/shields/kyria/kyria_rev3.keymap create mode 100644 app/boards/shields/kyria/kyria_rev3.zmk.yml create mode 100644 app/boards/shields/kyria/kyria_rev3_left.overlay create mode 100644 app/boards/shields/kyria/kyria_rev3_right.overlay diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index cdb57b6b..53b441cb 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -1,5 +1,5 @@ -if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT +if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT || SHIELD_KYRIA_REV3_LEFT config ZMK_KEYBOARD_NAME default "Kyria" diff --git a/app/boards/shields/kyria/Kconfig.shield b/app/boards/shields/kyria/Kconfig.shield index 6304f5d5..52df9378 100644 --- a/app/boards/shields/kyria/Kconfig.shield +++ b/app/boards/shields/kyria/Kconfig.shield @@ -19,3 +19,11 @@ config SHIELD_KYRIA_REV2_LEFT config SHIELD_KYRIA_REV2_RIGHT def_bool $(shields_list_contains,kyria_rev2_right) select SHIELD_KYRIA + +config SHIELD_KYRIA_REV3_LEFT + def_bool $(shields_list_contains,kyria_rev3_left) + select SHIELD_KYRIA + +config SHIELD_KYRIA_REV3_RIGHT + def_bool $(shields_list_contains,kyria_rev3_right) + select SHIELD_KYRIA diff --git a/app/boards/shields/kyria/kyria_rev3.conf b/app/boards/shields/kyria/kyria_rev3.conf new file mode 100644 index 00000000..7a0b5b6c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.conf @@ -0,0 +1,10 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the Kyria OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/kyria/kyria_rev3.dtsi b/app/boards/shields/kyria/kyria_rev3.dtsi new file mode 100644 index 00000000..4a500006 --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.dtsi @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_common.dtsi" + +/ { + chosen { + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | + // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | + // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | + // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) + >; + }; +}; + +&left_encoder { + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; +}; + +&right_encoder { + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; +}; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap new file mode 100644 index 00000000..fff2e051 --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +/* Uncomment this block if using RGB +&led_strip { + chain-length = <6>; + // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <25>; // Uncomment if using only per-key LEDs. +}; + */ + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | + // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; +}; diff --git a/app/boards/shields/kyria/kyria_rev3.zmk.yml b/app/boards/shields/kyria/kyria_rev3.zmk.yml new file mode 100644 index 00000000..bf84c82c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: kyria_rev3 +name: Kyria Rev3 +type: shield +url: https://splitkb.com/products/kyria-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - kyria_rev3_left + - kyria_rev3_right diff --git a/app/boards/shields/kyria/kyria_rev3_left.overlay b/app/boards/shields/kyria/kyria_rev3_left.overlay new file mode 100644 index 00000000..d00b9e4a --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3_left.overlay @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_rev3.dtsi" + +&kscan0 { + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; diff --git a/app/boards/shields/kyria/kyria_rev3_right.overlay b/app/boards/shields/kyria/kyria_rev3_right.overlay new file mode 100644 index 00000000..ee69730c --- /dev/null +++ b/app/boards/shields/kyria/kyria_rev3_right.overlay @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kyria_rev3.dtsi" + +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; From 9c4f1e02d14e2903d7ec377fc3042bb704cc7253 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Mon, 24 Apr 2023 16:24:36 +0800 Subject: [PATCH 332/494] fix(docs): Update references to QMK settings * Remove TAPPING_FORCE_HOLD reference * Remove IGNORE_MOD_TAP_INTERRUPT reference --- docs/docs/behaviors/hold-tap.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 1dfb8e5d..f267e4a4 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -49,8 +49,6 @@ Defines how long a key must be pressed to trigger Hold behavior. If you press a tapped hold-tap again within `quick-tap-ms` milliseconds, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). -In QMK, unlike ZMK, this functionality is enabled by default, and you turn it off using `TAPPING_FORCE_HOLD`. - #### `global-quick-tap` If `global-quick-tap` is enabled, then `quick-tap-ms` will apply not only when the given hold-tap is tapped, but for any key tapped before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. @@ -319,4 +317,4 @@ This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) ### Comparison to QMK -The hold-preferred flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The 'balanced' flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is similar to `IGNORE_MOD_TAP_INTERRUPT`. +The `hold-preferred` flavor works similar to the `HOLD_ON_OTHER_KEY_PRESS` setting in QMK. The `balanced` flavor is similar to the `PERMISSIVE_HOLD` setting, and the `tap-preferred` flavor is the QMK default. From 32ae776c42215d7302ab47787cbfb47298ccb532 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:16:36 -0500 Subject: [PATCH 333/494] refactor: Add more checks to pre-commit Updated existing pre-commit hooks and added some new hooks: - Remove trailing whitespace - Ensure every non-empty file ends with a new line - Check YAML file validity - Prevent adding large files - Ensure any scripts with shebangs are executable Added a GitHub action to run pre-commit on every commit. Removed any existing actions which duplicate pre-commit. Ran pre-commit on the codebase. --- .github/pull_request_template.md | 24 +++--- .github/workflows/build-user-config.yml | 4 +- .github/workflows/build.yml | 6 +- .github/workflows/clang-format-lint.yml | 29 ------- .github/workflows/doc-checks.yml | 10 --- .../hardware-metadata-validation.yml | 11 --- .github/workflows/pre-commit.yml | 15 ++++ .pre-commit-config.yaml | 12 ++- .vscode/settings.json | 2 +- app/.prettierrc.js | 2 +- .../bluemicro840/arduino_pro_micro_pins.dtsi | 10 +-- .../arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- .../corneish_zen/corneish_zen_v2_right.dts | 2 +- app/boards/arm/ferris/README.md | 1 - app/boards/arm/nice60/README.md | 2 + app/boards/arm/nice60/nice60.keymap | 4 +- app/boards/arm/pillbug/pillbug.dts | 2 +- app/boards/arm/preonic/preonic_rev3.yaml | 2 +- app/boards/arm/s40nc/README.md | 2 + app/boards/arm/s40nc/s40nc.keymap | 8 +- app/boards/shields/bfo9000/README.md | 8 +- .../boardsource5x12/boardsource5x12.keymap | 6 +- .../boardsource5x12/boardsource5x12.overlay | 2 +- app/boards/shields/chalice/chalice.keymap | 8 +- app/boards/shields/chalice/chalice.overlay | 4 +- app/boards/shields/clog/clog.dtsi | 2 +- app/boards/shields/corne/corne.dtsi | 2 +- app/boards/shields/eek/eek.keymap | 12 +-- app/boards/shields/eek/eek.overlay | 2 +- .../shields/elephant42/Kconfig.defconfig | 2 +- app/boards/shields/elephant42/elephant42.dtsi | 4 +- .../shields/elephant42/elephant42.keymap | 4 +- .../elephant42/elephant42_left.overlay | 2 +- .../elephant42/elephant42_right.overlay | 2 +- app/boards/shields/helix/helix.dtsi | 2 +- app/boards/shields/helix/helix.keymap | 4 +- app/boards/shields/helix/helix_left.overlay | 2 +- .../shields/hummingbird/hummingbird.overlay | 2 +- app/boards/shields/iris/Kconfig.defconfig | 2 +- app/boards/shields/iris/iris.dtsi | 2 +- app/boards/shields/jian/jian.dtsi | 2 +- app/boards/shields/jiran/jiran.dtsi | 2 +- app/boards/shields/jorne/Kconfig.defconfig | 2 +- app/boards/shields/jorne/jorne.dtsi | 2 +- app/boards/shields/kyria/Kconfig.defconfig | 2 +- app/boards/shields/kyria/kyria_common.dtsi | 2 +- app/boards/shields/leeloo/Kconfig.defconfig | 2 +- app/boards/shields/leeloo/README.md | 19 +++-- app/boards/shields/lily58/lily58.dtsi | 2 +- app/boards/shields/lotus58/Kconfig.defconfig | 2 +- app/boards/shields/lotus58/lotus58.dtsi | 2 +- app/boards/shields/lotus58/lotus58.keymap | 10 +-- .../shields/lotus58/lotus58_left.overlay | 2 +- app/boards/shields/microdox/Kconfig.defconfig | 2 +- app/boards/shields/microdox/microdox.dtsi | 2 +- app/boards/shields/murphpad/murphpad.keymap | 26 +++--- app/boards/shields/murphpad/murphpad.overlay | 2 +- app/boards/shields/naked60/naked60.keymap | 4 +- app/boards/shields/nibble/nibble.keymap | 2 +- app/boards/shields/nibble/nibble.overlay | 2 +- app/boards/shields/nice_view/README.md | 2 +- .../shields/nice_view_adapter/README.md | 2 +- app/boards/shields/pancake/pancake.keymap | 12 +-- app/boards/shields/pancake/pancake.overlay | 4 +- app/boards/shields/qaz/qaz.overlay | 2 +- .../shields/quefrency/Kconfig.defconfig | 4 +- app/boards/shields/quefrency/quefrency.dtsi | 10 +-- .../shields/quefrency/quefrency_right.overlay | 2 +- app/boards/shields/redox/redox.dtsi | 4 +- app/boards/shields/redox/redox.keymap | 4 +- app/boards/shields/snap/Kconfig.defconfig | 2 +- app/boards/shields/snap/snap.dtsi | 2 +- app/boards/shields/snap/snap.keymap | 2 +- app/boards/shields/snap/snap_left.overlay | 2 +- app/boards/shields/snap/snap_right.overlay | 2 +- app/boards/shields/sofle/Kconfig.defconfig | 2 +- .../splitkb_aurora_corne/Kconfig.defconfig | 2 +- .../splitkb_aurora_corne_left.overlay | 2 +- .../splitkb_aurora_corne_right.overlay | 2 +- .../splitkb_aurora_lily58/Kconfig.defconfig | 2 +- .../splitkb_aurora_lily58_left.overlay | 2 +- .../splitkb_aurora_lily58_right.overlay | 2 +- .../splitkb_aurora_sweep/Kconfig.defconfig | 2 +- .../splitkb_aurora_sweep.keymap | 52 ++++++------ .../splitkb_aurora_sweep_left.overlay | 2 +- .../splitkb_aurora_sweep_right.overlay | 2 +- .../shields/splitreus62/Kconfig.defconfig | 6 +- .../shields/splitreus62/splitreus62.dtsi | 2 +- .../splitreus62/splitreus62_right.overlay | 2 +- app/boards/shields/tg4x/README.md | 6 +- app/boards/shields/tg4x/tg4x.overlay | 2 +- app/boards/shields/tidbit/tidbit.keymap | 2 +- app/boards/shields/tidbit/tidbit_19key.keymap | 2 +- .../two_percent_milk/two_percent_milk.keymap | 4 +- .../shields/waterfowl/Kconfig.defconfig | 2 +- app/boards/shields/waterfowl/waterfowl.dtsi | 2 +- app/boards/shields/waterfowl/waterfowl.keymap | 12 +-- app/boards/shields/zmk_uno/zmk_uno.keymap | 8 +- app/boards/shields/zodiark/Kconfig.defconfig | 2 +- app/boards/shields/zodiark/zodiark.keymap | 2 +- app/core-coverage.yml | 64 +++++++-------- .../dts/bindings/gpio/maxim,max7318.yaml | 20 ++--- .../behaviors/zmk,behavior-macro.yaml | 2 +- .../behaviors/zmk,behavior-tap-dance.yaml | 2 +- .../bindings/display/gooddisplay,il0323.yaml | 82 +++++++++---------- .../macros/zmk,macro-control-mode-press.yaml | 2 +- .../zmk,macro-control-mode-release.yaml | 2 +- .../macros/zmk,macro-control-tap-time.yaml | 2 +- .../macros/zmk,macro-control-wait-time.yaml | 2 +- .../macros/zmk,macro-pause-for-release.yaml | 2 +- app/dts/bindings/zmk,combos.yaml | 2 +- app/include/linker/zmk-events.ld | 2 +- app/package.json | 4 +- app/src/activity.c | 4 +- app/src/display/widgets/Kconfig | 2 +- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 10 +-- .../layer-filter-0/native_posix_64.keymap | 26 +++--- .../layer-filter-1/native_posix_64.keymap | 6 +- .../multiple-timeouts/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 76 ++++++++--------- .../native_posix_64.keymap | 24 +++--- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 46 +++++------ .../native_posix_64.keymap | 8 +- .../press-release/native_posix_64.keymap | 26 +++--- .../press-timeout/native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 14 ++-- .../native_posix_64.keymap | 12 +-- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 18 ++-- .../native_posix_64.keymap | 6 +- .../balanced/1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-retro-tap/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../many-nested/native_posix_64.keymap | 16 ++-- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-retro-tap/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../6-nested-timeouts/native_posix_64.keymap | 10 +-- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../1-basic/native_posix_64.keymap | 4 +- .../1-dn-up/native_posix_64.keymap | 4 +- .../2-dn-timer-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 2 +- .../5-quick-tap/native_posix_64.keymap | 6 +- .../1-basic/native_posix_64.keymap | 4 +- .../kp-press-release/native_posix_64.keymap | 2 +- .../kt-alt-tab/native_posix_64.keymap | 18 ++-- .../kt-modded-alpha/native_posix_64.keymap | 10 +-- .../native_posix_64.keymap | 4 +- .../kt-press-release/native_posix_64.keymap | 4 +- app/tests/macros/basic/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- .../press-mid-macro/native_posix_64.keymap | 2 +- .../press-release/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../kp-lctl-dn-lctl-up/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 6 +- .../pending | 4 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../1-normal/native_posix_64.keymap | 6 +- .../native_posix_64.keymap | 6 +- .../3-covered/native_posix_64.keymap | 2 +- .../1-os-dn-up/native_posix_64.keymap | 4 +- .../10-callum-mods/native_posix_64.keymap | 12 +-- .../10-sl-sl-kp/native_posix_64.keymap | 16 ++-- .../native_posix_64.keymap | 10 +-- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 18 ++-- .../9-sk-dn-up-dn-up/native_posix_64.keymap | 6 +- .../tap-dance/1b-tap2/native_posix_64.keymap | 4 +- .../tap-dance/1c-tap3/native_posix_64.keymap | 4 +- .../tap-dance/2a-hold1/native_posix_64.keymap | 2 +- .../tap-dance/2b-hold2/native_posix_64.keymap | 4 +- .../tap-dance/2c-hold3/native_posix_64.keymap | 4 +- .../1-single_keypress/native_posix_64.keymap | 4 +- .../native_posix_64.keymap | 6 +- docs/package-lock.json | 17 ++-- docs/package.json | 2 +- docs/src/templates/setup.ps1.mustache | 4 +- docs/src/templates/setup.sh.mustache | 2 +- schema/hardware-metadata.schema.json | 32 ++------ 247 files changed, 759 insertions(+), 797 deletions(-) delete mode 100644 .github/workflows/clang-format-lint.yml create mode 100644 .github/workflows/pre-commit.yml diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9c3543dd..9e523a36 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,13 +1,15 @@ + ## Board/Shield Check-list - - [ ] This board/shield is tested working on real hardware - - [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) - - [ ] `.zmk.yml` metadata file added - - [ ] Proper Copyright + License headers added to applicable files (Generally, we stick to "The ZMK Contributors" for copyrights to help avoid churn when files get edited) - - [ ] General consistent formatting of DeviceTree files - - [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) - - [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable - - [ ] If split, no name added for the right/peripheral half - - [ ] Kconfig.defconfig file correctly wraps *all* configuration in conditional on the shield symbol - - [ ] `.conf` file has optional extra features commented out - - [ ] Keyboard/PCB is part of a shipped group buy or is generally available in stock to purchase (OSH/personal projects without general availability should create a zmk-config repo instead) + +- [ ] This board/shield is tested working on real hardware +- [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) +- [ ] `.zmk.yml` metadata file added +- [ ] Proper Copyright + License headers added to applicable files (Generally, we stick to "The ZMK Contributors" for copyrights to help avoid churn when files get edited) +- [ ] General consistent formatting of DeviceTree files +- [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) +- [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable +- [ ] If split, no name added for the right/peripheral half +- [ ] Kconfig.defconfig file correctly wraps _all_ configuration in conditional on the shield symbol +- [ ] `.conf` file has optional extra features commented out +- [ ] Keyboard/PCB is part of a shipped group buy or is generally available in stock to purchase (OSH/personal projects without general availability should create a zmk-config repo instead) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 3d89ed7b..b1e0602d 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -19,8 +19,8 @@ on: required: false type: string archive_name: - description: 'Archive output file name' - default: 'firmware' + description: "Archive output file name" + default: "firmware" required: false type: string diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f472f755..82b156e1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -131,7 +131,7 @@ jobs: for (const configuration of combinedUnique) { if (!perBoard[configuration.board]) perBoard[configuration.board] = []; - + perBoard[configuration.board].push({ shield: configuration.shield, 'cmake-args': configuration['cmake-args'], @@ -234,7 +234,7 @@ jobs: }; } } else if (hm.exposes) { - return hm.exposes.flatMap(i => + return hm.exposes.flatMap(i => metadata.interconnects[i].shields.flatMap(s => boardAndShield(hm, s)) ); } else { @@ -243,7 +243,7 @@ jobs: break; case "shield": if (hm.features && hm.features.includes("keys")) { - return hm.requires.flatMap(i => + return hm.requires.flatMap(i => metadata.interconnects[i].boards.flatMap(b => boardAndShield(b, hm)) ); } else { diff --git a/.github/workflows/clang-format-lint.yml b/.github/workflows/clang-format-lint.yml deleted file mode 100644 index 8c2cfbcf..00000000 --- a/.github/workflows/clang-format-lint.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Clang Format - -on: - push: - paths: - - ".github/workflows/clang-format-lint.yml" - - "app/boards/**/*.c" - - "app/include/**/*.h" - - "app/src/**" - - "app/drivers/**/*.c" - - "app/drivers/**/*.h" - pull_request: - paths: - - ".github/workflows/clang-format-lint.yml" - - "app/boards/**/*.c" - - "app/include/**/*.h" - - "app/src/**" - - "app/drivers/**/*.c" - - "app/drivers/**/*.h" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: DoozyX/clang-format-lint-action@v0.13 - with: - source: "./app" - extensions: "h,c" diff --git a/.github/workflows/doc-checks.yml b/.github/workflows/doc-checks.yml index d048a03e..91e65e6d 100644 --- a/.github/workflows/doc-checks.yml +++ b/.github/workflows/doc-checks.yml @@ -21,16 +21,6 @@ jobs: - name: ESLint run: npm run lint working-directory: docs - prettier: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: bahmutov/npm-install@v1 - with: - working-directory: docs - - name: Prettier check - run: npm run prettier:check - working-directory: docs typecheck: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/hardware-metadata-validation.yml b/.github/workflows/hardware-metadata-validation.yml index 4b10a28b..10092836 100644 --- a/.github/workflows/hardware-metadata-validation.yml +++ b/.github/workflows/hardware-metadata-validation.yml @@ -15,17 +15,6 @@ on: - "app/scripts/west_commands/metadata.py" jobs: - check-metadata-format: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/checkout@v3 - - uses: bahmutov/npm-install@v1 - with: - working-directory: app - - name: Prettier Check - run: npm run prettier:check - working-directory: app validate-metadata: runs-on: ubuntu-latest container: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 00000000..a6583d4f --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,15 @@ +name: pre-commit + +on: + pull_request: + push: + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: 3.x + - uses: pre-commit/action@v3.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02adf09c..7687fc6e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,12 +1,20 @@ fail_fast: false repos: - repo: https://github.com/pocc/pre-commit-hooks - rev: v1.1.1 + rev: v1.3.5 hooks: - id: clang-format args: - -i - repo: https://github.com/pre-commit/mirrors-prettier - rev: v2.2.1 + rev: v2.7.1 hooks: - id: prettier + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: check-added-large-files + - id: check-shebang-scripts-are-executable + exclude: "\\.mustache$" diff --git a/.vscode/settings.json b/.vscode/settings.json index 2730549a..aea29cf0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,4 +4,4 @@ "*.keymap": "dts" }, "python.formatting.provider": "black" -} \ No newline at end of file +} diff --git a/app/.prettierrc.js b/app/.prettierrc.js index 806328d9..2a1f0b48 100644 --- a/app/.prettierrc.js +++ b/app/.prettierrc.js @@ -1,3 +1,3 @@ module.exports = { - endOfLine: "auto", + endOfLine: "auto", }; diff --git a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi index 237f5c45..53514d64 100644 --- a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi @@ -11,11 +11,11 @@ gpio-map-mask = <0xffffffff 0xffffffc0>; gpio-map-pass-thru = <0 0x3f>; gpio-map - = <0 0 &gpio0 8 0> /* D0 D2 */ - , <1 0 &gpio0 6 0> /* D1 D3*/ - , <2 0 &gpio0 15 0> /* D2 D1*/ - , <3 0 &gpio0 17 0> /* D3 D0*/ - , <4 0 &gpio0 20 0> /* D4/A6 D4*/ + = <0 0 &gpio0 8 0> /* D0 D2 */ + , <1 0 &gpio0 6 0> /* D1 D3*/ + , <2 0 &gpio0 15 0> /* D2 D1*/ + , <3 0 &gpio0 17 0> /* D3 D0*/ + , <4 0 &gpio0 20 0> /* D4/A6 D4*/ , <5 0 &gpio0 13 0> /* D5 C6*/ , <6 0 &gpio0 24 0> /* D6/A7 D7*/ , <7 0 &gpio0 9 0> /* D7 E6*/ diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 4dbdaef5..65092dc5 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -32,7 +32,7 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> , <&gpio0 5 GPIO_ACTIVE_HIGH> - ; + ; }; leds { diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 52439e4f..980c9900 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -33,7 +33,7 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> ; - + }; leds { diff --git a/app/boards/arm/ferris/README.md b/app/boards/arm/ferris/README.md index 2793c6fa..b6fdcdf2 100644 --- a/app/boards/arm/ferris/README.md +++ b/app/boards/arm/ferris/README.md @@ -1,6 +1,5 @@ # Building ZMK for the Ferris 0.2 - ## Standard Build ``` diff --git a/app/boards/arm/nice60/README.md b/app/boards/arm/nice60/README.md index 49433df8..dce230ae 100644 --- a/app/boards/arm/nice60/README.md +++ b/app/boards/arm/nice60/README.md @@ -1,9 +1,11 @@ # nice!60 + ![nice!60](https://i.imgur.com/0YWv5PE.png) The nice!60 is a hotswap 60% made by Nice Keyboards. https://nicekeyboards.com/nice-60 ## Building nice!60 ZMK firmware + ``` west build -p -b nice60 ``` diff --git a/app/boards/arm/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap index bdb188df..edfec32e 100644 --- a/app/boards/arm/nice60/nice60.keymap +++ b/app/boards/arm/nice60/nice60.keymap @@ -12,7 +12,7 @@ / { keymap { compatible = "zmk,keymap"; - + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | @@ -40,7 +40,7 @@ // ------------------------------------------------------------------------------------------------ bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR - &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans + &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL diff --git a/app/boards/arm/pillbug/pillbug.dts b/app/boards/arm/pillbug/pillbug.dts index c1330319..a2e56df3 100644 --- a/app/boards/arm/pillbug/pillbug.dts +++ b/app/boards/arm/pillbug/pillbug.dts @@ -29,7 +29,7 @@ label = "Blue LED"; }; }; - + ext-power { compatible = "zmk,ext-power-generic"; label = "EXT_POWER"; diff --git a/app/boards/arm/preonic/preonic_rev3.yaml b/app/boards/arm/preonic/preonic_rev3.yaml index 679e1464..861f1d2d 100644 --- a/app/boards/arm/preonic/preonic_rev3.yaml +++ b/app/boards/arm/preonic/preonic_rev3.yaml @@ -16,4 +16,4 @@ supported: - lsm303dlhc - nvs - can - - kscan \ No newline at end of file + - kscan diff --git a/app/boards/arm/s40nc/README.md b/app/boards/arm/s40nc/README.md index 32db57e9..96bebb33 100644 --- a/app/boards/arm/s40nc/README.md +++ b/app/boards/arm/s40nc/README.md @@ -1,9 +1,11 @@ # S40NC + ![S40NC](https://i.imgur.com/fk8587n.jpg) Shorty40NoCordy (S40NC) is a limited run 40% bluetooth keyboard originally made and sold by MechWild. ## Building S40NC ZMK firmware + ``` west build -p -b s40nc ``` diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index c43bc671..f0e60e7d 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -17,7 +17,7 @@ / { keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC @@ -35,7 +35,7 @@ &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END >; }; - + raise_layer { bindings = < &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &trans @@ -44,7 +44,7 @@ &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END >; }; - + control_layer { bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP @@ -55,4 +55,4 @@ }; }; }; - + diff --git a/app/boards/shields/bfo9000/README.md b/app/boards/shields/bfo9000/README.md index 1e91fdcf..54893aed 100644 --- a/app/boards/shields/bfo9000/README.md +++ b/app/boards/shields/bfo9000/README.md @@ -4,10 +4,10 @@ Customizable full-size split ortholinear. ## Features -* Compatible with MX-compatible, Alps-compatible, and Kailh Low-Profile Choc switches. -* Breakoff pieces to allow for 4 to 6 rows and 7 to 9 columns. -* RGB LED connections +- Compatible with MX-compatible, Alps-compatible, and Kailh Low-Profile Choc switches. +- Breakoff pieces to allow for 4 to 6 rows and 7 to 9 columns. +- RGB LED connections ## Hardware Notes -[Included default keymap](http://www.keyboard-layout-editor.com/#/gists/51293c31afcd5f1765e8f413a46bfcf8) \ No newline at end of file +[Included default keymap](http://www.keyboard-layout-editor.com/#/gists/51293c31afcd5f1765e8f413a46bfcf8) diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.keymap b/app/boards/shields/boardsource5x12/boardsource5x12.keymap index 8956ca98..cb851c35 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.keymap +++ b/app/boards/shields/boardsource5x12/boardsource5x12.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include @@ -28,7 +28,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LSHFT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET - &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; }; @@ -44,7 +44,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(NON_US_HASH) &kp LS(NON_US_BSLH) &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE >; }; diff --git a/app/boards/shields/boardsource5x12/boardsource5x12.overlay b/app/boards/shields/boardsource5x12/boardsource5x12.overlay index 0fafe8a1..080a2392 100644 --- a/app/boards/shields/boardsource5x12/boardsource5x12.overlay +++ b/app/boards/shields/boardsource5x12/boardsource5x12.overlay @@ -39,4 +39,4 @@ , <&pro_micro 6 GPIO_ACTIVE_HIGH> ; }; -}; \ No newline at end of file +}; \ No newline at end of file diff --git a/app/boards/shields/chalice/chalice.keymap b/app/boards/shields/chalice/chalice.keymap index cba93d03..c72e3ee1 100644 --- a/app/boards/shields/chalice/chalice.keymap +++ b/app/boards/shields/chalice/chalice.keymap @@ -19,9 +19,9 @@ bindings = < &kp ESC &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp INSERT &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp DELETE &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER + &kp DELETE &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP - &kp LCTRL &kp LALT &kp SPACE &mo 1 &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + &kp LCTRL &kp LALT &kp SPACE &mo 1 &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT >; }; @@ -30,9 +30,9 @@ bindings = < &bootloader &out OUT_TOG &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &bt BT_CLR &rgb_ug RGB_TOG &rgb_ug RGB_HUD &rgb_ug RGB_HUI &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &bt BT_SEL 0 &rgb_ug RGB_EFF &rgb_ug RGB_SAD &rgb_ug RGB_SAI &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &bt BT_SEL 0 &rgb_ug RGB_EFF &rgb_ug RGB_SAD &rgb_ug RGB_SAI &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_SEL 1 &rgb_ug RGB_EFR &rgb_ug RGB_BRD &rgb_ug RGB_BRI &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp PG_UP - &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp END + &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp END >; }; }; diff --git a/app/boards/shields/chalice/chalice.overlay b/app/boards/shields/chalice/chalice.overlay index 34cbd34e..6778588b 100644 --- a/app/boards/shields/chalice/chalice.overlay +++ b/app/boards/shields/chalice/chalice.overlay @@ -21,7 +21,7 @@ map = < RC(0,0) RC(1,0) RC(0,1) RC(1,1) RC(0,2) RC(1,2) RC(0,3) RC(1,3) RC(0,4) RC(1,4) RC(0,5) RC(1,5) RC(0,6) RC(1,6) RC(4,6) RC(2,0) RC(3,0) RC(2,1) RC(3,1) RC(2,2) RC(3,2) RC(2,3) RC(3,3) RC(2,4) RC(3,4) RC(2,5) RC(3,5) RC(2,6) RC(3,6) RC(5,6) - RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) + RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) RC(6,0) RC(7,0) RC(6,1) RC(7,1) RC(6,2) RC(7,2) RC(6,3) RC(7,3) RC(6,4) RC(7,4) RC(6,5) RC(7,5) RC(8,6) RC(9,6) RC(8,0) RC(9,1) RC(8,2) RC(9,2) RC(8,3) RC(9,3) RC(8,4) RC(9,4) RC(8,5) RC(9,5) >; @@ -35,7 +35,7 @@ map = < RC(0,0) RC(1,0) RC(0,1) RC(1,1) RC(0,2) RC(1,2) RC(0,3) RC(1,3) RC(0,4) RC(1,4) RC(0,5) RC(1,5) RC(0,6) RC(1,6) RC(4,6) RC(8,1) RC(2,0) RC(3,0) RC(2,1) RC(3,1) RC(2,2) RC(3,2) RC(2,3) RC(3,3) RC(2,4) RC(3,4) RC(2,5) RC(3,5) RC(2,6) RC(3,6) RC(5,6) - RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) + RC(4,0) RC(5,0) RC(4,1) RC(5,1) RC(4,2) RC(5,2) RC(4,3) RC(5,3) RC(4,4) RC(5,4) RC(4,5) RC(5,5) RC(6,6) RC(7,6) RC(6,0) RC(7,0) RC(6,1) RC(7,1) RC(6,2) RC(7,2) RC(6,3) RC(7,3) RC(6,4) RC(7,4) RC(6,5) RC(7,5) RC(8,6) RC(9,6) RC(8,0) RC(9,1) RC(8,2) RC(9,2) RC(8,3) RC(9,3) RC(8,4) RC(9,4) RC(8,5) RC(9,5) >; diff --git a/app/boards/shields/clog/clog.dtsi b/app/boards/shields/clog/clog.dtsi index 27943100..ccad150c 100644 --- a/app/boards/shields/clog/clog.dtsi +++ b/app/boards/shields/clog/clog.dtsi @@ -27,7 +27,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; label = "KSCAN"; - + input-gpios = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index e81afcf8..a9c1c287 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -56,7 +56,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/eek/eek.keymap b/app/boards/shields/eek/eek.keymap index d250cb01..74ecc407 100644 --- a/app/boards/shields/eek/eek.keymap +++ b/app/boards/shields/eek/eek.keymap @@ -15,9 +15,9 @@ default { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// Q | W | E | R | T | | Y | U | I | O | P | -// A | S | D | F | G | | H | J | K | L | ; | -// Lsft/Z| X | C | V | B | | N | M | , | . |Rsft//| +// Q | W | E | R | T | | Y | U | I | O | P | +// A | S | D | F | G | | H | J | K | L | ; | +// Lsft/Z| X | C | V | B | | N | M | , | . |Rsft//| // | LCTL | Bspc/LMOD | SPC | | Del/Num | Ent | Sym | bindings = < &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P @@ -28,7 +28,7 @@ }; numbers { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | +// 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | // TAB | BT_PRV | BT_NXT | VOL-| VOL+| | < | v | ∧ | > | ' | // Lsft| BT_SEL0| BT_CLR | MUTE| | | HOME| END | PGUP| PGDN| Rsft| // | LCTL | LMOD| LALT | | Num | | BL-reset | @@ -41,8 +41,8 @@ }; symbols { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- -// ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | -// CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | +// ESC | F1 | F2 | F3 | F4 | | OUT_USB | OUT_BLE | | = | - | +// CAPS| F5 | F6 | F7 | F8 | | [ | ] | | ` | \ | // LSFT| F9 | F10 | F11 | F12 | | | | | | RSFT | // | LCTL | LMOD| LALT | | RESET | | SYM | bindings = < diff --git a/app/boards/shields/eek/eek.overlay b/app/boards/shields/eek/eek.overlay index 3f830f07..f53c6b5b 100644 --- a/app/boards/shields/eek/eek.overlay +++ b/app/boards/shields/eek/eek.overlay @@ -20,7 +20,7 @@ RC(0,9) RC(0,8) RC(0,7) RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(1,9) RC(1,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(2,9) RC(2,8) RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) - RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) + RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) >; }; diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index e507f2c6..55ee6c87 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_ELEPHANT42_LEFT || SHIELD_ELEPHANT42_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi index e2b708ca..2d3f5166 100644 --- a/app/boards/shields/elephant42/elephant42.dtsi +++ b/app/boards/shields/elephant42/elephant42.dtsi @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include / { @@ -36,7 +36,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - }; + }; }; &pro_micro_i2c { diff --git a/app/boards/shields/elephant42/elephant42.keymap b/app/boards/shields/elephant42/elephant42.keymap index 8594c117..62484728 100644 --- a/app/boards/shields/elephant42/elephant42.keymap +++ b/app/boards/shields/elephant42/elephant42.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include @@ -19,7 +19,7 @@ default_layer { bindings = < - < ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL + < ADJT ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp DEL &mt LCTRL TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp LSHFT &mo LOWR &kp LGUI &kp BSPC &kp SPACE &kp ENTER &mo RAIS &kp LALT diff --git a/app/boards/shields/elephant42/elephant42_left.overlay b/app/boards/shields/elephant42/elephant42_left.overlay index 72fe2251..10473438 100644 --- a/app/boards/shields/elephant42/elephant42_left.overlay +++ b/app/boards/shields/elephant42/elephant42_left.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "elephant42.dtsi" &kscan0 { diff --git a/app/boards/shields/elephant42/elephant42_right.overlay b/app/boards/shields/elephant42/elephant42_right.overlay index 35bd5895..c8f69a04 100644 --- a/app/boards/shields/elephant42/elephant42_right.overlay +++ b/app/boards/shields/elephant42/elephant42_right.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "elephant42.dtsi" &default_transform { diff --git a/app/boards/shields/helix/helix.dtsi b/app/boards/shields/helix/helix.dtsi index 45457560..bbaec636 100644 --- a/app/boards/shields/helix/helix.dtsi +++ b/app/boards/shields/helix/helix.dtsi @@ -42,6 +42,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9 , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; \ No newline at end of file diff --git a/app/boards/shields/helix/helix.keymap b/app/boards/shields/helix/helix.keymap index 82327c32..80678fe6 100644 --- a/app/boards/shields/helix/helix.keymap +++ b/app/boards/shields/helix/helix.keymap @@ -23,7 +23,7 @@ As such, those are in use within the default layer at this time.*/ / { keymap { compatible = "zmk,keymap"; - + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | @@ -78,7 +78,7 @@ As such, those are in use within the default layer at this time.*/ // | | | | | | | | | | | | | | | | bindings = < &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &ext_power EP_TOG - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &bt BT_NXT &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &trans &rgb_ug RGB_EFR &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_SPD &rgb_ug RGB_BRD &trans &bt BT_PRV &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans diff --git a/app/boards/shields/helix/helix_left.overlay b/app/boards/shields/helix/helix_left.overlay index 5b0c7623..2a7ac805 100644 --- a/app/boards/shields/helix/helix_left.overlay +++ b/app/boards/shields/helix/helix_left.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "helix.dtsi" &kscan0 { diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 4af9cbdf..0c48c128 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -49,7 +49,7 @@ , <&xiao_d 5 GPIO_ACTIVE_HIGH> ; }; - + }; &xiao_spi { status = "disabled"; }; diff --git a/app/boards/shields/iris/Kconfig.defconfig b/app/boards/shields/iris/Kconfig.defconfig index 972884db..83331d10 100644 --- a/app/boards/shields/iris/Kconfig.defconfig +++ b/app/boards/shields/iris/Kconfig.defconfig @@ -15,5 +15,5 @@ if SHIELD_IRIS_LEFT || SHIELD_IRIS_RIGHT config ZMK_SPLIT default y - + endif \ No newline at end of file diff --git a/app/boards/shields/iris/iris.dtsi b/app/boards/shields/iris/iris.dtsi index 24099f61..0e976f86 100644 --- a/app/boards/shields/iris/iris.dtsi +++ b/app/boards/shields/iris/iris.dtsi @@ -42,6 +42,6 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; \ No newline at end of file diff --git a/app/boards/shields/jian/jian.dtsi b/app/boards/shields/jian/jian.dtsi index 34c0298e..2b1eb391 100644 --- a/app/boards/shields/jian/jian.dtsi +++ b/app/boards/shields/jian/jian.dtsi @@ -71,6 +71,6 @@ , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/jiran/jiran.dtsi b/app/boards/shields/jiran/jiran.dtsi index 5dfaa46b..f0727dd4 100644 --- a/app/boards/shields/jiran/jiran.dtsi +++ b/app/boards/shields/jiran/jiran.dtsi @@ -77,6 +77,6 @@ , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 4664debf..775bb56a 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_JORNE_LEFT || SHIELD_JORNE_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index 6f43393d..bb862b8d 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -72,7 +72,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 53b441cb..82f48b4c 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_KYRIA config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index c52ab05a..1e61cc6b 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -17,7 +17,7 @@ compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; }; left_encoder: encoder_left { diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index 36306757..d5bfab3d 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT diff --git a/app/boards/shields/leeloo/README.md b/app/boards/shields/leeloo/README.md index 35e04994..a807843f 100644 --- a/app/boards/shields/leeloo/README.md +++ b/app/boards/shields/leeloo/README.md @@ -6,20 +6,22 @@ Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca) GitHub: [ClicketySplit](https://github.com/ClicketySplit) Hardware Supported: Pro Micro, Elite-C, nice!nano v2 -Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. +Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. Leeloo has been designed from scratch; everything from the schematic to its PCB footprints, and column stagger. There are some subtle differences that may not be apparent; however, its subtle changes enable an interesting future. Features: -* 4x6x5m Split Keyboard -* Support for MX/Box or Low Profile Choc switches. -* 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. -* Support for 128x32 OLED Displays. -* The option to select one of three positions for an EC11 rotary encoder on each half. -* Support for Alps Alpine Micro Switch -* Support for 3.7v 301230 LiPo Battery + +- 4x6x5m Split Keyboard +- Support for MX/Box or Low Profile Choc switches. +- 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. +- Support for 128x32 OLED Displays. +- The option to select one of three positions for an EC11 rotary encoder on each half. +- Support for Alps Alpine Micro Switch +- Support for 3.7v 301230 LiPo Battery # Building Your Firmware + ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/) Installation: [Installing ZMK](https://zmk.dev/docs/user-setup) Customization: [Customizing ZMK](https://zmk.dev/docs/customization) @@ -36,6 +38,7 @@ Build command for your custom keymap of Leeloo: west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" # Support + If you have any questions with regards to Leeloo, please [Contact Us](https://clicketysplit.ca/pages/contact-us). Clickety Split diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 4efa1069..1a296a8c 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -43,7 +43,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; left_encoder: encoder_left { diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index 56eef359..b6bb37d8 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_LOTUS58_LEFT || SHIELD_LOTUS58_RIGHT diff --git a/app/boards/shields/lotus58/lotus58.dtsi b/app/boards/shields/lotus58/lotus58.dtsi index 1df0bf38..e24d75e7 100644 --- a/app/boards/shields/lotus58/lotus58.dtsi +++ b/app/boards/shields/lotus58/lotus58.dtsi @@ -27,7 +27,7 @@ RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7 RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(4,0) RC(4,11) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) + RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) >; }; diff --git a/app/boards/shields/lotus58/lotus58.keymap b/app/boards/shields/lotus58/lotus58.keymap index 50249146..fae463c9 100644 --- a/app/boards/shields/lotus58/lotus58.keymap +++ b/app/boards/shields/lotus58/lotus58.keymap @@ -17,7 +17,7 @@ key-positions = <24 52>; layers = <0>; bindings = <&kp LGUI>; - }; + }; }; behaviors { @@ -59,7 +59,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp LSHFT &kp A &sleft &kp D &fright &kp G &sys_reset &sys_reset &kp H &kp J &kp K &kp L &kp SEMI &mt RSHFT SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &kp C_PP &kp N &kp M &kp COMMA &kp DOT &kp FSLH &mt RCTRL BSLH - < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI + < 2 RET &kp LALT &kp SPACE < 1 DEL < 2 RET &kp BSPC < 1 RBKT &kp LGUI >; sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP &inc_dec_kp PG_UP PG_DN>; @@ -71,7 +71,7 @@ // | | ! | HOME| ^ | END | % | | VOL^ | PGUP | INS | ^ | PSCR | - | // | | # | <- | v | -> | $ | | | | VOLv | <- | ^ | -> | ~ | _ | // | | @ | - | ( | ) | & | | | | MUTE | PGDN | v | : | * | | | -// | F11 | | | | | | | | F12 | +// | F11 | | | | | | | | F12 | bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp PLUS &trans &kp EXCL &kp HOME &kp UP &kp END &kp PRCNT &kp C_VOL_UP &kp PG_UP &kp INS &kp CARET &kp PSCRN &kp MINUS @@ -89,13 +89,13 @@ // | | INS | PSCR | GUI | RESET | | | PGUP | | ^ | | | | // | | ALT | CTRL | SHIFT | FLASH | CAPS | | | | PGDN | <- | v | -> | DEL | BSPC | // | | UNDO | CUT | COPY | PASTE | | | | | | |> | <|<| | |>|> | | | -// | | | | | | | | | | +// | | | | | | | | | | bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &sys_reset &bootloader &trans &kp INS &kp PSCRN &kp K_CMENU &sys_reset &trans &kp PG_UP &trans &kp UP &trans &trans &trans &trans &kp LALT &kp LCTRL &kp LSHFT &bootloader &kp CLCK &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC &trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &kp C_PP &kp C_PREV &kp C_NEXT &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP &inc_dec_kp PG_UP PG_DN>; diff --git a/app/boards/shields/lotus58/lotus58_left.overlay b/app/boards/shields/lotus58/lotus58_left.overlay index 9755ae0b..a51659df 100644 --- a/app/boards/shields/lotus58/lotus58_left.overlay +++ b/app/boards/shields/lotus58/lotus58_left.overlay @@ -8,7 +8,7 @@ &kscan0 { col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> + = <&pro_micro 15 GPIO_ACTIVE_HIGH> , <&pro_micro 16 GPIO_ACTIVE_HIGH> , <&pro_micro 14 GPIO_ACTIVE_HIGH> , <&pro_micro 10 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 28f8c811..8c0b042e 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index b8d47b2a..e3fabb3e 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -40,7 +40,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index 2e8c6f6e..ccdff9f7 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -44,7 +44,7 @@ bindings = <&bt BT_NXT>; }; }; - + sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1 &encoder_2>; @@ -57,29 +57,29 @@ default_layer { label = "default layer"; bindings = < - &bt BT_CLR &kp TAB &kp F5 &kp LC(LA(C)) &kp LG(D) - &rgb_ug RGB_TOG &kp ESC &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS - &rgb_ug RGB_EFF &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS + &bt BT_CLR &kp TAB &kp F5 &kp LC(LA(C)) &kp LG(D) + &rgb_ug RGB_TOG &kp ESC &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS + &rgb_ug RGB_EFF &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_PLUS &kp C_MUTE &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans &mo 1 &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &kp BSPC &kp KP_N0 &trans &kp KP_DOT &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - + }; + fn_layer { label = "fn layer"; bindings = < - &trans &trans &trans &trans &trans - &trans &kp KP_NUM &trans &trans &trans - &trans &trans &trans &trans &trans - &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp DEL &trans &trans &trans &trans - >; + &trans &kp KP_NUM &trans &trans &trans + &trans &trans &trans &trans &trans + &bt BT_CLR &trans &trans &trans &trans + &trans &trans &trans &trans &trans + &kp DEL &trans &trans &trans &trans + >; sensor-bindings = <&inc_dec_kp PG_UP PG_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; - + }; }; }; \ No newline at end of file diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index c66f2aef..b7fead60 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -42,7 +42,7 @@ resolution = <4>; status = "disabled"; }; - + encoder_2: encoder_2 { compatible = "alps,ec11"; label = "Encoder 2"; diff --git a/app/boards/shields/naked60/naked60.keymap b/app/boards/shields/naked60/naked60.keymap index d380a599..1c212cd4 100644 --- a/app/boards/shields/naked60/naked60.keymap +++ b/app/boards/shields/naked60/naked60.keymap @@ -28,7 +28,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LSHFT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET - &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT >; }; @@ -44,7 +44,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(NON_US_HASH) &kp LS(NON_US_BSLH) &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE >; }; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index 23c796ea..c02aad75 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -32,7 +32,7 @@ }; function_layer { label = "Function"; - + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; bindings = < diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index 13f2c2fe..baf1eb10 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -51,7 +51,7 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) RC(3,0) RC(3,1) RC(0,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) RC(3,15) -RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) +RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) >; }; }; diff --git a/app/boards/shields/nice_view/README.md b/app/boards/shields/nice_view/README.md index 0b4ac21f..e3dffa34 100644 --- a/app/boards/shields/nice_view/README.md +++ b/app/boards/shields/nice_view/README.md @@ -2,4 +2,4 @@ The nice!view is a low power, high refresh rate display meant to replace I2C OLEDs traditionally used. -This shield requires that an `&nice_view_spi` labelled SPI bus is provided with *at least* MOSI, SCK, and CS pins defined. +This shield requires that an `&nice_view_spi` labelled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. diff --git a/app/boards/shields/nice_view_adapter/README.md b/app/boards/shields/nice_view_adapter/README.md index ec4665a3..fe0a6f07 100644 --- a/app/boards/shields/nice_view_adapter/README.md +++ b/app/boards/shields/nice_view_adapter/README.md @@ -2,7 +2,7 @@ This shield is used as an adapter between the nice!view and existing shields/boards that expose an I2C OLED header. -To use this shield, you should add this shield to your list of shields *before* `nice_view`. +To use this shield, you should add this shield to your list of shields _before_ `nice_view`. The nice!view will use the SDA/SCL pins of the OLED, and then the adapter expects a final pin to be "bodged" from your microcontroller to the nice!view CS pin. This adapter assumes that the CS pin bodged is the `&pro_micro 1` pin or "D1", which is the top left pin when looking at the front of the board. If you can't use this pin, you'll need to override the `cs-gpios` for the `&nice_view_spi` bus (in your `zmk-config` keymap for example) or you will want to define your own `&nice_view_spi` bus without using this adapter. diff --git a/app/boards/shields/pancake/pancake.keymap b/app/boards/shields/pancake/pancake.keymap index 99f2aaff..e5ca4372 100644 --- a/app/boards/shields/pancake/pancake.keymap +++ b/app/boards/shields/pancake/pancake.keymap @@ -20,7 +20,7 @@ default_layer { bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT &kp SEMI &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp UP &kp ENTER &kp LCTRL &kp LALT &kp LGUI &mo FNC &mo LWR &kp SPACE &kp SPACE &mo RSE &kp SLASH &kp LEFT &kp DOWN &kp RIGHT @@ -32,7 +32,7 @@ &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &kp C_VOL_UP &trans - &trans &trans &trans &trans &trans &trans &trans &trans &kp QMARK &trans &kp C_VOL_DN &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp QMARK &trans &kp C_VOL_DN &trans >; }; @@ -41,8 +41,8 @@ &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &trans &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans &kp LBKT &kp RBKT &kp C_VOL_UP &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_DN &trans - >; + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_DN &trans + >; }; function_layer { @@ -50,8 +50,8 @@ &bootloader &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp F11 &kp F12 &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans - &out OUT_BLE &out OUT_USB &out OUT_TOG &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; + &out OUT_BLE &out OUT_USB &out OUT_TOG &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; }; }; }; diff --git a/app/boards/shields/pancake/pancake.overlay b/app/boards/shields/pancake/pancake.overlay index 53e8c8c1..6fae463f 100644 --- a/app/boards/shields/pancake/pancake.overlay +++ b/app/boards/shields/pancake/pancake.overlay @@ -14,7 +14,7 @@ label = "KSCAN"; diode-direction = "col2row"; - col-gpios + col-gpios = <&pro_micro 21 GPIO_ACTIVE_HIGH> , <&pro_micro 20 GPIO_ACTIVE_HIGH> , <&pro_micro 19 GPIO_ACTIVE_HIGH> @@ -28,7 +28,7 @@ , <&pro_micro 3 GPIO_ACTIVE_HIGH> , <&pro_micro 2 GPIO_ACTIVE_HIGH> ; - + row-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> diff --git a/app/boards/shields/qaz/qaz.overlay b/app/boards/shields/qaz/qaz.overlay index 098c9f02..76ee5ba7 100644 --- a/app/boards/shields/qaz/qaz.overlay +++ b/app/boards/shields/qaz/qaz.overlay @@ -49,5 +49,5 @@ , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; }; - + }; \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.defconfig b/app/boards/shields/quefrency/Kconfig.defconfig index 9e51c2bc..28e46a56 100644 --- a/app/boards/shields/quefrency/Kconfig.defconfig +++ b/app/boards/shields/quefrency/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT - - + + if SHIELD_QUEFRENCY_LEFT config ZMK_KEYBOARD_NAME diff --git a/app/boards/shields/quefrency/quefrency.dtsi b/app/boards/shields/quefrency/quefrency.dtsi index 411d3658..c9cb7d43 100644 --- a/app/boards/shields/quefrency/quefrency.dtsi +++ b/app/boards/shields/quefrency/quefrency.dtsi @@ -13,7 +13,7 @@ zmk,matrix_transform = &default_transform; }; - /* + /* * This transform correspondsto the 60% left without macro keypad and 65% right, even this * combination of PCBs can have keys in different locations based on configuration. */ @@ -22,11 +22,11 @@ columns = <15>; rows = <6>; map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(5,14) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) -RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) -RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) +RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) +RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) >; }; }; diff --git a/app/boards/shields/quefrency/quefrency_right.overlay b/app/boards/shields/quefrency/quefrency_right.overlay index 8e42d555..bf97d34b 100644 --- a/app/boards/shields/quefrency/quefrency_right.overlay +++ b/app/boards/shields/quefrency/quefrency_right.overlay @@ -12,7 +12,7 @@ / { - /* This kscan is for the 65% right half the 60% right half + /* This kscan is for the 65% right half the 60% right half * may require different column and row pins */ kscan0: kscan { diff --git a/app/boards/shields/redox/redox.dtsi b/app/boards/shields/redox/redox.dtsi index 4825a39f..9c0705a6 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include / { @@ -42,7 +42,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; }; diff --git a/app/boards/shields/redox/redox.keymap b/app/boards/shields/redox/redox.keymap index a45595ff..c88f703b 100644 --- a/app/boards/shields/redox/redox.keymap +++ b/app/boards/shields/redox/redox.keymap @@ -30,7 +30,7 @@ >; }; - + lower_layer { // -------------------------------------------------------------------------------------------------------------------------- // | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | DEL | @@ -62,7 +62,7 @@ &trans &trans &trans &mo 3 &trans &mo 3 &trans &trans &trans &trans &trans &trans &trans &trans >; }; - + adjust_layer { // ----------------------------------------------------------------------------------------- // | F1 | F2 | F3 | F4 | F5 | F6 | --- | F7 | F8 | F9 | F10 | F11 | F12 | diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index fa02421a..c4a67e65 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -15,7 +15,7 @@ if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index 0b7f32e5..77070db9 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -38,7 +38,7 @@ // R3C07L | R3C06L | R3C05L | R3C04L | R3C03L | R3C02L | R3C00L | | R3C15R | R3C14R | R3C13R | R3C12R | R3C11R | R3C10R | R3C09R | R4C08R | // R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | // R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | - + map = < RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index db44eb69..cc4c5255 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -37,7 +37,7 @@ bindings = < &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay index 90fd66d1..b5b8a841 100644 --- a/app/boards/shields/snap/snap_left.overlay +++ b/app/boards/shields/snap/snap_left.overlay @@ -24,7 +24,7 @@ &left_encoder { a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "okay"; }; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay index 4243f518..dc71a5cf 100644 --- a/app/boards/shields/snap/snap_right.overlay +++ b/app/boards/shields/snap/snap_right.overlay @@ -46,6 +46,6 @@ kscan_direct: kscan_direct { &right_encoder { a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; status = "okay"; }; diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index 1c1c5604..afa710ff 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_SOFLE_LEFT || SHIELD_SOFLE_RIGHT diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 29de8d7e..03078cd6 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay index 864321cc..82234278 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -24,7 +24,7 @@ , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> ; - col-gpios + col-gpios = <&pro_micro 16 GPIO_ACTIVE_HIGH> , <&pro_micro 10 GPIO_ACTIVE_HIGH> , <&pro_micro 14 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index 34330400..c1d34ffd 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -24,7 +24,7 @@ , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> ; - col-gpios + col-gpios = <&pro_micro 9 GPIO_ACTIVE_HIGH> , <&pro_micro 8 GPIO_ACTIVE_HIGH> , <&pro_micro 7 GPIO_ACTIVE_HIGH> diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 3c8d5f58..221bf90a 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay index 1fa61286..10a195ff 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -25,7 +25,7 @@ , <&pro_micro 8 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay index 7f281db9..eaebff36 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -25,7 +25,7 @@ , <&pro_micro 10 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index 4a2b8973..ac07c935 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -21,7 +21,7 @@ config ZMK_RGB_UNDERGLOW select SPI config ZMK_DISPLAY - + if ZMK_DISPLAY config SSD1306 diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 136e6927..385d2022 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -14,7 +14,7 @@ // tapping_term_ms = <200>; }; -/ { +/ { combos { compatible = "zmk,combos"; @@ -23,80 +23,80 @@ key-positions = <0 1>; bindings = <&kp ESC>; }; - + combo_tab { timeout-ms = <50>; key-positions = <10 11>; bindings = <&kp TAB>; }; - + combo_ralt { timeout-ms = <50>; key-positions = <17 16>; bindings = <&kp RALT>; }; - + combo_lalt { timeout-ms = <50>; key-positions = <11 12>; bindings = <&kp LALT>; }; - + combo_lgui { timeout-ms = <50>; key-positions = <12 13>; bindings = <&kp LGUI>; }; - - + + combo_rgui { timeout-ms = <50>; key-positions = <17 18>; bindings = <&kp RGUI>; }; - - + + }; keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 + &mo 1 &kp LCTL &kp SPC &mo 2 >; }; left_layer { bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 >; }; - + right_layer { bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 + &mo 3 &kp LCTL &kp SPC &mo 2 >; - }; - + }; + tri_layer { bindings = < &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans >; - }; - + }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay index 3dc954c3..1ff5ed5e 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -24,7 +24,7 @@ , <&pro_micro 15 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay index 3811423e..81ddca40 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -24,7 +24,7 @@ , <&pro_micro 14 GPIO_ACTIVE_HIGH> ; - col-gpios + col-gpios = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> diff --git a/app/boards/shields/splitreus62/Kconfig.defconfig b/app/boards/shields/splitreus62/Kconfig.defconfig index 88a53a2f..14063d3e 100644 --- a/app/boards/shields/splitreus62/Kconfig.defconfig +++ b/app/boards/shields/splitreus62/Kconfig.defconfig @@ -1,8 +1,8 @@ # Copyright (c) 2020 Derek Schmell # SPDX-License-Identifier: MIT - - + + if SHIELD_SPLITREUS62_LEFT config ZMK_KEYBOARD_NAME @@ -17,5 +17,5 @@ if SHIELD_SPLITREUS62_LEFT || SHIELD_SPLITREUS62_RIGHT config ZMK_SPLIT default y - + endif diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi index 4b55bb8d..905605e9 100644 --- a/app/boards/shields/splitreus62/splitreus62.dtsi +++ b/app/boards/shields/splitreus62/splitreus62.dtsi @@ -45,6 +45,6 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) , <&pro_micro 5 GPIO_ACTIVE_HIGH> , <&pro_micro 6 GPIO_ACTIVE_HIGH> ; - + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62_right.overlay b/app/boards/shields/splitreus62/splitreus62_right.overlay index f301ab99..9f76e7eb 100644 --- a/app/boards/shields/splitreus62/splitreus62_right.overlay +++ b/app/boards/shields/splitreus62/splitreus62_right.overlay @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include "splitreus62.dtsi" &default_transform { diff --git a/app/boards/shields/tg4x/README.md b/app/boards/shields/tg4x/README.md index 087ce251..12709fde 100644 --- a/app/boards/shields/tg4x/README.md +++ b/app/boards/shields/tg4x/README.md @@ -6,6 +6,6 @@ Standard setup for the [TG4x](https://github.com/MythosMann/tg4x/) 40% keyboard. This TG4x implementation is for... -* rev 2.1 of the board -* Split spacebar with 2.25U on the left and 2.75U on the right -* 2U right shift +- rev 2.1 of the board +- Split spacebar with 2.25U on the left and 2.75U on the right +- 2U right shift diff --git a/app/boards/shields/tg4x/tg4x.overlay b/app/boards/shields/tg4x/tg4x.overlay index 0df94a2b..ca6e23c3 100644 --- a/app/boards/shields/tg4x/tg4x.overlay +++ b/app/boards/shields/tg4x/tg4x.overlay @@ -10,7 +10,7 @@ kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; - + diode-direction = "col2row"; row-gpios diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index e8cb3789..11424dc8 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -21,7 +21,7 @@ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 8414a012..5710aeaf 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -22,7 +22,7 @@ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &tog 1 &kp KP_NUMLOCK &kp KP_SLASH diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.keymap b/app/boards/shields/two_percent_milk/two_percent_milk.keymap index 04dc4c0d..132793b3 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.keymap +++ b/app/boards/shields/two_percent_milk/two_percent_milk.keymap @@ -7,11 +7,11 @@ #include #include #include - + / { keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp X diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 70029f0b..5a77ca11 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -13,7 +13,7 @@ if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT config ZMK_SPLIT default y - + if ZMK_DISPLAY config I2C diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index c21dcf07..a156360e 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -40,7 +40,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - + }; left_encoder: encoder_left { //roller diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index d208fe49..9583499c 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -22,8 +22,8 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | Z | X | C | V | B | | 2 | | 3 | | N | M | , | . | / | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. - * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | + * ,-----. ,--------------------. ,--------------------. ,-----. + * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ bindings = < @@ -46,7 +46,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | | | INS | | | | 2 | | 3 | | 0 | 1 | 2 | 3 | * | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -70,7 +70,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | $ | | { | } | & | | 2 | | 3 | | | | | | | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -94,7 +94,7 @@ * |------+------+------+------+------| ,-----. ,-----. |------+------+------+------+------| * | | | | | | | 2 | | 3 | | F10 | F1 | F2 | F3 | F13 | * `----------------------------------' `-----' `-----' `----------------------------------' - * ,-----. ,--------------------. ,--------------------. ,-----. + * ,-----. ,--------------------. ,--------------------. ,-----. * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ @@ -106,7 +106,7 @@ >; sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + }; }; }; \ No newline at end of file diff --git a/app/boards/shields/zmk_uno/zmk_uno.keymap b/app/boards/shields/zmk_uno/zmk_uno.keymap index 7ab2632a..0e0fc795 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.keymap +++ b/app/boards/shields/zmk_uno/zmk_uno.keymap @@ -29,8 +29,8 @@ }; REMOVE ME: */ - - + + / { macros { ZMK_MACRO(ble_zero, @@ -47,7 +47,7 @@ REMOVE ME: */ keymap { compatible = "zmk,keymap"; - + default_layer { bindings = < &kp A &bl BL_TOG @@ -55,7 +55,7 @@ REMOVE ME: */ &out OUT_USB &ble_zero &ble_one >; - + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; }; diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index 77648afd..c6024694 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -8,7 +8,7 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y - + endif if SHIELD_ZODIARK_LEFT || SHIELD_ZODIARK_RIGHT diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap index 0211f818..82639edc 100644 --- a/app/boards/shields/zodiark/zodiark.keymap +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -39,7 +39,7 @@ // | | 0 | . | Enter| | | | | | | | 0 | . | Enter | | bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 -&kp KP_NUM &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp PSCRN &kp SLCK &trans &trans &kp PAUSE_BREAK &trans &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp F12 +&kp KP_NUM &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp PSCRN &kp SLCK &trans &trans &kp PAUSE_BREAK &trans &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp F12 &trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp INS &kp HOME &trans &trans &kp PG_UP &trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans &trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp DEL &kp END &trans &trans &trans &trans &kp PG_DN &trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &trans &trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans &trans &trans &trans &trans &trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans diff --git a/app/core-coverage.yml b/app/core-coverage.yml index 12c03613..4a60aad9 100644 --- a/app/core-coverage.yml +++ b/app/core-coverage.yml @@ -1,35 +1,35 @@ board: -- nice_nano_v2 -- nrfmicro_13 -- proton_c + - nice_nano_v2 + - nrfmicro_13 + - proton_c shield: -- corne_left -- corne_right -- romac -- settings_reset -- tidbit + - corne_left + - corne_right + - romac + - settings_reset + - tidbit include: -- board: bdn9_rev2 -- board: nice60 -- board: seeeduino_xiao_ble - shield: hummingbird -- board: nrf52840_m2 - shield: m60 -- board: planck_rev6 -- board: proton_c - shield: clueboard_california -- board: nice_nano_v2 - shield: kyria_left - cmake-args: "-DCONFIG_ZMK_DISPLAY=y" - nickname: "display" -- board: nice_nano_v2 - shield: kyria_right - cmake-args: "-DCONFIG_ZMK_DISPLAY=y" - nickname: "display" -- board: nice_nano - shield: romac_plus - cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" - nickname: "underglow" -- board: nice_nano_v2 - shield: lily58_left nice_view_adapter nice_view - nickname: "niceview" + - board: bdn9_rev2 + - board: nice60 + - board: seeeduino_xiao_ble + shield: hummingbird + - board: nrf52840_m2 + shield: m60 + - board: planck_rev6 + - board: proton_c + shield: clueboard_california + - board: nice_nano_v2 + shield: kyria_left + cmake-args: "-DCONFIG_ZMK_DISPLAY=y" + nickname: "display" + - board: nice_nano_v2 + shield: kyria_right + cmake-args: "-DCONFIG_ZMK_DISPLAY=y" + nickname: "display" + - board: nice_nano + shield: romac_plus + cmake-args: "-DCONFIG_ZMK_RGB_UNDERGLOW=y -DCONFIG_WS2812_STRIP=y" + nickname: "underglow" + - board: nice_nano_v2 + shield: lily58_left nice_view_adapter nice_view + nickname: "niceview" diff --git a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml index 2db84bcd..94952813 100644 --- a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml +++ b/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml @@ -5,24 +5,24 @@ # description: > - This is a representation of the Maxim MAX7318 I2C Gpio Expander. + This is a representation of the Maxim MAX7318 I2C Gpio Expander. compatible: "maxim,max7318" include: [gpio-controller.yaml, i2c-device.yaml] properties: - label: - required: true + label: + required: true - "#gpio-cells": - const: 2 + "#gpio-cells": + const: 2 - ngpios: - type: int - required: true - const: 16 - description: Number of gpios supported + ngpios: + type: int + required: true + const: 16 + description: Number of gpios supported gpio-cells: - pin diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index 00947685..e6f6757d 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -16,4 +16,4 @@ properties: description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. tap-ms: type: int - description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding \ No newline at end of file + description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding diff --git a/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml b/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml index 8f01effc..82e1517d 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-tap-dance.yaml @@ -13,4 +13,4 @@ properties: required: true tapping-term-ms: type: int - default: 200 \ No newline at end of file + default: 200 diff --git a/app/dts/bindings/display/gooddisplay,il0323.yaml b/app/dts/bindings/display/gooddisplay,il0323.yaml index d4a9ac7d..46fc7326 100644 --- a/app/dts/bindings/display/gooddisplay,il0323.yaml +++ b/app/dts/bindings/display/gooddisplay,il0323.yaml @@ -8,54 +8,54 @@ compatible: "gooddisplay,il0323" include: spi-device.yaml properties: - height: - type: int - required: true - description: Height in pixel of the panel driven by the controller + height: + type: int + required: true + description: Height in pixel of the panel driven by the controller - width: - type: int - required: true - description: Width in pixel of the panel driven by the controller + width: + type: int + required: true + description: Width in pixel of the panel driven by the controller - reset-gpios: - type: phandle-array - required: true - description: RESET pin. + reset-gpios: + type: phandle-array + required: true + description: RESET pin. - The RESET pin of GD7965 is active low. - If connected directly the MCU pin should be configured - as active low. + The RESET pin of GD7965 is active low. + If connected directly the MCU pin should be configured + as active low. - dc-gpios: - type: phandle-array - required: true - description: DC pin. + dc-gpios: + type: phandle-array + required: true + description: DC pin. - The DC pin of GD7965 is active low (transmission command byte). - If connected directly the MCU pin should be configured - as active low. + The DC pin of GD7965 is active low (transmission command byte). + If connected directly the MCU pin should be configured + as active low. - busy-gpios: - type: phandle-array - required: true - description: BUSY pin. + busy-gpios: + type: phandle-array + required: true + description: BUSY pin. - The BUSY pin of GD7965 is active low. - If connected directly the MCU pin should be configured - as active low. + The BUSY pin of GD7965 is active low. + If connected directly the MCU pin should be configured + as active low. - pwr: - type: uint8-array - required: true - description: Power Setting (PWR) values + pwr: + type: uint8-array + required: true + description: Power Setting (PWR) values - cdi: - type: int - required: true - description: VCOM and data interval value + cdi: + type: int + required: true + description: VCOM and data interval value - tcon: - type: int - required: true - description: TCON setting value \ No newline at end of file + tcon: + type: int + required: true + description: TCON setting value diff --git a/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml b/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml index 64b3939b..57603f3a 100644 --- a/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-mode-press.yaml @@ -5,4 +5,4 @@ description: Set Macro To Press Mode compatible: "zmk,macro-control-mode-press" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml b/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml index c1c27882..cd4ee2b6 100644 --- a/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-mode-release.yaml @@ -5,4 +5,4 @@ description: Set Macro To Release Mode compatible: "zmk,macro-control-mode-release" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml b/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml index 8dacdc2a..f3bfcd5f 100644 --- a/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-tap-time.yaml @@ -5,4 +5,4 @@ description: Set Macro Tap Duration compatible: "zmk,macro-control-tap-time" -include: one_param.yaml \ No newline at end of file +include: one_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml b/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml index 9e9beac2..45da69fa 100644 --- a/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml +++ b/app/dts/bindings/macros/zmk,macro-control-wait-time.yaml @@ -5,4 +5,4 @@ description: Set Macro Wait Duration compatible: "zmk,macro-control-wait-time" -include: one_param.yaml \ No newline at end of file +include: one_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml b/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml index e89d8b24..929e2a29 100644 --- a/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml +++ b/app/dts/bindings/macros/zmk,macro-pause-for-release.yaml @@ -5,4 +5,4 @@ description: Macro Pause Until Release Marker compatible: "zmk,macro-pause-for-release" -include: zero_param.yaml \ No newline at end of file +include: zero_param.yaml diff --git a/app/dts/bindings/zmk,combos.yaml b/app/dts/bindings/zmk,combos.yaml index 1a914a7f..d094b5c4 100644 --- a/app/dts/bindings/zmk,combos.yaml +++ b/app/dts/bindings/zmk,combos.yaml @@ -22,4 +22,4 @@ child-binding: type: boolean layers: type: array - default: [-1] \ No newline at end of file + default: [-1] diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 66c1264a..3e307f85 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include __event_type_start = .; \ diff --git a/app/package.json b/app/package.json index e75d9695..9ad28788 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,6 @@ }, "homepage": "https://zmk.dev/", "devDependencies": { - "prettier": "^2.4.0" + "prettier": "^2.7.1" } -} \ No newline at end of file +} diff --git a/app/src/activity.c b/app/src/activity.c index 46af56fb..41fe2e15 100644 --- a/app/src/activity.c +++ b/app/src/activity.c @@ -74,8 +74,8 @@ void activity_work_handler(struct k_work *work) { } else #endif /* IS_ENABLED(CONFIG_ZMK_SLEEP) */ if (inactive_time > MAX_IDLE_MS) { - set_state(ZMK_ACTIVITY_IDLE); - } + set_state(ZMK_ACTIVITY_IDLE); + } } K_WORK_DEFINE(activity_work, activity_work_handler); diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 5ef32d20..4c056cf5 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -33,7 +33,7 @@ config ZMK_WIDGET_PERIPHERAL_STATUS depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL select LV_USE_LABEL - + config ZMK_WIDGET_WPM_STATUS bool "Widget for displaying typed words per minute" depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index d35c7277..a02f6c64 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -8,7 +8,7 @@ /* This test fails if the order of event handlers for hold-taps -and combos is wrong. Hold-taps need to process key position events +and combos is wrong. Hold-taps need to process key position events first so the decision to hold or tap can be made. */ / { @@ -37,11 +37,11 @@ first so the decision to hold or tap can be made. &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index a99c15d9..325da627 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -32,11 +32,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap index aac330f9..33712822 100644 --- a/app/tests/combo/layer-filter-0/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -52,27 +52,27 @@ &kscan { events = < /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) /* Toggle Layer */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) /* Combo Two */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap index 995f27ee..8eb5e9eb 100644 --- a/app/tests/combo/layer-filter-1/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -32,9 +32,9 @@ &kscan { events = < /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap index 91bf5235..87d21be1 100644 --- a/app/tests/combo/multiple-timeouts/native_posix_64.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -34,7 +34,7 @@ events = < ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap index e3cbf437..8b7b4196 100644 --- a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 0 timeout inf combo 01 timeout inf combo 0123 timeout inf @@ -51,66 +51,66 @@ events = < /* all permutations of combo one press, combo triggered by release */ /* while debugging these, you may want to set the release_timer to a high number */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - + ZMK_MOCK_RELEASE(0,0,10) + /* all permutations of combo two press and release, combo triggered by release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap index c228c475..45737882 100644 --- a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -39,26 +39,26 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ /* all permutations of combo two press and release, combo triggered by timeout */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap index 3d364213..ba547dc2 100644 --- a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 01 timeout 100 combo 0123 timeout 100 press 012, wait until timeout runs out @@ -40,13 +40,13 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 0622dcd0..0da394b5 100644 --- a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* combo 12 timeout 100 combo 0123 timeout 100 press 012, release 2 @@ -41,13 +41,13 @@ &kscan { events = < - /* if you're debugging these, remember that the timer can be triggered between + /* if you're debugging these, remember that the timer can be triggered between events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,2,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index 4e68105f..f9537344 100644 --- a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -10,7 +10,7 @@ key-positions = <0 1>; bindings = <&kp X>; }; - + combo_two { timeout-ms = <30>; key-positions = <0 2>; @@ -40,44 +40,44 @@ &kscan { events = < /* all permutations of combo one press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* all permutations of combo two press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) ZMK_MOCK_RELEASE(0,2,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index 68736d8f..c6202365 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -3,7 +3,7 @@ #include / { - combos { + combos { compatible = "zmk,combos"; combo_one { timeout-ms = <80>; @@ -27,9 +27,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,100) ZMK_MOCK_RELEASE(1,1,100) >; }; \ No newline at end of file diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_posix_64.keymap index 0f45792d..8d81f35b 100644 --- a/app/tests/combo/press-release/native_posix_64.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -3,7 +3,7 @@ #include / { - combos { + combos { compatible = "zmk,combos"; combo_one { timeout-ms = <30>; @@ -28,24 +28,24 @@ &kscan { events = < /* all different combinations of press and release order */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap index ff0b7493..497cf1aa 100644 --- a/app/tests/combo/press-timeout/native_posix_64.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -27,9 +27,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index 2518bbc9..cf7e79f7 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -33,13 +33,13 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 4895636e..0c55eb47 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -33,14 +33,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index 0c4a698c..248d6e75 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -33,14 +33,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap index 3bacb886..5af94d45 100644 --- a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -28,11 +28,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap index 8ac8316b..88351bea 100644 --- a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -28,11 +28,11 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap index 7ca3d77d..4b658a73 100644 --- a/app/tests/gresc/gresc-press-release/native_posix_64.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -19,30 +19,30 @@ &kscan { events = < /* esc */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,0,10) /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,1,10) /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 0c38721d..78b8ebcb 100644 --- a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -27,15 +27,15 @@ The first gresc that is released releases the key. &kscan { events = < /* esc */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ /* ~ */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ + ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap index 706ca540..832ea7ef 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap @@ -31,15 +31,15 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* retro tap */ ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* hold */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap index 2698f055..6d016501 100644 --- a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap @@ -20,7 +20,7 @@ default_layer { bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L >; }; @@ -29,13 +29,13 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,100) ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_PRESS(1,1,100) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) + ZMK_MOCK_PRESS(1,1,100) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) >; }; diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap index 314b7334..dc96ee8b 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap @@ -31,15 +31,15 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* retro tap */ ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* hold */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index ee0d5e80..13a58c3e 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap index adbd648e..b733e3a2 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap @@ -2,7 +2,7 @@ #include #include -/* +/* * A hold-tap with long tapping term is pressed first. * A hold-tap with short tapping term is quickly tapped. * The short tapping term hold-tap should 'tap', not 'hold'. @@ -45,9 +45,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,20) - ZMK_MOCK_PRESS(0,1,20) - ZMK_MOCK_RELEASE(0,1,200) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,20) + ZMK_MOCK_PRESS(0,1,20) + ZMK_MOCK_RELEASE(0,1,200) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index d1d2b756..7560a05a 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index 94d9a923..b915a6a9 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index 6ddf87f8..a6ac1507 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(1,0,10) // trigger key ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap index 040cdd3e..38c8668c 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap index 11d033f4..b5834e06 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap @@ -5,7 +5,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap index abb31b4b..a540353b 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 38575e9a..76bb2fa3 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ ZMK_MOCK_RELEASE(1,1,300) /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 21baa447..882f33aa 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /*d*/ ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index cd7ff384..0fc0b848 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -8,6 +8,6 @@ ZMK_MOCK_PRESS(1,0,10) /* d */ ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index b84aa626..5d0fcbfb 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index bdfaf9d3..fca60ba8 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < ZMK_MOCK_PRESS(0,0,200) ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) >; diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index c0fd1bd1..5d0af9ca 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -8,7 +8,7 @@ ZMK_MOCK_PRESS(0,0,100) ZMK_MOCK_PRESS(1,0,100) ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ + /* timer fires */ ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 69c19676..6b138352 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -9,6 +9,6 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,10) - /* timer */ + /* timer */ >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap index 8f90ffad..d895df02 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap @@ -6,9 +6,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap index 93076055..9965c9b3 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/keypress/kp-press-release/native_posix_64.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap index 0ddb7ab6..c8e744ee 100644 --- a/app/tests/keypress/kp-press-release/native_posix_64.keymap +++ b/app/tests/keypress/kp-press-release/native_posix_64.keymap @@ -2,7 +2,7 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap index f4379893..f4d03429 100644 --- a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -5,30 +5,30 @@ &kscan { events = < /* Toggle LALT on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Tap TAB twice */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) /* Toggle LSHFT on */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* Tap TAB once */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) /* Toggle LALT off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) /* Toggle LSHFT off */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) >; }; diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap index 3b14e416..0a4ad4ae 100644 --- a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -5,18 +5,18 @@ &kscan { events = < /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Press A */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Release A */ ZMK_MOCK_RELEASE(1,0,10) diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap index 644caa26..e25d4b18 100644 --- a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap index 644caa26..e25d4b18 100644 --- a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/macros/basic/native_posix_64.keymap b/app/tests/macros/basic/native_posix_64.keymap index 6a2391db..a2812792 100644 --- a/app/tests/macros/basic/native_posix_64.keymap +++ b/app/tests/macros/basic/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap index 2f3b943a..e6ef4f49 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap index c264a9ab..c5cde5b4 100644 --- a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/press-mid-macro/native_posix_64.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap index a075a443..b8ae76f1 100644 --- a/app/tests/macros/press-mid-macro/native_posix_64.keymap +++ b/app/tests/macros/press-mid-macro/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/macros/press-release/native_posix_64.keymap b/app/tests/macros/press-release/native_posix_64.keymap index 6814d542..25467126 100644 --- a/app/tests/macros/press-release/native_posix_64.keymap +++ b/app/tests/macros/press-release/native_posix_64.keymap @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #include #include #include diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index b8142425..dbb2df5c 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap index 26af5657..b01c6257 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap index 9df2c152..89930328 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap index 5f9375fb..acd55e83 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap index 1b175d44..7e1865a0 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap index 0e9a2d6a..e175d60e 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending index 3f49005a..f3df27ca 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/pending @@ -1,9 +1,9 @@ -This test fails because the hid_listener_keycode_released function +This test fails because the hid_listener_keycode_released function releases implicit modifiers always, even if they were not set by the key that's going up. Also see the comment in that function: If LC(A) is pressed, then LS(B), then LC(A) is released, the shift for B will be released prematurely. This causes if LS(B) to repeat like Bbbbbbbb when pressed for a long time. Solving this would require keeping track of which key's implicit modifiers are currently - active and only releasing modifiers at that time. + active and only releasing modifiers at that time. diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap index 10d0dbf8..8c4534f4 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap index 3d6494dd..e82182c4 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap index d5f372f1..a36b85d2 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; diff --git a/app/tests/momentary-layer/1-normal/native_posix_64.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap index b5249f7b..ed0e8ad1 100644 --- a/app/tests/momentary-layer/1-normal/native_posix_64.keymap +++ b/app/tests/momentary-layer/1-normal/native_posix_64.keymap @@ -24,9 +24,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap index 96e4e8d9..9311fdee 100644 --- a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap @@ -24,9 +24,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/3-covered/native_posix_64.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap index 2dde6d88..62ae301d 100644 --- a/app/tests/momentary-layer/3-covered/native_posix_64.keymap +++ b/app/tests/momentary-layer/3-covered/native_posix_64.keymap @@ -27,7 +27,7 @@ and the original key is "covered". &kscan { events = < - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) >; }; diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap index d0f26b2f..230e9566 100644 --- a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap index 9febf08c..79567de9 100644 --- a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap @@ -24,7 +24,7 @@ &kscan { events = < /* press sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,1,10) /* tap sk LEFT_CONTROL */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) @@ -32,12 +32,12 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* release sl lower_layer */ - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap A (with left control and left shift enabled) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index e9b87f42..e89faa93 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -35,11 +35,11 @@ &kscan { events = < /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press 1 */ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) @@ -49,11 +49,11 @@ /* repeat test to check if cleanup is done correctly */ /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* press 1 */ ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap index 33115453..f52a6bec 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap @@ -9,17 +9,17 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) /* second key is pressed shortly after the first. It should not be capitalized. */ - ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,10) /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap index 2d078ba5..63aca99b 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap @@ -5,14 +5,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 4470fb21..18d09ebc 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -29,8 +29,8 @@ &kscan { events = < /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* press X */ ZMK_MOCK_PRESS(0,1,10) /* press A */ @@ -40,8 +40,8 @@ /* repeat test to check if cleanup is done correctly */ /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* press X */ ZMK_MOCK_PRESS(0,1,10) /* press Y */ diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap index 438880d5..47600269 100644 --- a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap index 067f2379..2fb661a7 100644 --- a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap @@ -5,9 +5,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap index d58641bd..92fd1e0a 100644 --- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,800) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,800) ZMK_MOCK_PRESS(1,0,400) ZMK_MOCK_RELEASE(1,0,10) >; diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap index aac6725e..1daa6c4f 100644 --- a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,1100) + ZMK_MOCK_RELEASE(0,0,1100) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap index 66bb72d8..1be65a5b 100644 --- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap +++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap @@ -5,8 +5,8 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,100) diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap index bdcccf33..a90bb32e 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap @@ -24,24 +24,24 @@ &kscan { events = < /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap sk LEFT_CONTROL */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* repeat */ /* tap sl */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* tap sk */ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap index d4c30fbf..f811f7e9 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap @@ -18,10 +18,10 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* the sticky key is pressed again, so the previous one must be cancelled */ - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,1200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap index c5e1c8db..5674c4ea 100644 --- a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) + ZMK_MOCK_RELEASE(0,0,200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap index 6813393e..142b8236 100644 --- a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap +++ b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap @@ -6,10 +6,10 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) + ZMK_MOCK_RELEASE(0,0,200) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap index f4c7a2d2..bcfc21d2 100644 --- a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap +++ b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap @@ -6,6 +6,6 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap index 0fec2e40..6691437e 100644 --- a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap +++ b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap @@ -6,8 +6,8 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap index 8375c6f6..942ecfc0 100644 --- a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap +++ b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap @@ -6,10 +6,10 @@ &kscan { events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) >; }; \ No newline at end of file diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap index ec12a286..2aa52c16 100644 --- a/app/tests/wpm/1-single_keypress/native_posix_64.keymap +++ b/app/tests/wpm/1-single_keypress/native_posix_64.keymap @@ -2,9 +2,9 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ - ZMK_MOCK_PRESS(0,0,6000) + ZMK_MOCK_PRESS(0,0,6000) >; }; \ No newline at end of file diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap index f4ba2dfe..3cfab946 100644 --- a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap +++ b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap @@ -2,14 +2,14 @@ &kscan { events = < - ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) //1st WPM worker call - 12wpm - 1 key press in 1 second - ZMK_MOCK_PRESS(0,0,1000) + ZMK_MOCK_PRESS(0,0,1000) ZMK_MOCK_RELEASE(0,0,10) // 2nd WPM worker call - 12wpm - 2 key press in 2 second // note there is no event for this as WPM hasn't changed // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds - ZMK_MOCK_PRESS(0,0,2000) + ZMK_MOCK_PRESS(0,0,2000) >; }; \ No newline at end of file diff --git a/docs/package-lock.json b/docs/package-lock.json index fbc859e5..c7333cb3 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -39,7 +39,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "2.3.1", + "prettier": "^2.7.1", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" @@ -12201,15 +12201,18 @@ } }, "node_modules/prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-error": { @@ -24675,9 +24678,9 @@ "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, "pretty-error": { diff --git a/docs/package.json b/docs/package.json index 7c933b03..95d47b9f 100644 --- a/docs/package.json +++ b/docs/package.json @@ -58,7 +58,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "2.3.1", + "prettier": "^2.7.1", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" diff --git a/docs/src/templates/setup.ps1.mustache b/docs/src/templates/setup.ps1.mustache index f90c7488..90f9cdcf 100644 --- a/docs/src/templates/setup.ps1.mustache +++ b/docs/src/templates/setup.ps1.mustache @@ -74,7 +74,7 @@ if (Test-CommandExists Get-Acl) { $permission = (Get-Acl $pwd).Access | ?{$_.IdentityReference -match $env:UserName ` -and $_.FileSystemRights -match "FullControl" ` - -or $_.FileSystemRights -match "Write" } | + -or $_.FileSystemRights -match "Write" } | Select IdentityReference,FileSystemRights If (-Not $permission){ @@ -141,7 +141,7 @@ if ($keyboard_type -eq "shield") { Write-Host "Wired split is not yet supported by ZMK." exit 1 } - + $shields = $keyboard_siblings $board = $($($boards.keys)[$choice]) $boards = ( $board ) diff --git a/docs/src/templates/setup.sh.mustache b/docs/src/templates/setup.sh.mustache index 4c3868ec..c711dbc5 100644 --- a/docs/src/templates/setup.sh.mustache +++ b/docs/src/templates/setup.sh.mustache @@ -97,7 +97,7 @@ select opt in "${options[@]}" "Quit"; do keyboard_arch=${keyboards_arch[$keyboard_index]} keyboard_basedir=${keyboards_basedir[$keyboard_index]} keyboard_title=${options[$keyboard_index]} - keyboard_sibling_var=${keyboard}_siblings[@] + keyboard_sibling_var=${keyboard}_siblings[@] keyboard_sibling_first=${keyboard}_siblings[0] if [ -n "${!keyboard_sibling_first}" ]; then keyboard_siblings=${!keyboard_sibling_var} diff --git a/schema/hardware-metadata.schema.json b/schema/hardware-metadata.schema.json index 8ca382c5..4c2bdf3b 100644 --- a/schema/hardware-metadata.schema.json +++ b/schema/hardware-metadata.schema.json @@ -31,10 +31,7 @@ }, { "type": "object", - "required": [ - "id", - "features" - ], + "required": ["id", "features"], "properties": { "id": { "$ref": "#/$defs/id" @@ -89,9 +86,7 @@ "title": "InterconnectNodeLabels", "type": "object", "additionalProperties": false, - "required": [ - "gpio" - ], + "required": ["gpio"], "properties": { "gpio": { "type": "string" }, "i2c": { "type": "string" }, @@ -104,14 +99,7 @@ "title": "Interconnect", "type": "object", "additionalProperties": false, - "required": [ - "file_format", - "id", - "name", - "description", - "url", - "type" - ], + "required": ["file_format", "id", "name", "description", "url", "type"], "properties": { "file_format": { "type": "string", @@ -200,10 +188,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "usb", - "ble" - ] + "enum": ["usb", "ble"] } }, "features": { @@ -224,14 +209,7 @@ "title": "Shield", "type": "object", "additionalProperties": false, - "required": [ - "file_format", - "id", - "name", - "url", - "type", - "requires" - ], + "required": ["file_format", "id", "name", "url", "type", "requires"], "properties": { "file_format": { "type": "string", From 94061bb91629a83cfe251e63799a9be04a1564d4 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:25:56 -0500 Subject: [PATCH 334/494] refactor: Replace tabs with spaces Standardized indentation to use spaces with a new pre-commit hook. --- .pre-commit-config.yaml | 5 + app/Kconfig | 380 +++++++++--------- app/boards/arm/bdn9/Kconfig.board | 4 +- app/boards/arm/bdn9/Kconfig.defconfig | 10 +- app/boards/arm/bdn9/bdn9_rev2.dts | 198 ++++----- app/boards/arm/bdn9/bdn9_rev2.keymap | 30 +- app/boards/arm/bluemicro840/Kconfig | 8 +- app/boards/arm/bluemicro840/Kconfig.board | 4 +- app/boards/arm/bluemicro840/Kconfig.defconfig | 10 +- .../bluemicro840/arduino_pro_micro_pins.dtsi | 86 ++-- .../bluemicro840/bluemicro840_v1-pinctrl.dtsi | 58 +-- .../arm/bluemicro840/bluemicro840_v1.dts | 158 ++++---- app/boards/arm/bt60/Kconfig | 8 +- app/boards/arm/bt60/Kconfig.board | 8 +- app/boards/arm/bt60/Kconfig.defconfig | 14 +- app/boards/arm/bt60/bt60.dtsi | 170 ++++---- app/boards/arm/bt60/bt60_v1.dts | 186 ++++----- app/boards/arm/bt60/bt60_v1.keymap | 328 +++++++-------- app/boards/arm/bt60/bt60_v1_hs.dts | 88 ++-- app/boards/arm/bt60/bt60_v1_hs.keymap | 60 +-- app/boards/arm/corneish_zen/Kconfig.board | 8 +- app/boards/arm/corneish_zen/Kconfig.defconfig | 46 +-- app/boards/arm/corneish_zen/corneish_zen.dtsi | 166 ++++---- .../arm/corneish_zen/corneish_zen.keymap | 4 +- .../arm/corneish_zen/corneish_zen_v2_left.dts | 144 +++---- .../corneish_zen/corneish_zen_v2_right.dts | 150 +++---- app/boards/arm/dz60rgb/Kconfig.board | 4 +- app/boards/arm/dz60rgb/Kconfig.defconfig | 4 +- app/boards/arm/dz60rgb/dz60rgb_rev1.dts | 126 +++--- app/boards/arm/dz60rgb/dz60rgb_rev1.keymap | 24 +- app/boards/arm/ferris/Kconfig.board | 4 +- app/boards/arm/ferris/Kconfig.defconfig | 8 +- app/boards/arm/ferris/ferris_rev02.dts | 226 +++++------ app/boards/arm/mikoto/Kconfig | 10 +- app/boards/arm/mikoto/Kconfig.board | 4 +- app/boards/arm/mikoto/Kconfig.defconfig | 14 +- .../arm/mikoto/arduino_pro_micro_pins.dtsi | 86 ++-- app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi | 58 +-- app/boards/arm/mikoto/mikoto_520.dts | 160 ++++---- app/boards/arm/nice60/Kconfig | 8 +- app/boards/arm/nice60/Kconfig.board | 4 +- app/boards/arm/nice60/Kconfig.defconfig | 10 +- app/boards/arm/nice60/nice60-pinctrl.dtsi | 10 +- app/boards/arm/nice60/nice60.dts | 248 ++++++------ app/boards/arm/nice60/nice60.keymap | 42 +- app/boards/arm/nice_nano/Kconfig | 8 +- app/boards/arm/nice_nano/Kconfig.board | 8 +- app/boards/arm/nice_nano/Kconfig.defconfig | 10 +- .../arm/nice_nano/arduino_pro_micro_pins.dtsi | 86 ++-- .../arm/nice_nano/nice_nano-pinctrl.dtsi | 58 +-- app/boards/arm/nice_nano/nice_nano.dts | 30 +- app/boards/arm/nice_nano/nice_nano.dtsi | 132 +++--- app/boards/arm/nice_nano/nice_nano_v2.dts | 26 +- app/boards/arm/nrf52840_m2/Kconfig | 8 +- app/boards/arm/nrf52840_m2/Kconfig.board | 4 +- app/boards/arm/nrf52840_m2/Kconfig.defconfig | 10 +- app/boards/arm/nrf52840_m2/nrf52840_m2.dts | 148 +++---- app/boards/arm/nrfmicro/Kconfig | 14 +- app/boards/arm/nrfmicro/Kconfig.board | 16 +- app/boards/arm/nrfmicro/Kconfig.defconfig | 16 +- .../arm/nrfmicro/arduino_pro_micro_pins.dtsi | 86 ++-- .../arduino_pro_micro_pins_52833.dtsi | 86 ++-- .../arduino_pro_micro_pins_flipped.dtsi | 86 ++-- .../nrfmicro/nrfmicro-flipped-pinctrl.dtsi | 58 +-- app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi | 58 +-- app/boards/arm/nrfmicro/nrfmicro_11.dts | 138 +++---- .../arm/nrfmicro/nrfmicro_11_flipped.dts | 138 +++---- app/boards/arm/nrfmicro/nrfmicro_13.dts | 156 +++---- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 156 +++---- app/boards/arm/pillbug/pillbug-pinctrl.dtsi | 88 ++-- app/boards/arm/planck/Kconfig.board | 4 +- app/boards/arm/planck/Kconfig.defconfig | 4 +- app/boards/arm/planck/planck_rev6.dts | 192 ++++----- app/boards/arm/planck/planck_rev6.keymap | 64 +-- app/boards/arm/preonic/Kconfig.board | 4 +- app/boards/arm/proton_c/Kconfig.board | 4 +- app/boards/arm/proton_c/Kconfig.defconfig | 4 +- .../arm/proton_c/arduino_pro_micro_pins.dtsi | 86 ++-- app/boards/arm/proton_c/proton_c.dts | 112 +++--- app/boards/arm/puchi_ble/Kconfig.board | 4 +- app/boards/arm/puchi_ble/Kconfig.defconfig | 12 +- .../arm/puchi_ble/arduino_pro_micro_pins.dtsi | 86 ++-- .../arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi | 58 +-- app/boards/arm/puchi_ble/puchi_ble_v1.dts | 156 +++---- app/boards/arm/s40nc/Kconfig.board | 4 +- app/boards/arm/s40nc/Kconfig.defconfig | 12 +- app/boards/arm/s40nc/s40nc.dts | 198 ++++----- app/boards/arm/s40nc/s40nc.keymap | 34 +- app/boards/native_posix.overlay | 20 +- app/boards/native_posix_64.overlay | 20 +- app/boards/seeeduino_xiao.overlay | 14 +- app/boards/seeeduino_xiao_ble.overlay | 34 +- app/boards/shields/Kconfig.defconfig | 4 +- app/boards/shields/Kconfig.shield | 2 +- app/boards/shields/a_dux/Kconfig.defconfig | 6 +- app/boards/shields/a_dux/Kconfig.shield | 4 +- app/boards/shields/a_dux/a_dux.dtsi | 76 ++-- app/boards/shields/a_dux/a_dux.keymap | 24 +- app/boards/shields/a_dux/a_dux_right.overlay | 2 +- app/boards/shields/bfo9000/Kconfig.defconfig | 6 +- app/boards/shields/bfo9000/Kconfig.shield | 4 +- app/boards/shields/bfo9000/bfo9000.dtsi | 60 +-- app/boards/shields/bfo9000/bfo9000.keymap | 70 ++-- .../shields/bfo9000/bfo9000_left.overlay | 22 +- .../shields/bfo9000/bfo9000_right.overlay | 24 +- .../shields/boardsource3x4/Kconfig.shield | 2 +- .../shields/chalice/boards/nice_nano.overlay | 62 +-- .../chalice/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/clog/Kconfig.defconfig | 6 +- app/boards/shields/clog/Kconfig.shield | 4 +- app/boards/shields/clog/clog.dtsi | 64 +-- app/boards/shields/clog/clog_right.overlay | 2 +- .../clueboard_california/Kconfig.defconfig | 4 +- .../clueboard_california/Kconfig.shield | 2 +- .../clueboard_california.keymap | 26 +- .../clueboard_california.overlay | 40 +- app/boards/shields/contra/Kconfig.shield | 2 +- app/boards/shields/corne/Kconfig.defconfig | 20 +- app/boards/shields/corne/Kconfig.shield | 4 +- .../shields/corne/boards/nice_nano.overlay | 62 +-- .../shields/corne/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/corne/corne.dtsi | 94 ++--- app/boards/shields/corne/corne.keymap | 4 +- app/boards/shields/corne/corne_left.overlay | 16 +- app/boards/shields/corne/corne_right.overlay | 20 +- app/boards/shields/cradio/Kconfig.defconfig | 6 +- app/boards/shields/cradio/Kconfig.shield | 4 +- app/boards/shields/cradio/README.md | 38 +- app/boards/shields/cradio/cradio.dtsi | 76 ++-- .../shields/cradio/cradio_right.overlay | 2 +- app/boards/shields/crbn/Kconfig.defconfig | 2 +- app/boards/shields/crbn/Kconfig.shield | 2 +- app/boards/shields/crbn/crbn.keymap | 86 ++-- app/boards/shields/crbn/crbn.overlay | 80 ++-- .../shields/elephant42/Kconfig.defconfig | 16 +- .../elephant42/boards/nice_nano.overlay | 62 +-- .../elephant42/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/elephant42/elephant42.dtsi | 32 +- app/boards/shields/ergodash/Kconfig.defconfig | 6 +- app/boards/shields/ergodash/Kconfig.shield | 4 +- app/boards/shields/ergodash/ergodash.dtsi | 62 +-- .../shields/ergodash/ergodash_right.overlay | 2 +- .../shields/eternal_keypad/Kconfig.defconfig | 2 +- .../shields/eternal_keypad/Kconfig.shield | 4 +- .../eternal_keypad/boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/fourier/Kconfig.defconfig | 6 +- app/boards/shields/fourier/Kconfig.shield | 4 +- app/boards/shields/fourier/fourier.dtsi | 52 +-- .../shields/helix/boards/nice_nano.overlay | 62 +-- .../shields/helix/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/helix/helix_right.overlay | 2 +- .../shields/hummingbird/hummingbird.overlay | 4 +- app/boards/shields/iris/Kconfig.defconfig | 6 +- app/boards/shields/iris/Kconfig.shield | 4 +- app/boards/shields/iris/iris.dtsi | 48 +-- app/boards/shields/iris/iris.keymap | 38 +- app/boards/shields/iris/iris_left.overlay | 16 +- app/boards/shields/iris/iris_right.overlay | 18 +- app/boards/shields/jian/Kconfig.defconfig | 6 +- app/boards/shields/jian/Kconfig.shield | 4 +- app/boards/shields/jian/jian.dtsi | 76 ++-- app/boards/shields/jian/jian_left.overlay | 16 +- app/boards/shields/jian/jian_right.overlay | 22 +- app/boards/shields/jiran/Kconfig.defconfig | 6 +- app/boards/shields/jiran/Kconfig.shield | 4 +- app/boards/shields/jiran/jiran.dtsi | 74 ++-- app/boards/shields/jiran/jiran_left.overlay | 16 +- app/boards/shields/jiran/jiran_right.overlay | 22 +- app/boards/shields/jorne/Kconfig.defconfig | 20 +- app/boards/shields/jorne/Kconfig.shield | 4 +- .../shields/jorne/boards/nice_nano.overlay | 62 +-- .../shields/jorne/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/jorne/jorne.dtsi | 108 ++--- app/boards/shields/jorne/jorne_left.overlay | 16 +- app/boards/shields/jorne/jorne_right.overlay | 22 +- app/boards/shields/kyria/Kconfig.defconfig | 20 +- app/boards/shields/kyria/Kconfig.shield | 24 +- .../shields/kyria/boards/nice_nano.overlay | 62 +-- .../shields/kyria/boards/nice_nano_v2.overlay | 62 +-- .../shields/kyria/boards/nrfmicro_11.overlay | 62 +-- .../kyria/boards/nrfmicro_11_flipped.overlay | 62 +-- .../shields/kyria/boards/nrfmicro_13.overlay | 62 +-- app/boards/shields/kyria/kyria.dtsi | 54 +-- app/boards/shields/kyria/kyria.keymap | 24 +- app/boards/shields/kyria/kyria_common.dtsi | 80 ++-- app/boards/shields/kyria/kyria_left.overlay | 22 +- app/boards/shields/kyria/kyria_rev2.dtsi | 42 +- app/boards/shields/kyria/kyria_rev2.keymap | 24 +- .../shields/kyria/kyria_rev2_left.overlay | 34 +- .../shields/kyria/kyria_rev2_right.overlay | 38 +- app/boards/shields/kyria/kyria_rev3.dtsi | 48 +-- app/boards/shields/kyria/kyria_rev3.keymap | 40 +- .../shields/kyria/kyria_rev3_left.overlay | 32 +- .../shields/kyria/kyria_rev3_right.overlay | 34 +- app/boards/shields/kyria/kyria_right.overlay | 26 +- app/boards/shields/leeloo/Kconfig.defconfig | 20 +- app/boards/shields/leeloo/Kconfig.shield | 4 +- app/boards/shields/leeloo/leeloo.dtsi | 32 +- app/boards/shields/leeloo/leeloo_left.overlay | 18 +- .../shields/leeloo/leeloo_right.overlay | 20 +- app/boards/shields/lily58/Kconfig.defconfig | 20 +- app/boards/shields/lily58/Kconfig.shield | 4 +- .../shields/lily58/boards/nice_nano.overlay | 62 +-- .../lily58/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/lily58/lily58.dtsi | 102 ++--- app/boards/shields/lily58/lily58.keymap | 36 +- app/boards/shields/lily58/lily58_left.overlay | 18 +- .../shields/lily58/lily58_right.overlay | 18 +- app/boards/shields/lotus58/Kconfig.defconfig | 20 +- app/boards/shields/lotus58/Kconfig.shield | 4 +- .../shields/lotus58/lotus58_left.overlay | 18 +- .../shields/lotus58/lotus58_right.overlay | 20 +- app/boards/shields/m60/Kconfig.defconfig | 2 +- app/boards/shields/m60/Kconfig.shield | 2 +- app/boards/shields/m60/m60.keymap | 32 +- app/boards/shields/m60/m60.overlay | 68 ++-- app/boards/shields/microdox/Kconfig.defconfig | 20 +- app/boards/shields/microdox/Kconfig.shield | 4 +- .../shields/microdox/boards/nice_nano.overlay | 62 +-- .../microdox/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/microdox/microdox.dtsi | 76 ++-- .../shields/microdox/microdox_left.overlay | 14 +- .../shields/microdox/microdox_right.overlay | 20 +- app/boards/shields/murphpad/Kconfig.defconfig | 16 +- app/boards/shields/murphpad/Kconfig.shield | 2 +- .../shields/murphpad/boards/nice_nano.overlay | 62 +-- .../murphpad/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/murphpad/murphpad.overlay | 110 ++--- app/boards/shields/nibble/Kconfig.defconfig | 18 +- app/boards/shields/nibble/Kconfig.shield | 2 +- .../shields/nibble/boards/nice_nano.overlay | 62 +-- .../nibble/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/nibble/nibble.keymap | 38 +- app/boards/shields/nibble/nibble.overlay | 106 ++--- .../shields/nice_view/Kconfig.defconfig | 12 +- app/boards/shields/nice_view/Kconfig.shield | 2 +- .../shields/nice_view/nice_view.overlay | 24 +- .../shields/nice_view_adapter/Kconfig.shield | 2 +- .../boards/bluemicro840_v1.overlay | 42 +- .../boards/mikoto_520.overlay | 42 +- .../boards/nice_nano.overlay | 42 +- .../boards/nice_nano_v2.overlay | 42 +- .../boards/nrfmicro_11.overlay | 42 +- .../boards/nrfmicro_11_flipped.overlay | 42 +- .../boards/nrfmicro_13.overlay | 42 +- .../boards/puchi_ble_v1.overlay | 42 +- app/boards/shields/pancake/Kconfig.shield | 2 +- .../shields/quefrency/Kconfig.defconfig | 6 +- app/boards/shields/quefrency/Kconfig.shield | 4 +- app/boards/shields/quefrency/quefrency.dtsi | 30 +- app/boards/shields/redox/Kconfig.defconfig | 6 +- app/boards/shields/redox/Kconfig.shield | 4 +- .../shields/redox/boards/nice_nano.overlay | 62 +-- .../shields/redox/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/redox/redox.dtsi | 46 +-- app/boards/shields/redox/redox_left.overlay | 18 +- app/boards/shields/redox/redox_right.overlay | 20 +- .../reviung41/boards/nice_nano.overlay | 62 +-- .../reviung41/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/romac/Kconfig.defconfig | 2 +- app/boards/shields/romac/Kconfig.shield | 2 +- app/boards/shields/romac/romac.overlay | 38 +- .../shields/romac_plus/Kconfig.defconfig | 2 +- app/boards/shields/romac_plus/Kconfig.shield | 2 +- .../romac_plus/boards/nice_nano.overlay | 62 +-- .../romac_plus/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/romac_plus/romac_plus.dtsi | 70 ++-- .../shields/romac_plus/romac_plus.overlay | 26 +- .../shields/settings_reset/Kconfig.defconfig | 2 +- .../shields/settings_reset/Kconfig.shield | 2 +- .../settings_reset/settings_reset.overlay | 20 +- app/boards/shields/snap/Kconfig.defconfig | 20 +- app/boards/shields/snap/Kconfig.shield | 4 +- .../shields/snap/boards/nice_nano.overlay | 62 +-- .../shields/snap/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/snap/snap.dtsi | 106 ++--- app/boards/shields/snap/snap.keymap | 38 +- app/boards/shields/snap/snap_left.overlay | 36 +- app/boards/shields/snap/snap_right.overlay | 56 +-- app/boards/shields/sofle/Kconfig.defconfig | 20 +- app/boards/shields/sofle/Kconfig.shield | 4 +- app/boards/shields/sofle/sofle_left.overlay | 18 +- app/boards/shields/sofle/sofle_right.overlay | 20 +- .../splitkb_aurora_corne/Kconfig.defconfig | 24 +- .../splitkb_aurora_corne/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_corne.dtsi | 108 ++--- .../splitkb_aurora_corne.keymap | 4 +- .../splitkb_aurora_corne_left.overlay | 46 +-- .../splitkb_aurora_corne_right.overlay | 50 +-- .../splitkb_aurora_lily58/Kconfig.defconfig | 24 +- .../splitkb_aurora_lily58/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_lily58.dtsi | 94 ++--- .../splitkb_aurora_lily58.keymap | 36 +- .../splitkb_aurora_lily58_left.overlay | 48 +-- .../splitkb_aurora_lily58_right.overlay | 50 +-- .../splitkb_aurora_sweep/Kconfig.defconfig | 24 +- .../splitkb_aurora_sweep/Kconfig.shield | 4 +- .../boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../splitkb_aurora_sweep.dtsi | 118 +++--- .../splitkb_aurora_sweep.keymap | 66 +-- .../splitkb_aurora_sweep_left.overlay | 54 +-- .../splitkb_aurora_sweep_right.overlay | 56 +-- .../shields/splitreus62/Kconfig.defconfig | 6 +- app/boards/shields/splitreus62/Kconfig.shield | 4 +- .../shields/splitreus62/splitreus62.dtsi | 56 +-- .../shields/splitreus62/splitreus62.keymap | 14 +- .../splitreus62/splitreus62_left.overlay | 16 +- .../splitreus62/splitreus62_right.overlay | 18 +- app/boards/shields/tg4x/Kconfig.shield | 2 +- .../shields/tg4x/boards/nice_nano.overlay | 62 +-- .../shields/tg4x/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/tg4x/tg4x.keymap | 50 +-- app/boards/shields/tg4x/tg4x.overlay | 70 ++-- app/boards/shields/tidbit/Kconfig.defconfig | 16 +- app/boards/shields/tidbit/Kconfig.shield | 2 +- .../shields/tidbit/boards/nice_nano.overlay | 62 +-- .../tidbit/boards/nice_nano_v2.overlay | 62 +-- app/boards/shields/tidbit/tidbit.dtsi | 182 ++++----- app/boards/shields/tidbit/tidbit.keymap | 56 +-- app/boards/shields/tidbit/tidbit_19key.keymap | 56 +-- .../shields/two_percent_milk/Kconfig.shield | 2 +- .../two_percent_milk/boards/nice_nano.overlay | 62 +-- .../boards/nice_nano_v2.overlay | 62 +-- .../boards/nrfmicro_11.overlay | 62 +-- .../boards/nrfmicro_11_flipped.overlay | 62 +-- .../boards/nrfmicro_13.overlay | 62 +-- .../two_percent_milk/two_percent_milk.overlay | 22 +- .../shields/waterfowl/Kconfig.defconfig | 20 +- app/boards/shields/waterfowl/Kconfig.shield | 4 +- app/boards/shields/waterfowl/waterfowl.dtsi | 126 +++--- app/boards/shields/waterfowl/waterfowl.keymap | 78 ++-- .../shields/waterfowl/waterfowl_left.overlay | 16 +- .../shields/waterfowl/waterfowl_right.overlay | 18 +- app/boards/shields/zmk_uno/Kconfig.shield | 2 +- app/boards/shields/zmk_uno/zmk_uno.overlay | 256 ++++++------ app/boards/shields/zodiark/Kconfig.defconfig | 20 +- app/boards/shields/zodiark/Kconfig.shield | 4 +- .../shields/zodiark/zodiark_left.overlay | 20 +- .../shields/zodiark/zodiark_right.overlay | 22 +- app/boards/usb_console.dtsi | 14 +- app/cmake/ZephyrBuildConfig.cmake | 250 ++++++------ app/drivers/display/CMakeLists.txt | 2 +- app/drivers/display/Kconfig.il0323 | 10 +- app/drivers/gpio/Kconfig.595 | 22 +- app/drivers/gpio/Kconfig.max7318 | 22 +- app/drivers/kscan/Kconfig | 102 ++--- app/drivers/sensor/battery/Kconfig | 30 +- app/drivers/sensor/ec11/Kconfig | 52 +-- app/dts/behaviors/backlight.dtsi | 14 +- app/dts/behaviors/bluetooth.dtsi | 14 +- app/dts/behaviors/caps_word.dtsi | 16 +- app/dts/behaviors/ext_power.dtsi | 14 +- app/dts/behaviors/gresc.dtsi | 16 +- app/dts/behaviors/key_press.dtsi | 16 +- app/dts/behaviors/key_repeat.dtsi | 16 +- app/dts/behaviors/key_toggle.dtsi | 14 +- app/dts/behaviors/layer_tap.dtsi | 20 +- app/dts/behaviors/macros.dtsi | 76 ++-- app/dts/behaviors/mod_tap.dtsi | 20 +- app/dts/behaviors/momentary_layer.dtsi | 14 +- app/dts/behaviors/none.dtsi | 14 +- app/dts/behaviors/reset.dtsi | 26 +- app/dts/behaviors/rgb_underglow.dtsi | 14 +- .../behaviors/sensor_rotate_key_press.dtsi | 18 +- app/dts/behaviors/sticky_key.dtsi | 36 +- app/dts/behaviors/to_layer.dtsi | 14 +- app/dts/behaviors/toggle_layer.dtsi | 14 +- app/dts/behaviors/transparent.dtsi | 14 +- app/dts/common/arduino_uno_pro_micro_map.dtsi | 68 ++-- app/include/linker/zmk-events.ld | 12 +- app/run-test.sh | 32 +- app/src/split/Kconfig | 14 +- app/src/split/bluetooth/Kconfig | 50 +-- .../backlight/basic/native_posix_64.keymap | 52 +-- app/tests/backlight/behavior_keymap.dtsi | 48 +-- .../config-brt/native_posix_64.keymap | 16 +- .../config-on/native_posix_64.keymap | 16 +- .../config-step/native_posix_64.keymap | 64 +-- .../backlight/cycle/native_posix_64.keymap | 130 +++--- .../low-brightness/native_posix_64.keymap | 70 ++-- app/tests/caps-word/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 44 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 20 +- .../native_posix.keymap | 20 +- .../native_posix_64.keymap | 20 +- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 52 +-- .../native_posix_64.keymap | 54 +-- .../layer-filter-0/native_posix_64.keymap | 122 +++--- .../layer-filter-1/native_posix_64.keymap | 52 +-- .../multiple-timeouts/native_posix_64.keymap | 58 +-- .../native_posix_64.keymap | 172 ++++---- .../native_posix_64.keymap | 88 ++-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 128 +++--- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 48 +-- .../native_posix_64.keymap | 52 +-- .../press-release/native_posix_64.keymap | 74 ++-- .../press-timeout/native_posix_64.keymap | 48 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 66 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 70 ++-- .../native_posix_64.keymap | 48 +-- .../balanced/1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-retro-tap/native_posix_64.keymap | 66 +-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../hold-tap/balanced/behavior_keymap.dtsi | 40 +- .../many-nested/native_posix_64.keymap | 60 +-- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-retro-tap/native_posix_64.keymap | 66 +-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../hold-preferred/behavior_keymap.dtsi | 40 +- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../6-nested-timeouts/native_posix_64.keymap | 70 ++-- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../7-positional/behavior_keymap.dtsi | 40 +- .../native_posix_64.keymap | 16 +- .../on-release-trigger/native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 18 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../8-global-quick-tap/behavior_keymap.dtsi | 42 +- .../tap-preferred/behavior_keymap.dtsi | 40 +- .../1-dn-up/native_posix_64.keymap | 8 +- .../2-dn-timer-up/native_posix_64.keymap | 8 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../3c-kcdn-dn-kcup-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../4c-dn-kcdn-kcup-up/native_posix_64.keymap | 14 +- .../native_posix_64.keymap | 14 +- .../5-quick-tap/native_posix_64.keymap | 12 +- .../1-basic/native_posix_64.keymap | 36 +- .../2-double-hold/native_posix_64.keymap | 24 +- .../6-global-quick-tap/behavior_keymap.dtsi | 42 +- .../behavior_keymap.dtsi | 40 +- app/tests/key-repeat/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 16 +- .../native_posix.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 8 +- app/tests/keypress/behavior_keymap.dtsi | 20 +- .../kp-press-release/native_posix_64.keymap | 8 +- app/tests/keytoggle/behavior_keymap.dtsi | 20 +- .../kt-alt-tab/native_posix_64.keymap | 60 +-- .../kt-modded-alpha/native_posix_64.keymap | 44 +- .../native_posix_64.keymap | 12 +- .../kt-press-release/native_posix_64.keymap | 12 +- app/tests/macros/basic/native_posix_64.keymap | 2 +- app/tests/macros/behavior_keymap.dtsi | 96 ++--- .../native_posix_64.keymap | 56 +-- .../native_posix_64.keymap | 52 +-- .../press-mid-macro/native_posix_64.keymap | 2 +- .../press-release/native_posix_64.keymap | 2 +- .../timing-override/native_posix_64.keymap | 2 +- .../wait-macro-release/native_posix_64.keymap | 2 +- .../1-no-morph/native_posix_64.keymap | 8 +- .../2a-masked-morph/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 42 +- .../native_posix_64.keymap | 46 +-- .../3-unmasked-morph/native_posix_64.keymap | 32 +- app/tests/mod-morph/behavior_keymap.dtsi | 20 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../kp-lctl-dn-lctl-up/native_posix_64.keymap | 28 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../native_posix_64.keymap | 32 +- .../1-normal/native_posix_64.keymap | 40 +- .../native_posix_64.keymap | 40 +- .../3-covered/native_posix_64.keymap | 36 +- .../4-nested/native_posix_64.keymap | 54 +-- .../native_posix_64.keymap | 54 +-- .../momentary-layer/behavior_keymap.dtsi | 28 +- app/tests/none/behavior_keymap.dtsi | 28 +- app/tests/none/layered/native_posix_64.keymap | 2 +- app/tests/none/normal/native_posix.keymap | 2 +- app/tests/none/normal/native_posix_64.keymap | 2 +- .../1-os-dn-up/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 54 +-- .../10-callum-mods/native_posix_64.keymap | 64 +-- .../10-sl-sl-kp/native_posix_64.keymap | 92 ++--- .../native_posix_64.keymap | 30 +- .../native_posix_64.keymap | 22 +- .../native_posix_64.keymap | 70 ++-- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 16 +- .../native_posix_64.keymap | 82 ++-- .../native_posix_64.keymap | 70 ++-- .../9-sk-dn-up-dn-up/native_posix_64.keymap | 34 +- app/tests/sticky-keys/behavior_keymap.dtsi | 28 +- .../tap-dance/1a-tap1/native_posix_64.keymap | 8 +- .../tap-dance/1b-tap2/native_posix_64.keymap | 10 +- .../tap-dance/1c-tap3/native_posix_64.keymap | 12 +- .../tap-dance/2a-hold1/native_posix_64.keymap | 8 +- .../tap-dance/2b-hold2/native_posix_64.keymap | 10 +- .../tap-dance/2c-hold3/native_posix_64.keymap | 12 +- .../3a-tap-int-mid/native_posix_64.keymap | 6 +- .../3b-tap-int-seq/native_posix_64.keymap | 6 +- .../3c-tap-int-after/native_posix_64.keymap | 6 +- .../3d-hold-int-mid/native_posix_64.keymap | 6 +- .../3e-hold-int-seq/native_posix_64.keymap | 6 +- .../3f-hold-int-after/native_posix_64.keymap | 6 +- .../4a-single/native_posix_64.keymap | 8 +- .../5a-tdint-mid/native_posix_64.keymap | 6 +- .../5b-tdint-seq/native_posix_64.keymap | 6 +- .../5c-tdint-after/native_posix_64.keymap | 6 +- .../5d-tdint-multiple/native_posix_64.keymap | 6 +- .../6-combo-tap2/native_posix_64.keymap | 20 +- app/tests/to-layer/behavior_keymap.dtsi | 28 +- .../to-layer/normal/native_posix_64.keymap | 30 +- app/tests/toggle-layer/behavior_keymap.dtsi | 38 +- .../early-key-release/native_posix_64.keymap | 4 +- .../normal/native_posix_64.keymap | 2 +- app/tests/transparent/behavior_keymap.dtsi | 28 +- .../layered/native_posix_64.keymap | 2 +- .../transparent/normal/native_posix_64.keymap | 2 +- .../1-single_keypress/native_posix_64.keymap | 12 +- .../native_posix_64.keymap | 22 +- app/tests/wpm/behavior_keymap.dtsi | 20 +- docs/blog/2020-10-03-bootloader-fix.md | 22 +- docs/docs/behaviors/hold-tap.md | 212 +++++----- docs/docs/behaviors/layers.md | 20 +- docs/docs/behaviors/tap-dance.md | 44 +- docs/docs/config/index.md | 22 +- docs/docs/development/new-behavior.md | 16 +- docs/docs/development/new-shield.md | 162 ++++---- docs/docs/features/backlight.md | 26 +- docs/docs/features/combos.md | 16 +- docs/docs/features/keymaps.md | 4 +- docs/docs/features/underglow.md | 28 +- docs/docs/keymap-example-file.md | 16 +- docs/docs/keymap-example.md | 16 +- 613 files changed, 11572 insertions(+), 11567 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7687fc6e..1375a6ae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,10 @@ fail_fast: false repos: + - repo: https://github.com/Lucas-C/pre-commit-hooks + rev: v1.5.1 + hooks: + - id: remove-tabs + exclude: "vendor-prefixes\\.txt$" - repo: https://github.com/pocc/pre-commit-hooks rev: v1.3.5 hooks: diff --git a/app/Kconfig b/app/Kconfig index ccc5f42d..25a99b55 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -8,167 +8,167 @@ menu "ZMK" menu "Basic Keyboard Setup" config ZMK_KEYBOARD_NAME - string "Keyboard Name" + string "Keyboard Name" config USB_DEVICE_PRODUCT - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config BT_DEVICE_NAME - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config USB_DEVICE_VID - default 0x1D50 + default 0x1D50 config USB_DEVICE_PID - default 0x615E + default 0x615E config USB_DEVICE_MANUFACTURER - default "ZMK Project" + default "ZMK Project" config BT_DIS_PNP_VID - default 0x1D50 + default 0x1D50 config BT_DIS_PNP_PID - default 0x615E + default 0x615E config BT_DIS_MODEL - default ZMK_KEYBOARD_NAME + default ZMK_KEYBOARD_NAME config BT_DIS_MANUF - default "ZMK Project" + default "ZMK Project" menu "HID" choice ZMK_HID_REPORT_TYPE - prompt "HID Report Type" + prompt "HID Report Type" config ZMK_HID_REPORT_TYPE_HKRO - bool "#-Key Roll Over (HKRO) HID Report" - help - Enable # key roll over for HID report. This selection is "boot keyboard" compatible - but limits the total number of possible keys to report as held to #. + bool "#-Key Roll Over (HKRO) HID Report" + help + Enable # key roll over for HID report. This selection is "boot keyboard" compatible + but limits the total number of possible keys to report as held to #. config ZMK_HID_REPORT_TYPE_NKRO - bool "Full N-Key Roll Over (NKRO) HID Report" - help - Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard - from working with some BIOS/UEFI versions that only support "boot keyboard" support. - This option also prevents using some infrequently used higher range HID usages. + bool "Full N-Key Roll Over (NKRO) HID Report" + help + Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard + from working with some BIOS/UEFI versions that only support "boot keyboard" support. + This option also prevents using some infrequently used higher range HID usages. endchoice if ZMK_HID_REPORT_TYPE_HKRO config ZMK_HID_KEYBOARD_REPORT_SIZE - int "# Keyboard Keys Reportable" - default 6 + int "# Keyboard Keys Reportable" + default 6 endif config ZMK_HID_CONSUMER_REPORT_SIZE - int "# Consumer Keys Reportable" - default 6 + int "# Consumer Keys Reportable" + default 6 choice ZMK_HID_CONSUMER_REPORT_USAGES - prompt "HID Report Type" + prompt "HID Report Type" config ZMK_HID_CONSUMER_REPORT_USAGES_FULL - bool "Full Consumer HID Usage Support" - help - Enable full Consumer usage ID values to be sent to hosts. Allows for less - frequently used usages, but has compatibability issues with some host OSes. + bool "Full Consumer HID Usage Support" + help + Enable full Consumer usage ID values to be sent to hosts. Allows for less + frequently used usages, but has compatibability issues with some host OSes. config ZMK_HID_CONSUMER_REPORT_USAGES_BASIC - bool "Basic Consumer HID Usage Support" - help - Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to - hosts. Allows for broader compatibability with more host OSes. + bool "Basic Consumer HID Usage Support" + help + Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to + hosts. Allows for broader compatibability with more host OSes. endchoice menu "Output Types" config ZMK_USB - bool "USB" - select USB - select USB_DEVICE_STACK - select USB_DEVICE_HID + bool "USB" + select USB + select USB_DEVICE_STACK + select USB_DEVICE_HID if ZMK_USB config USB_NUMOF_EP_WRITE_RETRIES - default 10 + default 10 config USB_HID_POLL_INTERVAL_MS - default 1 + default 1 #ZMK_USB endif menuconfig ZMK_BLE - bool "BLE (HID over GATT)" - select BT - select BT_SMP - select BT_SMP_SC_PAIR_ONLY - select BT_SMP_APP_PAIRING_ACCEPT - select BT_PERIPHERAL - select BT_DIS - select BT_BAS - select BT_SETTINGS - select SETTINGS + bool "BLE (HID over GATT)" + select BT + select BT_SMP + select BT_SMP_SC_PAIR_ONLY + select BT_SMP_APP_PAIRING_ACCEPT + select BT_PERIPHERAL + select BT_DIS + select BT_BAS + select BT_SETTINGS + select SETTINGS if ZMK_BLE config SYSTEM_WORKQUEUE_STACK_SIZE - default 4096 if SOC_RP2040 - default 2048 + default 4096 if SOC_RP2040 + default 2048 config ZMK_BLE_THREAD_STACK_SIZE - int "BLE notify thread stack size" - default 512 + int "BLE notify thread stack size" + default 512 config ZMK_BLE_THREAD_PRIORITY - int "BLE notify thread priority" - default 5 + int "BLE notify thread priority" + default 5 config ZMK_BLE_KEYBOARD_REPORT_QUEUE_SIZE - int "Max number of keyboard HID reports to queue for sending over BLE" - default 20 + int "Max number of keyboard HID reports to queue for sending over BLE" + default 20 config ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE - int "Max number of consumer HID reports to queue for sending over BLE" - default 5 + int "Max number of consumer HID reports to queue for sending over BLE" + default 5 config ZMK_BLE_CLEAR_BONDS_ON_START - bool "Configuration that clears all bond information from the keyboard on startup." - default n + bool "Configuration that clears all bond information from the keyboard on startup." + default n # HID GATT notifications sent this way are *not* picked up by Linux, and possibly others. config BT_GATT_NOTIFY_MULTIPLE - default n + default n config BT_GATT_AUTO_SEC_REQ - default n + default n config BT_DEVICE_APPEARANCE - default 961 + default 961 config ZMK_BLE_PASSKEY_ENTRY - bool "Experimental: Requiring typing passkey from host to pair BLE connection" - default n + bool "Experimental: Requiring typing passkey from host to pair BLE connection" + default n config BT_PERIPHERAL_PREF_MIN_INT - default 6 + default 6 config BT_PERIPHERAL_PREF_MAX_INT - default 12 + default 12 config BT_PERIPHERAL_PREF_LATENCY - default 30 + default 30 config BT_PERIPHERAL_PREF_TIMEOUT - default 400 + default 400 #ZMK_BLE endif @@ -189,108 +189,108 @@ menu "Display/LED Options" rsource "src/display/Kconfig" menuconfig ZMK_RGB_UNDERGLOW - bool "RGB Adressable LED Underglow" - select LED_STRIP + bool "RGB Adressable LED Underglow" + select LED_STRIP if ZMK_RGB_UNDERGLOW # This default value cuts down on tons of excess .conf files, if you're using GPIO, manually disable this config SPI - default y + default y config ZMK_RGB_UNDERGLOW_EXT_POWER - bool "RGB underglow toggling also controls external power" - default y + bool "RGB underglow toggling also controls external power" + default y config ZMK_RGB_UNDERGLOW_BRT_MIN - int "RGB underglow minimum brightness in percent" - range 0 100 - default 0 + int "RGB underglow minimum brightness in percent" + range 0 100 + default 0 config ZMK_RGB_UNDERGLOW_BRT_MAX - int "RGB underglow maximum brightness in percent" - range ZMK_RGB_UNDERGLOW_BRT_MIN 100 - default 100 + int "RGB underglow maximum brightness in percent" + range ZMK_RGB_UNDERGLOW_BRT_MIN 100 + default 100 config ZMK_RGB_UNDERGLOW_HUE_STEP - int "RGB underglow hue step in degrees" - range 0 359 - default 10 + int "RGB underglow hue step in degrees" + range 0 359 + default 10 config ZMK_RGB_UNDERGLOW_SAT_STEP - int "RGB underglow saturation step in percent" - range 0 100 - default 10 + int "RGB underglow saturation step in percent" + range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_BRT_STEP - int "RGB underglow brightness step in percent" - range 0 100 - default 10 + int "RGB underglow brightness step in percent" + range 0 100 + default 10 config ZMK_RGB_UNDERGLOW_HUE_START - int "RGB underglow start hue value in degrees" - range 0 359 - default 0 + int "RGB underglow start hue value in degrees" + range 0 359 + default 0 config ZMK_RGB_UNDERGLOW_SAT_START - int "RGB underglow start saturations value in percent" - range 0 100 - default 100 + int "RGB underglow start saturations value in percent" + range 0 100 + default 100 config ZMK_RGB_UNDERGLOW_BRT_START - int "RGB underglow start brightness value in percent" - range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX - default ZMK_RGB_UNDERGLOW_BRT_MAX + int "RGB underglow start brightness value in percent" + range ZMK_RGB_UNDERGLOW_BRT_MIN ZMK_RGB_UNDERGLOW_BRT_MAX + default ZMK_RGB_UNDERGLOW_BRT_MAX config ZMK_RGB_UNDERGLOW_SPD_START - int "RGB underglow start animation speed value" - range 1 5 - default 3 + int "RGB underglow start animation speed value" + range 1 5 + default 3 config ZMK_RGB_UNDERGLOW_EFF_START - int "RGB underglow start effect int value related to the effect enum list" - range 0 3 - default 0 + int "RGB underglow start effect int value related to the effect enum list" + range 0 3 + default 0 config ZMK_RGB_UNDERGLOW_ON_START - bool "RGB underglow starts on by default" - default y + bool "RGB underglow starts on by default" + default y config ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE - bool "Turn off RGB underglow when keyboard goes into idle state" + bool "Turn off RGB underglow when keyboard goes into idle state" config ZMK_RGB_UNDERGLOW_AUTO_OFF_USB - bool "Turn off RGB underglow when USB is disconnected" - depends on USB_DEVICE_STACK + bool "Turn off RGB underglow when USB is disconnected" + depends on USB_DEVICE_STACK #ZMK_RGB_UNDERGLOW endif menuconfig ZMK_BACKLIGHT - bool "LED backlight" - select LED + bool "LED backlight" + select LED if ZMK_BACKLIGHT config ZMK_BACKLIGHT_BRT_STEP - int "Brightness step in percent" - range 1 100 - default 20 + int "Brightness step in percent" + range 1 100 + default 20 config ZMK_BACKLIGHT_BRT_START - int "Default brightness in percent" - range 1 100 - default 40 + int "Default brightness in percent" + range 1 100 + default 40 config ZMK_BACKLIGHT_ON_START - bool "Default backlight state" - default y + bool "Default backlight state" + default y config ZMK_BACKLIGHT_AUTO_OFF_IDLE - bool "Turn off backlight when keyboard goes into idle state" + bool "Turn off backlight when keyboard goes into idle state" config ZMK_BACKLIGHT_AUTO_OFF_USB - bool "Turn off backlight when USB is disconnected" + bool "Turn off backlight when USB is disconnected" #ZMK_BACKLIGHT endif @@ -301,28 +301,28 @@ endmenu menu "Power Management" config ZMK_IDLE_TIMEOUT - int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" - default 30000 + int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" + default 30000 config ZMK_SLEEP - bool "Enable deep sleep support" - imply USB + bool "Enable deep sleep support" + imply USB if ZMK_SLEEP config PM_DEVICE - default y + default y config ZMK_IDLE_SLEEP_TIMEOUT - int "Milliseconds of inactivity before entering deep sleep" - default 900000 + int "Milliseconds of inactivity before entering deep sleep" + default 900000 #ZMK_SLEEP endif config ZMK_EXT_POWER - bool "Enable support to control external power output" - default y + bool "Enable support to control external power output" + default y #Power Management endmenu @@ -330,16 +330,16 @@ endmenu menu "Combo options" config ZMK_COMBO_MAX_PRESSED_COMBOS - int "Maximum number of currently pressed combos" - default 4 + int "Maximum number of currently pressed combos" + default 4 config ZMK_COMBO_MAX_COMBOS_PER_KEY - int "Maximum number of combos per key" - default 5 + int "Maximum number of combos per key" + default 5 config ZMK_COMBO_MAX_KEYS_PER_COMBO - int "Maximum number of keys per combo" - default 4 + int "Maximum number of keys per combo" + default 4 #Combo options endmenu @@ -347,18 +347,18 @@ endmenu menu "Behavior Options" config ZMK_BEHAVIORS_QUEUE_SIZE - int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" - default 64 + int "Maximum number of behaviors to allow queueing from a macro or other complex behavior" + default 64 rsource "Kconfig.behaviors" config ZMK_MACRO_DEFAULT_WAIT_MS - int "Default time to wait (in milliseconds) before triggering the next behavior in macros" - default 15 + int "Default time to wait (in milliseconds) before triggering the next behavior in macros" + default 15 config ZMK_MACRO_DEFAULT_TAP_MS - int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" - default 30 + int "Default time to wait (in milliseconds) between the press and release events of a tapped behavior in macros" + default 30 endmenu @@ -369,8 +369,8 @@ menu "Initialization Priorities" if USB_DEVICE_STACK config ZMK_USB_INIT_PRIORITY - int "USB Init Priority" - default 50 + int "USB Init Priority" + default 50 #USB endif @@ -378,8 +378,8 @@ endif if ZMK_BLE || ZMK_SPLIT_BLE config ZMK_BLE_INIT_PRIORITY - int "BLE Init Priority" - default 50 + int "BLE Init Priority" + default 50 #ZMK_BLE || ZMK_SPLIT_BLE endif @@ -390,8 +390,8 @@ endmenu menu "KSCAN Settings" config ZMK_KSCAN_EVENT_QUEUE_SIZE - int "Size of the event queue for KSCAN events to buffer events" - default 4 + int "Size of the event queue for KSCAN events to buffer events" + default 4 #KSCAN Settings endmenu @@ -399,63 +399,63 @@ endmenu menu "Logging" config ZMK_LOGGING_MINIMAL - bool "Suppress all ZMK debug log messages" - default false + bool "Suppress all ZMK debug log messages" + default false if !ZMK_LOGGING_MINIMAL config ZMK_LOG_LEVEL - default 4 + default 4 endif config ZMK_USB_LOGGING - bool "Enable USB CDC ACM logging to help debug" - select LOG - select USB - select USB_DEVICE_STACK - select USB_CDC_ACM - select SERIAL - select CONSOLE - select UART_INTERRUPT_DRIVEN - select UART_LINE_CTRL - select UART_CONSOLE - select USB_UART_CONSOLE + bool "Enable USB CDC ACM logging to help debug" + select LOG + select USB + select USB_DEVICE_STACK + select USB_CDC_ACM + select SERIAL + select CONSOLE + select UART_INTERRUPT_DRIVEN + select UART_LINE_CTRL + select UART_CONSOLE + select USB_UART_CONSOLE if ZMK_USB_LOGGING choice USB_CDC_ACM_LOG_LEVEL_CHOICE - default USB_CDC_ACM_LOG_LEVEL_OFF + default USB_CDC_ACM_LOG_LEVEL_OFF endchoice choice USB_DRIVER_LOG_LEVEL_CHOICE - default USB_DRIVER_LOG_LEVEL_OFF + default USB_DRIVER_LOG_LEVEL_OFF endchoice # We do this to avoid log loop where logging to USB generates more log messages. config USB_CDC_ACM_RINGBUF_SIZE - default 1024 + default 1024 config LOG_PROCESS_THREAD_STARTUP_DELAY_MS - default 1000 + default 1000 #ZMK_USB_LOGGING endif config ZMK_RTT_LOGGING - bool "Enable RTT logging to help debug" - select LOG - select DEBUG - select ASSERT - select USE_SEGGER_RTT - select CONSOLE - select RTT_CONSOLE + bool "Enable RTT logging to help debug" + select LOG + select DEBUG + select ASSERT + select USE_SEGGER_RTT + select CONSOLE + select RTT_CONSOLE if ZMK_RTT_LOGGING config SEGGER_RTT_BUFFER_SIZE_UP - default 8192 + default 8192 #ZMK_RTT_LOGGING endif @@ -463,10 +463,10 @@ endif if ZMK_USB_LOGGING || ZMK_RTT_LOGGING config LOG_BUFFER_SIZE - default 8192 + default 8192 config LOG_PROCESS_THREAD_SLEEP_MS - default 100 + default 100 #ZMK_USB_LOGGING || ZMK_RTT_LOGGING endif @@ -477,16 +477,16 @@ endmenu if SETTINGS config ZMK_SETTINGS_SAVE_DEBOUNCE - int "Milliseconds to debounce settings saves" - default 60000 + int "Milliseconds to debounce settings saves" + default 60000 #SETTINGS endif config ZMK_BATTERY_REPORT_INTERVAL - depends on ZMK_BLE - int "Battery level report interval in seconds" - default 60 + depends on ZMK_BLE + int "Battery level report interval in seconds" + default 60 #Advanced endmenu @@ -495,26 +495,26 @@ endmenu endmenu config HEAP_MEM_POOL_SIZE - default 8192 + default 8192 config KERNEL_BIN_NAME - default "zmk" + default "zmk" config REBOOT - default y + default y config USB_DEVICE_STACK - default y if HAS_HW_NRF_USBD + default y if HAS_HW_NRF_USBD config ZMK_WPM - bool "Calculate WPM" - default n + bool "Calculate WPM" + default n config SENSOR - default y + default y choice CBPRINTF_IMPLEMENTATION - default CBPRINTF_NANO + default CBPRINTF_NANO endchoice diff --git a/app/boards/arm/bdn9/Kconfig.board b/app/boards/arm/bdn9/Kconfig.board index a67e9a51..76a204cc 100644 --- a/app/boards/arm/bdn9/Kconfig.board +++ b/app/boards/arm/bdn9/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_BDN9 - bool "BDN9 rev2" - depends on SOC_STM32F072XB + bool "BDN9 rev2" + depends on SOC_STM32F072XB diff --git a/app/boards/arm/bdn9/Kconfig.defconfig b/app/boards/arm/bdn9/Kconfig.defconfig index 17695185..d1c82811 100644 --- a/app/boards/arm/bdn9/Kconfig.defconfig +++ b/app/boards/arm/bdn9/Kconfig.defconfig @@ -6,16 +6,16 @@ if BOARD_BDN9 config BOARD - default "bdn9_rev2" + default "bdn9_rev2" config ZMK_KEYBOARD_NAME - default "BDN9 Rev2" + default "BDN9 Rev2" config ZMK_USB - default y + default y config ZMK_RGB_UNDERGLOW - select SPI - select WS2812_STRIP + select SPI + select WS2812_STRIP endif # BOARD_BDN9 diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index e75893d6..d2d1c65c 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -10,134 +10,134 @@ #include / { - model = "Keeb.io BDN9 rev2"; - compatible = "keebio,bdn9", "st,stm32f072"; + model = "Keeb.io BDN9 rev2"; + compatible = "keebio,bdn9", "st,stm32f072"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan; - zmk,underglow = &led_strip; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; + zmk,underglow = &led_strip; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + kscan: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiof 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; - mid_encoder: encoder_mid { - compatible = "alps,ec11"; - label = "MID_ENCODER"; - a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + mid_encoder: encoder_mid { + compatible = "alps,ec11"; + label = "MID_ENCODER"; + a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - sensors: sensors { - compatible = "zmk,keymap-sensors"; - status = "disabled"; - sensors = <>; - }; + sensors: sensors { + compatible = "zmk,keymap-sensors"; + status = "disabled"; + sensors = <>; + }; }; &spi2 { - status = "okay"; - pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>; - pinctrl-names = "default"; + status = "okay"; + pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>; + pinctrl-names = "default"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <9>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <9>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; &clk_hsi { - status = "okay"; + status = "okay"; }; &pll { - status = "okay"; - prediv = <1>; - mul = <6>; - clocks = <&clk_hsi>; + status = "okay"; + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; }; &usb { - status = "okay"; - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 128Kb of flash */ - storage_partition: partition@1e800 { - label = "storage"; - reg = <0x0001e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 128Kb of flash */ + storage_partition: partition@1e800 { + label = "storage"; + reg = <0x0001e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/bdn9/bdn9_rev2.keymap b/app/boards/arm/bdn9/bdn9_rev2.keymap index 50c273c7..1e2c192d 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.keymap +++ b/app/boards/arm/bdn9/bdn9_rev2.keymap @@ -9,8 +9,8 @@ /* Uncomment and keep whatever encoders are on your BDN9 &sensors { - status = "okay"; - sensors = <&left_encoder &mid_encoder &right_encoder>; + status = "okay"; + sensors = <&left_encoder &mid_encoder &right_encoder>; }; */ @@ -20,19 +20,19 @@ // &right_encoder { status = "okay"; }; / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp HOME &kp K_PP &kp END - &kp PG_UP &kp UP &kp PG_DN - &kp LEFT &kp DOWN &kp RIGHT - >; - /* Uncomment and add necessary bindings. This examples is for one encoder - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - */ - }; - }; + default_layer { + bindings = < + &kp HOME &kp K_PP &kp END + &kp PG_UP &kp UP &kp PG_DN + &kp LEFT &kp DOWN &kp RIGHT + >; + /* Uncomment and add necessary bindings. This examples is for one encoder + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + */ + }; + }; }; diff --git a/app/boards/arm/bluemicro840/Kconfig b/app/boards/arm/bluemicro840/Kconfig index 0e6743d3..ca060885 100644 --- a/app/boards/arm/bluemicro840/Kconfig +++ b/app/boards/arm/bluemicro840/Kconfig @@ -1,8 +1,8 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_BLUEMICRO840_V1 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/Kconfig.board b/app/boards/arm/bluemicro840/Kconfig.board index bc271af3..e2794015 100644 --- a/app/boards/arm/bluemicro840/Kconfig.board +++ b/app/boards/arm/bluemicro840/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_BLUEMICRO840_V1 - bool "BlueMicro840_V1" - depends on SOC_NRF52840_QIAA + bool "BlueMicro840_V1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/bluemicro840/Kconfig.defconfig b/app/boards/arm/bluemicro840/Kconfig.defconfig index 5d911ec6..732805ae 100644 --- a/app/boards/arm/bluemicro840/Kconfig.defconfig +++ b/app/boards/arm/bluemicro840/Kconfig.defconfig @@ -6,22 +6,22 @@ if BOARD_BLUEMICRO840_V1 config BOARD - default "bluemicro840_v1" + default "bluemicro840_v1" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi index 53514d64..cdb8fcdd 100644 --- a/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/bluemicro840/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 D2 */ - , <1 0 &gpio0 6 0> /* D1 D3*/ - , <2 0 &gpio0 15 0> /* D2 D1*/ - , <3 0 &gpio0 17 0> /* D3 D0*/ - , <4 0 &gpio0 20 0> /* D4/A6 D4*/ - , <5 0 &gpio0 13 0> /* D5 C6*/ - , <6 0 &gpio0 24 0> /* D6/A7 D7*/ - , <7 0 &gpio0 9 0> /* D7 E6*/ - , <8 0 &gpio0 10 0> /* D8/A8 B4*/ - , <9 0 &gpio1 6 0> /* D9/A9 B5*/ - , <10 0 &gpio1 11 0> /* D10/A10 B6*/ - , <16 0 &gpio0 28 0> /* D16 B2*/ - , <14 0 &gpio0 3 0> /* D14 B3*/ - , <15 0 &gpio1 13 0> /* D15 B1*/ - , <18 0 &gpio0 2 0> /* D18/A0 F7*/ - , <19 0 &gpio0 29 0> /* D19/A1 F6*/ - , <20 0 &gpio0 26 0> /* D20/A2 F5*/ - , <21 0 &gpio0 30 0> /* D21/A3 F4*/ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 D2 */ + , <1 0 &gpio0 6 0> /* D1 D3*/ + , <2 0 &gpio0 15 0> /* D2 D1*/ + , <3 0 &gpio0 17 0> /* D3 D0*/ + , <4 0 &gpio0 20 0> /* D4/A6 D4*/ + , <5 0 &gpio0 13 0> /* D5 C6*/ + , <6 0 &gpio0 24 0> /* D6/A7 D7*/ + , <7 0 &gpio0 9 0> /* D7 E6*/ + , <8 0 &gpio0 10 0> /* D8/A8 B4*/ + , <9 0 &gpio1 6 0> /* D9/A9 B5*/ + , <10 0 &gpio1 11 0> /* D10/A10 B6*/ + , <16 0 &gpio0 28 0> /* D16 B2*/ + , <14 0 &gpio0 3 0> /* D14 B3*/ + , <15 0 &gpio1 13 0> /* D15 B1*/ + , <18 0 &gpio0 2 0> /* D18/A0 F7*/ + , <19 0 &gpio0 29 0> /* D19/A1 F6*/ + , <20 0 &gpio0 26 0> /* D20/A2 F5*/ + , <21 0 &gpio0 30 0> /* D21/A3 F4*/ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 F7*/ - , <1 0 &gpio0 29 0> /* D19/A1 F6*/ - , <2 0 &gpio0 26 0> /* D20/A2 F5*/ - , <3 0 &gpio0 30 0> /* D21/A3 F4*/ - , <6 0 &gpio0 20 0> /* D4/A6 D4*/ - , <7 0 &gpio0 24 0> /* D6/A7 D7*/ - , <8 0 &gpio0 10 0> /* D8/A8 B4*/ - , <9 0 &gpio1 6 0> /* D9/A9 B5*/ - , <10 0 &gpio1 11 0> /* D10/A10 B6*/ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 F7*/ + , <1 0 &gpio0 29 0> /* D19/A1 F6*/ + , <2 0 &gpio0 26 0> /* D20/A2 F5*/ + , <3 0 &gpio0 30 0> /* D21/A3 F4*/ + , <6 0 &gpio0 20 0> /* D4/A6 D4*/ + , <7 0 &gpio0 24 0> /* D6/A7 D7*/ + , <8 0 &gpio0 10 0> /* D8/A8 B4*/ + , <9 0 &gpio1 6 0> /* D9/A9 B5*/ + , <10 0 &gpio1 11 0> /* D10/A10 B6*/ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi index 18b90f21..15c48509 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index c636ca31..f1952601 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -10,117 +10,117 @@ #include "bluemicro840_v1-pinctrl.dtsi" / { - model = "BlueMicro840_V1"; - compatible = "bluemicro840,v1"; + model = "BlueMicro840_V1"; + compatible = "bluemicro840,v1"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - init-delay-ms = <20>; - control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + init-delay-ms = <20>; + control-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 7>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/bt60/Kconfig b/app/boards/arm/bt60/Kconfig index 359e237d..d57a6b7e 100644 --- a/app/boards/arm/bt60/Kconfig +++ b/app/boards/arm/bt60/Kconfig @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_BT60_V1_HS || BOARD_BT60_V1) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_BT60_V1_HS || BOARD_BT60_V1) diff --git a/app/boards/arm/bt60/Kconfig.board b/app/boards/arm/bt60/Kconfig.board index 0f0a9c6e..24c0a8b5 100644 --- a/app/boards/arm/bt60/Kconfig.board +++ b/app/boards/arm/bt60/Kconfig.board @@ -4,9 +4,9 @@ # SPDX-License-Identifier: MIT config BOARD_BT60_V1 - bool "bt60" - depends on SOC_NRF52840_QIAA + bool "bt60" + depends on SOC_NRF52840_QIAA config BOARD_BT60_V1_HS - bool "bt60 hotswap" - depends on SOC_NRF52840_QIAA + bool "bt60 hotswap" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/bt60/Kconfig.defconfig b/app/boards/arm/bt60/Kconfig.defconfig index bad1e7cd..e7cf1a48 100644 --- a/app/boards/arm/bt60/Kconfig.defconfig +++ b/app/boards/arm/bt60/Kconfig.defconfig @@ -4,28 +4,28 @@ if BOARD_BT60_V1_HS || BOARD_BT60_V1 config BOARD - default "bt60" + default "bt60" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config ZMK_KEYBOARD_NAME - default "BT60" + default "BT60" endif # BOARD_BT60 diff --git a/app/boards/arm/bt60/bt60.dtsi b/app/boards/arm/bt60/bt60.dtsi index 3858ba46..6e4900af 100644 --- a/app/boards/arm/bt60/bt60.dtsi +++ b/app/boards/arm/bt60/bt60.dtsi @@ -9,126 +9,126 @@ #include / { - model = "BT60"; - compatible = "polarityworks,bt60"; + model = "BT60"; + compatible = "polarityworks,bt60"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "okay"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - sda-pin = <17>; - scl-pin = <20>; + compatible = "nordic,nrf-twi"; + sda-pin = <17>; + scl-pin = <20>; }; &uart0 { - compatible = "nordic,nrf-uarte"; - tx-pin = <6>; - rx-pin = <8>; + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1.dts b/app/boards/arm/bt60/bt60_v1.dts index 8b2f0cb4..0cfe184a 100644 --- a/app/boards/arm/bt60/bt60_v1.dts +++ b/app/boards/arm/bt60/bt60_v1.dts @@ -9,105 +9,105 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &ansi_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &ansi_transform; + }; - ansi_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) - >; - }; + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + >; + }; - hhkb_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + hhkb_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - iso_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + iso_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - all_1u_transform: keymap_transform_3 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) - >; - }; + all_1u_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + >; + }; - split_transform: keymap_transform_4 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) - RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) - RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + split_transform: keymap_transform_4 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) + RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) + RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&gpio1 13 GPIO_ACTIVE_HIGH> - , <&gpio1 10 GPIO_ACTIVE_HIGH> - , <&gpio1 11 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1.keymap b/app/boards/arm/bt60/bt60_v1.keymap index b42f3f3d..25ae269d 100644 --- a/app/boards/arm/bt60/bt60_v1.keymap +++ b/app/boards/arm/bt60/bt60_v1.keymap @@ -11,170 +11,170 @@ / { - chosen { - #ifdef ANSI - zmk,matrix_transform = &ansi_transform; - #elif defined(HHKB) - zmk,matrix_transform = &hhkb_transform; - #elif defined(ISO) - zmk,matrix_transform = &iso_transform; - #elif defined(ALL_1U) - zmk,matrix_transform = &all_1u_transform; - #else - zmk,matrix_transform = &split_transform; - #endif - }; + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #else + zmk,matrix_transform = &split_transform; + #endif + }; - keymap { - compatible = "zmk,keymap"; - #ifdef ANSI - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - // ------------------------------------------------------------------------------------------ - // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | - // | TAB | Q | UP | E | R | T | Y | U | INS | O |PSCRN|SLCK |PSEBRK| RESET | - // | CAPS |LEFT |DOWN |RIGHT| F | G | H | J | K | L |HOME |PGUP | BOOTLOADER | - // | PREV |VOLUP |VOLDN|MUTE | V | B | N | M | , | END | PGDN | NEXT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | BT_CLR | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(HHKB) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | BSPC | - // | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | - // | CAPS | ALT | WIN | SPACE | WIN | ALT | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSPC - &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 - &kp LCTRL &kp LALT &kp LGUI &kp SPACE &kp RGUI &kp RALT &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL - &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset - &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans - &trans &trans &trans &bootloader &trans &trans &trans - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(ISO) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | - // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET - &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #elif defined(ALL_1U) - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | - // | CTL | WIN | ALT | SPACE | ALT | CTRL | LEFT | DOWN | RIGHT | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #else - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | - // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &kp C_MENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - #endif - }; + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | R | T | Y | U | INS | O |PSCRN|SLCK |PSEBRK| RESET | + // | CAPS |LEFT |DOWN |RIGHT| F | G | H | J | K | L |HOME |PGUP | BOOTLOADER | + // | PREV |VOLUP |VOLDN|MUTE | V | B | N | M | , | END | PGDN | NEXT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | BSPC | + // | CTRL | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | + // | CAPS | ALT | WIN | SPACE | WIN | ALT | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSLH &kp GRAVE + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 + &kp LCTRL &kp LALT &kp LGUI &kp SPACE &kp RGUI &kp RALT &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp DEL + &kp CLCK &bt BT_PRV &bt BT_NXT &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &kp UP &trans &sys_reset + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp LEFT &kp RIGHT &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp DOWN &trans &trans + &trans &trans &trans &bootloader &trans &trans &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | + // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &sys_reset &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &trans &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | + // | CTL | WIN | ALT | SPACE | ALT | CTRL | LEFT | DOWN | RIGHT | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp F1 + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &kp C_MENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #endif + }; }; diff --git a/app/boards/arm/bt60/bt60_v1_hs.dts b/app/boards/arm/bt60/bt60_v1_hs.dts index 0e686fd9..b24dee1e 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.dts +++ b/app/boards/arm/bt60/bt60_v1_hs.dts @@ -9,53 +9,53 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <5>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(2,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(2,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) + >; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&gpio1 11 GPIO_ACTIVE_HIGH> - , <&gpio1 10 GPIO_ACTIVE_HIGH> - , <&gpio1 13 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 23 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 23 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/arm/bt60/bt60_v1_hs.keymap b/app/boards/arm/bt60/bt60_v1_hs.keymap index 167460c6..6c26756e 100644 --- a/app/boards/arm/bt60/bt60_v1_hs.keymap +++ b/app/boards/arm/bt60/bt60_v1_hs.keymap @@ -3,35 +3,35 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ------------------------------------------------------------------------------------------ - // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL - // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | - // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | - // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | - // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &bt BT_CLR - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - raise { - bindings = < - &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans - &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset - &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader - &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT - &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR - >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &bt BT_CLR + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans + &trans &trans &kp UP &trans &trans &trans &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &sys_reset + &trans &kp LEFT &kp DOWN &kp RIGHT &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &trans &trans &trans &trans &trans &kp END &kp PG_DN &kp C_NEXT + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board index 33baa110..ca82e330 100644 --- a/app/boards/arm/corneish_zen/Kconfig.board +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -4,9 +4,9 @@ # config BOARD_CORNEISH_ZEN_V2_LEFT - bool "corneish zen left v2" - depends on SOC_NRF52840_QIAA + bool "corneish zen left v2" + depends on SOC_NRF52840_QIAA config BOARD_CORNEISH_ZEN_V2_RIGHT - bool "corneish zen right v2" - depends on SOC_NRF52840_QIAA \ No newline at end of file + bool "corneish zen right v2" + depends on SOC_NRF52840_QIAA \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index 33ce1256..a161230c 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -6,10 +6,10 @@ if BOARD_CORNEISH_ZEN_V2_LEFT config ZMK_KEYBOARD_NAME - default "Corne-ish Zen" + default "Corne-ish Zen" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # BOARD_CORNEISH_ZEN_V2_LEFT @@ -17,65 +17,65 @@ endif # BOARD_CORNEISH_ZEN_V2_LEFT if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT config BOARD - default "corneish_zen" + default "corneish_zen" config ZMK_SPLIT - default y + default y config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config ZMK_DISPLAY - select LV_USE_CONT - select LV_FONT_MONTSERRAT_26 - select LV_FONT_MONTSERRAT_20 - select LV_FONT_MONTSERRAT_16 - select LV_USE_LABEL - select LV_USE_IMG + select LV_USE_CONT + select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_20 + select LV_FONT_MONTSERRAT_16 + select LV_USE_LABEL + select LV_USE_IMG choice ZMK_DISPLAY_STATUS_SCREEN - default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM + default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM endchoice if ZMK_DISPLAY config SPI - default y + default y config IL0323 - default y + default y config ZMK_DISPLAY_BLANK_ON_IDLE - default n + default n endif # ZMK_DISPLAY menuconfig CUSTOM_WIDGET_BATTERY_STATUS - bool "custom battery status widget" + bool "custom battery status widget" menuconfig CUSTOM_WIDGET_OUTPUT_STATUS - bool "custom output status widget" + bool "custom output status widget" menuconfig CUSTOM_WIDGET_LAYER_STATUS - bool "custom layer status widget" + bool "custom layer status widget" menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS - bool "custom peripheral status widget" + bool "custom peripheral status widget" endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index f203c9f8..10be54cc 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -11,116 +11,116 @@ #include / { - model = "corneish_zen_v2"; - compatible = "corneish_zen_v2"; + model = "corneish_zen_v2"; + compatible = "corneish_zen_v2"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zmk,kscan = &kscan0; - zmk,display = &epd; - zmk,battery = &vbatt; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,display = &epd; + zmk,battery = &vbatt; + zephyr,console = &cdc_acm_uart; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; - // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | - // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | - // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | - // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | + // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | + // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; - // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | - // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | - // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | - // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) - RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) - RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | + // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | + // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | + // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | + map = < + RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) + RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) + RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) + >; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap index 72d0b8f1..2b9eeb14 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.keymap +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -45,7 +45,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -60,7 +60,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 65092dc5..9f3dd73a 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -8,90 +8,90 @@ #include "corneish_zen.dtsi" /{ - chosen { - zephyr,display = &epd; - zmk,battery = &vbatt; - }; + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - , <&gpio0 5 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1960000>; - full-ohms = <(1960000 + 810000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; }; &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; &spi0 { - status = "okay"; - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; - epd: il0323@0 { - compatible = "gooddisplay,il0323"; - reg = <0>; - label = "DISPLAY"; - width = <80>; - height = <128>; - spi-max-frequency = <4000000>; - dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; - busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; - pwr = [03 00 26 26]; - cdi = <0xd2>; - tcon = <0x22>; - }; + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 980c9900..3cb7556f 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -8,98 +8,98 @@ #include "corneish_zen.dtsi" /{ - chosen { - zephyr,display = &epd; - zmk,battery = &vbatt; - }; + chosen { + zephyr,display = &epd; + zmk,battery = &vbatt; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&gpio0 19 GPIO_ACTIVE_HIGH> - , <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 12 GPIO_ACTIVE_HIGH> - , <&gpio1 9 GPIO_ACTIVE_HIGH> - , <&gpio0 7 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; - }; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1960000>; - full-ohms = <(1960000 + 810000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1960000>; + full-ohms = <(1960000 + 810000)>; + }; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; &spi0 { - status = "okay"; - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; - epd: il0323@0 { - compatible = "gooddisplay,il0323"; - reg = <0>; - label = "DISPLAY"; - width = <80>; - height = <128>; - spi-max-frequency = <4000000>; - dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; - busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; - reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; - pwr = [03 00 26 26]; - //softstart = [17 17 17 17]; - cdi = <0xd2>; - tcon = <0x22>; - }; + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + //softstart = [17 17 17 17]; + cdi = <0xd2>; + tcon = <0x22>; + }; }; diff --git a/app/boards/arm/dz60rgb/Kconfig.board b/app/boards/arm/dz60rgb/Kconfig.board index ec8dad68..ba09e2dd 100644 --- a/app/boards/arm/dz60rgb/Kconfig.board +++ b/app/boards/arm/dz60rgb/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_DZ60RGB_REV1 - bool "DZ60RGB Keyboard" - depends on SOC_STM32F303XC + bool "DZ60RGB Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/dz60rgb/Kconfig.defconfig b/app/boards/arm/dz60rgb/Kconfig.defconfig index 779d3123..2e30e3d0 100644 --- a/app/boards/arm/dz60rgb/Kconfig.defconfig +++ b/app/boards/arm/dz60rgb/Kconfig.defconfig @@ -6,9 +6,9 @@ if BOARD_DZ60RGB_REV1 config ZMK_KEYBOARD_NAME - default "DZ60RGB Rev 1" + default "DZ60RGB Rev 1" config ZMK_USB - default y + default y endif # BOARD_DZ60RGB_REV1 diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts index e2730d21..14be837d 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.dts +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.dts @@ -10,84 +10,84 @@ #include / { - model = "DZ60RGB, Rev 1"; - compatible = "dz60rgb,rev1", "st,stm32f303"; + model = "DZ60RGB, Rev 1"; + compatible = "dz60rgb,rev1", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpioa 6 GPIO_ACTIVE_HIGH> - , <&gpioa 7 GPIO_ACTIVE_HIGH> - , <&gpiob 0 GPIO_ACTIVE_HIGH> - , <&gpiob 13 GPIO_ACTIVE_HIGH> - , <&gpiob 15 GPIO_ACTIVE_HIGH> - , <&gpioa 8 GPIO_ACTIVE_HIGH> - , <&gpioa 15 GPIO_ACTIVE_HIGH> - , <&gpiob 3 GPIO_ACTIVE_HIGH> - , <&gpiob 4 GPIO_ACTIVE_HIGH> - , <&gpiob 5 GPIO_ACTIVE_HIGH> - , <&gpiob 8 GPIO_ACTIVE_HIGH> - , <&gpiob 9 GPIO_ACTIVE_HIGH> - , <&gpioc 13 GPIO_ACTIVE_HIGH> - , <&gpioc 14 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpioa 6 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + , <&gpiob 13 GPIO_ACTIVE_HIGH> + , <&gpiob 15 GPIO_ACTIVE_HIGH> + , <&gpioa 8 GPIO_ACTIVE_HIGH> + , <&gpioa 15 GPIO_ACTIVE_HIGH> + , <&gpiob 3 GPIO_ACTIVE_HIGH> + , <&gpiob 4 GPIO_ACTIVE_HIGH> + , <&gpiob 5 GPIO_ACTIVE_HIGH> + , <&gpiob 8 GPIO_ACTIVE_HIGH> + , <&gpiob 9 GPIO_ACTIVE_HIGH> + , <&gpioc 13 GPIO_ACTIVE_HIGH> + , <&gpioc 14 GPIO_ACTIVE_HIGH> + ; + }; }; &usb { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap index f95fce0e..e8cc6a7a 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1.keymap @@ -2,10 +2,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | @@ -13,13 +13,13 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | SHIFT(/) | ^ | DEL | // | CTL | WIN | ALT | SPACE | ALT | MO(1) | <- | v | -> | // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH &kp UP &kp DEL - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp LEFT &kp DOWN &kp RIGHT - >; - }; - }; + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH &kp UP &kp DEL + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp LEFT &kp DOWN &kp RIGHT + >; + }; + }; }; \ No newline at end of file diff --git a/app/boards/arm/ferris/Kconfig.board b/app/boards/arm/ferris/Kconfig.board index ad96271a..70ee895d 100644 --- a/app/boards/arm/ferris/Kconfig.board +++ b/app/boards/arm/ferris/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_FERRIS - bool "Ferris rev 0.2" - depends on SOC_STM32F072XB + bool "Ferris rev 0.2" + depends on SOC_STM32F072XB diff --git a/app/boards/arm/ferris/Kconfig.defconfig b/app/boards/arm/ferris/Kconfig.defconfig index c59cb902..7cf43bcb 100644 --- a/app/boards/arm/ferris/Kconfig.defconfig +++ b/app/boards/arm/ferris/Kconfig.defconfig @@ -6,15 +6,15 @@ if BOARD_FERRIS config BOARD - default "ferris_rev02" + default "ferris_rev02" config ZMK_KEYBOARD_NAME - default "Ferris rev 0.2" + default "Ferris rev 0.2" config ZMK_USB - default y + default y config ZMK_KSCAN_MATRIX_POLLING - default y + default y endif # BOARD_FERRIS diff --git a/app/boards/arm/ferris/ferris_rev02.dts b/app/boards/arm/ferris/ferris_rev02.dts index 55055e9a..618a5591 100644 --- a/app/boards/arm/ferris/ferris_rev02.dts +++ b/app/boards/arm/ferris/ferris_rev02.dts @@ -11,153 +11,153 @@ #include / { - model = "Ferris rev0.2"; - compatible = "ferris,rev02", "st,stm32f072"; + model = "Ferris rev0.2"; + compatible = "ferris,rev02", "st,stm32f072"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan; - zmk,matrix_transform = &transform; - /* TODO: Enable once we support the IC for underglow - zmk,underglow = &led_strip; - */ - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan; + zmk,matrix_transform = &transform; + /* TODO: Enable once we support the IC for underglow + zmk,underglow = &led_strip; + */ + }; - transform: transform { - compatible = "zmk,matrix-transform"; - rows = <4>; - columns = <10>; + transform: transform { + compatible = "zmk,matrix-transform"; + rows = <4>; + columns = <10>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) - RC(3,3) RC(3,4) RC(3,5) RC(3,6) - >; - }; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,3) RC(3,4) RC(3,5) RC(3,6) + >; + }; - kscan: kscan { - compatible = "zmk,kscan-composite"; - label = "KSCAN"; - rows = <4>; - columns = <10>; + kscan: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <4>; + columns = <10>; - left { - kscan = <&kscan_left>; - }; + left { + kscan = <&kscan_left>; + }; - right { - kscan = <&kscan_right>; - column-offset = <5>; - }; - }; + right { + kscan = <&kscan_right>; + column-offset = <5>; + }; + }; - kscan_left: kscan_left { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_LEFT"; + kscan_left: kscan_left { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_LEFT"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&gpiob 8 (GPIO_ACTIVE_HIGH)> - , <&gpiob 4 (GPIO_ACTIVE_HIGH)> - , <&gpiob 3 (GPIO_ACTIVE_HIGH)> - , <&gpioa 15 (GPIO_ACTIVE_HIGH)> - , <&gpioa 14 (GPIO_ACTIVE_HIGH)> - ; - row-gpios - = <&gpiob 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + col-gpios + = <&gpiob 8 (GPIO_ACTIVE_HIGH)> + , <&gpiob 4 (GPIO_ACTIVE_HIGH)> + , <&gpiob 3 (GPIO_ACTIVE_HIGH)> + , <&gpioa 15 (GPIO_ACTIVE_HIGH)> + , <&gpioa 14 (GPIO_ACTIVE_HIGH)> + ; + row-gpios + = <&gpiob 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - kscan_right: kscan_right { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN_RIGHT"; + kscan_right: kscan_right { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN_RIGHT"; - diode-direction = "row2col"; + diode-direction = "row2col"; - col-gpios - = <&right_io 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&right_io 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - row-gpios - = <&right_io 8 (GPIO_ACTIVE_LOW)> - , <&right_io 9 (GPIO_ACTIVE_LOW)> - , <&right_io 10 (GPIO_ACTIVE_LOW)> - , <&right_io 11 (GPIO_ACTIVE_LOW)> - ; - }; + col-gpios + = <&right_io 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&right_io 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + row-gpios + = <&right_io 8 (GPIO_ACTIVE_LOW)> + , <&right_io 9 (GPIO_ACTIVE_LOW)> + , <&right_io 10 (GPIO_ACTIVE_LOW)> + , <&right_io 11 (GPIO_ACTIVE_LOW)> + ; + }; }; &i2c2 { - pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; - pinctrl-names = "default"; - status = "okay"; - clock-frequency = ; + pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; + pinctrl-names = "default"; + status = "okay"; + clock-frequency = ; - right_io: mcp23017@20 { - compatible = "microchip,mcp230xx"; - status = "okay"; - gpio-controller; - reg = <0x20>; - #gpio-cells = <2>; - ngpios = <16>; - }; + right_io: mcp23017@20 { + compatible = "microchip,mcp230xx"; + status = "okay"; + gpio-controller; + reg = <0x20>; + #gpio-cells = <2>; + ngpios = <16>; + }; }; &usb { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hsi { - status = "okay"; + status = "okay"; }; &pll { - prediv = <1>; - mul = <6>; - clocks = <&clk_hsi>; - status = "okay"; + prediv = <1>; + mul = <6>; + clocks = <&clk_hsi>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <1>; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http: //docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 128Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0001e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 128Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0001e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/mikoto/Kconfig b/app/boards/arm/mikoto/Kconfig index 646d119c..71ec9411 100644 --- a/app/boards/arm/mikoto/Kconfig +++ b/app/boards/arm/mikoto/Kconfig @@ -1,12 +1,12 @@ config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_MIKOTO_520) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_MIKOTO_520) choice BOARD_MIKOTO_CHARGER_CURRENT prompt "Charge current to supply to attached batteries" - depends on (BOARD_MIKOTO_520) + depends on (BOARD_MIKOTO_520) config BOARD_MIKOTO_CHARGER_CURRENT_40MA bool "40mA charge current, for battery capacity 40mAh or higher" diff --git a/app/boards/arm/mikoto/Kconfig.board b/app/boards/arm/mikoto/Kconfig.board index 067c2fbe..a872fa1f 100644 --- a/app/boards/arm/mikoto/Kconfig.board +++ b/app/boards/arm/mikoto/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_MIKOTO_520 - bool "mikoto_520" - depends on SOC_NRF52840_QIAA + bool "mikoto_520" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/mikoto/Kconfig.defconfig b/app/boards/arm/mikoto/Kconfig.defconfig index 6aafc613..8c7746db 100644 --- a/app/boards/arm/mikoto/Kconfig.defconfig +++ b/app/boards/arm/mikoto/Kconfig.defconfig @@ -6,29 +6,29 @@ if BOARD_MIKOTO_520 config BOARD - default "mikoto" + default "mikoto" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y choice BOARD_MIKOTO_CHARGER_CURRENT default BOARD_MIKOTO_CHARGER_CURRENT_100MA diff --git a/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi index 7c5cd12f..ed6097ec 100644 --- a/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/mikoto/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 4 0> /* D0 */ - , <1 0 &gpio0 8 0> /* D1 */ - , <2 0 &gpio0 17 0> /* D2 */ - , <3 0 &gpio0 20 0> /* D3 */ - , <4 0 &gpio0 22 0> /* D4/A6 */ - , <5 0 &gpio0 24 0> /* D5 */ - , <6 0 &gpio1 0 0> /* D6/A7 */ - , <7 0 &gpio1 2 0> /* D7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio1 13 0> /* D14 */ - , <15 0 &gpio0 2 0> /* D15 */ - , <18 0 &gpio0 29 0> /* D18/A0 */ - , <19 0 &gpio0 31 0> /* D19/A1 */ - , <20 0 &gpio0 25 0> /* D20/A2 */ - , <21 0 &gpio0 11 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 4 0> /* D0 */ + , <1 0 &gpio0 8 0> /* D1 */ + , <2 0 &gpio0 17 0> /* D2 */ + , <3 0 &gpio0 20 0> /* D3 */ + , <4 0 &gpio0 22 0> /* D4/A6 */ + , <5 0 &gpio0 24 0> /* D5 */ + , <6 0 &gpio1 0 0> /* D6/A7 */ + , <7 0 &gpio1 2 0> /* D7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio1 13 0> /* D14 */ + , <15 0 &gpio0 2 0> /* D15 */ + , <18 0 &gpio0 29 0> /* D18/A0 */ + , <19 0 &gpio0 31 0> /* D19/A1 */ + , <20 0 &gpio0 25 0> /* D20/A2 */ + , <21 0 &gpio0 11 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 29 0> /* D18/A0 */ - , <1 0 &gpio0 31 0> /* D19/A1 */ - , <2 0 &gpio0 25 0> /* D20/A2 */ - , <3 0 &gpio0 11 0> /* D21/A3 */ - , <6 0 &gpio0 22 0> /* D4/A6 */ - , <7 0 &gpio1 0 0> /* D6/A7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 29 0> /* D18/A0 */ + , <1 0 &gpio0 31 0> /* D19/A1 */ + , <2 0 &gpio0 25 0> /* D20/A2 */ + , <3 0 &gpio0 11 0> /* D21/A3 */ + , <6 0 &gpio0 22 0> /* D4/A6 */ + , <7 0 &gpio1 0 0> /* D6/A7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi index 4a8ff82c..df43c407 100644 --- a/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi +++ b/app/boards/arm/mikoto/mikoto_520-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/mikoto/mikoto_520.dts b/app/boards/arm/mikoto/mikoto_520.dts index 3fff0835..f8007033 100644 --- a/app/boards/arm/mikoto/mikoto_520.dts +++ b/app/boards/arm/mikoto/mikoto_520.dts @@ -10,117 +10,117 @@ #include "mikoto_520-pinctrl.dtsi" / { - model = "mikoto"; - compatible = "zhiayang,mikoto"; + model = "mikoto"; + compatible = "zhiayang,mikoto"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + init-delay-ms = <50>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 1>; - output-ohms = <10000000>; - full-ohms = <(10000000 + 4000000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 1>; + output-ohms = <10000000>; + full-ohms = <(10000000 + 4000000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - current-speed = <115200>; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice60/Kconfig b/app/boards/arm/nice60/Kconfig index db7cf398..dfca4f1b 100644 --- a/app/boards/arm/nice60/Kconfig +++ b/app/boards/arm/nice60/Kconfig @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_NICE60 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_NICE60 diff --git a/app/boards/arm/nice60/Kconfig.board b/app/boards/arm/nice60/Kconfig.board index 778f79eb..88db9ee8 100644 --- a/app/boards/arm/nice60/Kconfig.board +++ b/app/boards/arm/nice60/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_NICE60 - bool "nice!60" - depends on SOC_NRF52840_QIAA + bool "nice!60" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nice60/Kconfig.defconfig b/app/boards/arm/nice60/Kconfig.defconfig index 39cf1540..f3347df9 100644 --- a/app/boards/arm/nice60/Kconfig.defconfig +++ b/app/boards/arm/nice60/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NICE60 config ZMK_KEYBOARD_NAME - default "nice!60" + default "nice!60" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NICE60 diff --git a/app/boards/arm/nice60/nice60-pinctrl.dtsi b/app/boards/arm/nice60/nice60-pinctrl.dtsi index ace80f10..9b0e198d 100644 --- a/app/boards/arm/nice60/nice60-pinctrl.dtsi +++ b/app/boards/arm/nice60/nice60-pinctrl.dtsi @@ -4,9 +4,9 @@ */ &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; }; diff --git a/app/boards/arm/nice60/nice60.dts b/app/boards/arm/nice60/nice60.dts index fdc65d6b..651dd555 100644 --- a/app/boards/arm/nice60/nice60.dts +++ b/app/boards/arm/nice60/nice60.dts @@ -13,170 +13,170 @@ #include "nice60-pinctrl.dtsi" / { - model = "nice!60"; - compatible = "nice,60"; + model = "nice!60"; + compatible = "nice,60"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - zmk,underglow = &led_strip; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + zmk,underglow = &led_strip; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,5) RC(4,9) RC(4,10) RC(4,11) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio1 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio1 3 GPIO_ACTIVE_HIGH> - , <&gpio1 7 GPIO_ACTIVE_HIGH> - , <&gpio1 4 GPIO_ACTIVE_HIGH> - , <&gpio1 6 GPIO_ACTIVE_HIGH> - , <&gpio1 5 GPIO_ACTIVE_HIGH> - , <&gpio1 1 GPIO_ACTIVE_HIGH> - , <&gpio1 2 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio1 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio1 3 GPIO_ACTIVE_HIGH> + , <&gpio1 7 GPIO_ACTIVE_HIGH> + , <&gpio1 4 GPIO_ACTIVE_HIGH> + , <&gpio1 6 GPIO_ACTIVE_HIGH> + , <&gpio1 5 GPIO_ACTIVE_HIGH> + , <&gpio1 1 GPIO_ACTIVE_HIGH> + , <&gpio1 2 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &spi3 { - compatible = "nordic,nrf-spim"; + compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi3_default>; - pinctrl-names = "default"; - status = "okay"; + pinctrl-0 = <&spi3_default>; + pinctrl-names = "default"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <12>; /* LED strip length */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <12>; /* LED strip length */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "mbr"; - reg = <0x00000000 0x00001000>; - }; + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; - code_partition: partition@1000 { - label = "code_partition"; - reg = <0x00001000 0x000d3000>; - }; + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; - /* - * The flash starting at 0x000d4000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@d4000 { - label = "storage"; - reg = <0x000d4000 0x00020000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice60/nice60.keymap b/app/boards/arm/nice60/nice60.keymap index edfec32e..3a357163 100644 --- a/app/boards/arm/nice60/nice60.keymap +++ b/app/boards/arm/nice60/nice60.keymap @@ -10,10 +10,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | @@ -21,16 +21,16 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | CTL | WIN | ALT | SPACE | ALT | WIN | MO(1) | CTL | // ------------------------------------------------------------------------------------------ - bindings = < - &gresc &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &mo 1 &kp RCTRL - >; - }; + bindings = < + &gresc &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RGUI &mo 1 &kp RCTRL + >; + }; - rgb_layer { + rgb_layer { // ------------------------------------------------------------------------------------------------ // | BT CLR | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | EFFECT REV | // | BT 1 | | UP | | HUEUP | SATUP | BRIUP | SPDUP | | | | | | | @@ -38,13 +38,13 @@ // | BT 3 | | | | | | | | | | | | // | BT 4 | | | TOG RGB | PRT SCR | | | DEL | // ------------------------------------------------------------------------------------------------ - bindings = < - &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR - &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans - &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF - &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL - >; - }; - }; + bindings = < + &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &rgb_ug RGB_EFR + &bt BT_SEL 0 &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &trans &trans &trans &trans &trans &trans + &bt BT_SEL 1 &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &trans &trans &trans &trans &rgb_ug RGB_EFF + &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_SEL 3 &trans &trans &rgb_ug RGB_TOG &kp PSCRN &trans &trans &kp DEL + >; + }; + }; }; diff --git a/app/boards/arm/nice_nano/Kconfig b/app/boards/arm/nice_nano/Kconfig index 0c9fbc79..ac6828a4 100644 --- a/app/boards/arm/nice_nano/Kconfig +++ b/app/boards/arm/nice_nano/Kconfig @@ -1,7 +1,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_NICE_NANO || BOARD_NICE_NANO_V2) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NICE_NANO || BOARD_NICE_NANO_V2) diff --git a/app/boards/arm/nice_nano/Kconfig.board b/app/boards/arm/nice_nano/Kconfig.board index 4a80b448..8dd16512 100644 --- a/app/boards/arm/nice_nano/Kconfig.board +++ b/app/boards/arm/nice_nano/Kconfig.board @@ -4,10 +4,10 @@ # SPDX-License-Identifier: MIT config BOARD_NICE_NANO - bool "nice!nano" - depends on SOC_NRF52840_QIAA + bool "nice!nano" + depends on SOC_NRF52840_QIAA config BOARD_NICE_NANO_V2 - bool "nice!nano v2" - depends on SOC_NRF52840_QIAA + bool "nice!nano v2" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nice_nano/Kconfig.defconfig b/app/boards/arm/nice_nano/Kconfig.defconfig index ad3fefef..ada59dd9 100644 --- a/app/boards/arm/nice_nano/Kconfig.defconfig +++ b/app/boards/arm/nice_nano/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NICE_NANO || BOARD_NICE_NANO_V2 config BOARD - default "nice_nano" + default "nice_nano" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NICE_NANO || BOARD_NICE_NANO_V2 diff --git a/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi index b972451b..f1b569c0 100644 --- a/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nice_nano/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 17 0> /* D2 */ - , <3 0 &gpio0 20 0> /* D3 */ - , <4 0 &gpio0 22 0> /* D4/A6 */ - , <5 0 &gpio0 24 0> /* D5 */ - , <6 0 &gpio1 0 0> /* D6/A7 */ - , <7 0 &gpio0 11 0> /* D7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio1 11 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio1 15 0> /* D18/A0 */ - , <19 0 &gpio0 2 0> /* D19/A1 */ - , <20 0 &gpio0 29 0> /* D20/A2 */ - , <21 0 &gpio0 31 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 17 0> /* D2 */ + , <3 0 &gpio0 20 0> /* D3 */ + , <4 0 &gpio0 22 0> /* D4/A6 */ + , <5 0 &gpio0 24 0> /* D5 */ + , <6 0 &gpio1 0 0> /* D6/A7 */ + , <7 0 &gpio0 11 0> /* D7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio1 11 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio1 15 0> /* D18/A0 */ + , <19 0 &gpio0 2 0> /* D19/A1 */ + , <20 0 &gpio0 29 0> /* D20/A2 */ + , <21 0 &gpio0 31 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio1 15 0> /* D18/A0 */ - , <1 0 &gpio0 2 0> /* D19/A1 */ - , <2 0 &gpio0 29 0> /* D20/A2 */ - , <3 0 &gpio0 31 0> /* D21/A3 */ - , <6 0 &gpio0 22 0> /* D4/A6 */ - , <7 0 &gpio1 0 0> /* D6/A7 */ - , <8 0 &gpio1 4 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio0 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio1 15 0> /* D18/A0 */ + , <1 0 &gpio0 2 0> /* D19/A1 */ + , <2 0 &gpio0 29 0> /* D20/A2 */ + , <3 0 &gpio0 31 0> /* D21/A3 */ + , <6 0 &gpio0 22 0> /* D4/A6 */ + , <7 0 &gpio1 0 0> /* D6/A7 */ + , <8 0 &gpio1 4 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio0 9 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi index 18b90f21..15c48509 100644 --- a/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi +++ b/app/boards/arm/nice_nano/nice_nano-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano.dts b/app/boards/arm/nice_nano/nice_nano.dts index e29df205..4ee0df7f 100644 --- a/app/boards/arm/nice_nano/nice_nano.dts +++ b/app/boards/arm/nice_nano/nice_nano.dts @@ -8,21 +8,21 @@ #include "nice_nano.dtsi" / { - chosen { - zmk,battery = &vbatt; - }; + chosen { + zmk,battery = &vbatt; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 806000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 806000)>; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano.dtsi b/app/boards/arm/nice_nano/nice_nano.dtsi index ad5ef278..0c0a3823 100644 --- a/app/boards/arm/nice_nano/nice_nano.dtsi +++ b/app/boards/arm/nice_nano/nice_nano.dtsi @@ -9,101 +9,101 @@ #include "arduino_pro_micro_pins.dtsi" / { - model = "nice!nano"; - compatible = "nice,nano"; + model = "nice!nano"; + compatible = "nice,nano"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - current-speed = <115200>; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nice_nano/nice_nano_v2.dts b/app/boards/arm/nice_nano/nice_nano_v2.dts index ed2b35f4..b2fbcc81 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2.dts +++ b/app/boards/arm/nice_nano/nice_nano_v2.dts @@ -8,19 +8,19 @@ #include "nice_nano.dtsi" / { - chosen { - zmk,battery = &vbatt; - }; + chosen { + zmk,battery = &vbatt; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; - init-delay-ms = <50>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + init-delay-ms = <50>; + }; - vbatt: vbatt { - compatible = "zmk,battery-nrf-vddh"; - label = "BATTERY"; - }; + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY"; + }; }; diff --git a/app/boards/arm/nrf52840_m2/Kconfig b/app/boards/arm/nrf52840_m2/Kconfig index c7edeb8d..c9cb6523 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on BOARD_NRF52840_M2 + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/Kconfig.board b/app/boards/arm/nrf52840_m2/Kconfig.board index 49901039..b2927ff2 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.board +++ b/app/boards/arm/nrf52840_m2/Kconfig.board @@ -4,6 +4,6 @@ # SPDX-License-Identifier: MIT config BOARD_NRF52840_M2 - bool "nrf52480_m2" - depends on SOC_NRF52840_QIAA + bool "nrf52480_m2" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/nrf52840_m2/Kconfig.defconfig b/app/boards/arm/nrf52840_m2/Kconfig.defconfig index 4e1679ba..50a049bb 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig.defconfig @@ -4,22 +4,22 @@ if BOARD_NRF52840_M2 config BOARD - default "nrf52480_m2" + default "nrf52480_m2" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts index dc22c40b..253e6b77 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -8,105 +8,105 @@ #include / { - model = "Makerdiary nRF52840 M.2 module"; - compatible = "makerdiary,nrf52840_m2"; + model = "Makerdiary nRF52840 M.2 module"; + compatible = "makerdiary,nrf52840_m2"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - red_led: led_0 { - gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; - label = "Red LED"; - }; - green_led: led_1 { - gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; - label = "Green LED"; - }; - blue_led: led_2 { - gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + red_led: led_0 { + gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; + label = "Red LED"; + }; + green_led: led_1 { + gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>; + label = "Green LED"; + }; + blue_led: led_2 { + gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 0>; - output-ohms = <1000000>; - full-ohms = <(1000000 + 1000000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 0>; + output-ohms = <1000000>; + full-ohms = <(1000000 + 1000000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - compatible = "nordic,nrf-usbd"; - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + compatible = "nordic,nrf-usbd"; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/Kconfig b/app/boards/arm/nrfmicro/Kconfig index 12b06621..233ddbad 100644 --- a/app/boards/arm/nrfmicro/Kconfig +++ b/app/boards/arm/nrfmicro/Kconfig @@ -1,10 +1,10 @@ config BOARD_ENABLE_DCDC - bool "Enable DCDC mode" - select SOC_DCDC_NRF52X - default y - depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) config BOARD_NRFMICRO_CHARGER - bool "Enable battery charger" - default y - depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) + bool "Enable battery charger" + default y + depends on (BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833) diff --git a/app/boards/arm/nrfmicro/Kconfig.board b/app/boards/arm/nrfmicro/Kconfig.board index 244242a9..441de5cf 100644 --- a/app/boards/arm/nrfmicro/Kconfig.board +++ b/app/boards/arm/nrfmicro/Kconfig.board @@ -4,17 +4,17 @@ # SPDX-License-Identifier: MIT config BOARD_NRFMICRO_11 - bool "nrfmicro_11" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_11" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_11_FLIPPED - bool "nrfmicro_11_flipped" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_11_flipped" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_13 - bool "nrfmicro_13" - depends on SOC_NRF52840_QIAA + bool "nrfmicro_13" + depends on SOC_NRF52840_QIAA config BOARD_NRFMICRO_13_52833 - bool "nrfmicro_13_52833" - depends on SOC_NRF52833_QIAA + bool "nrfmicro_13_52833" + depends on SOC_NRF52833_QIAA diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig index 751d592b..7d752ac6 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -6,31 +6,31 @@ if BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD - default "nrfmicro" + default "nrfmicro" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y -if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 +if BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 config BOARD_NRFMICRO_CHARGER - default y + default y endif # BOARD_NRFMICRO_13 || BOARD_NRFMICRO_13_52833 diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi index 537aaed3..01e342c0 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi index 651edb94..76ece25f 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_52833.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 4 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 5 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 4 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 5 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi index 887a3144..923efbbf 100644 --- a/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi +++ b/app/boards/arm/nrfmicro/arduino_pro_micro_pins_flipped.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 30 0> /* D2 */ - , <3 0 &gpio0 31 0> /* D3 */ - , <4 0 &gpio0 29 0> /* D4/A6 */ - , <5 0 &gpio0 2 0> /* D5 */ - , <6 0 &gpio1 13 0> /* D6/A7 */ - , <7 0 &gpio0 3 0> /* D7 */ - , <8 0 &gpio0 28 0> /* D8/A8 */ - , <9 0 &gpio1 11 0> /* D9/A9 */ - , <10 0 &gpio1 6 0> /* D10/A10 */ - , <16 0 &gpio0 10 0> /* D16 */ - , <14 0 &gpio0 9 0> /* D14 */ - , <15 0 &gpio0 24 0> /* D15 */ - , <18 0 &gpio0 13 0> /* D18/A0 */ - , <19 0 &gpio0 20 0> /* D19/A1 */ - , <20 0 &gpio0 17 0> /* D20/A2 */ - , <21 0 &gpio0 15 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 30 0> /* D2 */ + , <3 0 &gpio0 31 0> /* D3 */ + , <4 0 &gpio0 29 0> /* D4/A6 */ + , <5 0 &gpio0 2 0> /* D5 */ + , <6 0 &gpio1 13 0> /* D6/A7 */ + , <7 0 &gpio0 3 0> /* D7 */ + , <8 0 &gpio0 28 0> /* D8/A8 */ + , <9 0 &gpio1 11 0> /* D9/A9 */ + , <10 0 &gpio1 6 0> /* D10/A10 */ + , <16 0 &gpio0 10 0> /* D16 */ + , <14 0 &gpio0 9 0> /* D14 */ + , <15 0 &gpio0 24 0> /* D15 */ + , <18 0 &gpio0 13 0> /* D18/A0 */ + , <19 0 &gpio0 20 0> /* D19/A1 */ + , <20 0 &gpio0 17 0> /* D20/A2 */ + , <21 0 &gpio0 15 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 13 0> /* D18/A0 */ - , <1 0 &gpio0 20 0> /* D19/A1 */ - , <2 0 &gpio0 17 0> /* D20/A2 */ - , <3 0 &gpio0 15 0> /* D21/A3 */ - , <6 0 &gpio0 29 0> /* D4/A6 */ - , <7 0 &gpio1 13 0> /* D6/A7 */ - , <8 0 &gpio0 28 0> /* D8/A8 */ - , <9 0 &gpio1 11 0> /* D9/A9 */ - , <10 0 &gpio1 6 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 13 0> /* D18/A0 */ + , <1 0 &gpio0 20 0> /* D19/A1 */ + , <2 0 &gpio0 17 0> /* D20/A2 */ + , <3 0 &gpio0 15 0> /* D21/A3 */ + , <6 0 &gpio0 29 0> /* D4/A6 */ + , <7 0 &gpio1 13 0> /* D6/A7 */ + , <8 0 &gpio0 28 0> /* D8/A8 */ + , <9 0 &gpio1 11 0> /* D9/A9 */ + , <10 0 &gpio1 6 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi index a54c2598..22bc11d4 100644 --- a/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi +++ b/app/boards/arm/nrfmicro/nrfmicro-flipped-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi index a5385690..35a46e5a 100644 --- a/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi +++ b/app/boards/arm/nrfmicro/nrfmicro-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 48186ac9..68331edc 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -10,102 +10,102 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 656873a0..9977617c 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -10,102 +10,102 @@ #include "nrfmicro-flipped-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_HIGH>; + }; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index 9fb68562..300838ff 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -10,115 +10,115 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 9ade364d..86bcb5e5 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -10,115 +10,115 @@ #include "nrfmicro-pinctrl.dtsi" / { - model = "nrfmicro"; - compatible = "joric,nrfmicro"; + model = "nrfmicro"; + compatible = "joric,nrfmicro"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twim"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x00046000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x00046000>; + }; - /* - * The flash starting at 0x0006c000 and ending at - * 0x00073fff is reserved for use by the application. - */ + /* + * The flash starting at 0x0006c000 and ending at + * 0x00073fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@6c000 { - label = "storage"; - reg = <0x0006c000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@6c000 { + label = "storage"; + reg = <0x0006c000 0x00008000>; + }; - boot_partition: partition@74000 { - label = "adafruit_boot"; - reg = <0x00074000 0x0000c000>; - }; - }; + boot_partition: partition@74000 { + label = "adafruit_boot"; + reg = <0x00074000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi index 8751bc4b..8a9e9fc2 100644 --- a/app/boards/arm/pillbug/pillbug-pinctrl.dtsi +++ b/app/boards/arm/pillbug/pillbug-pinctrl.dtsi @@ -4,53 +4,53 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - spi1_default: spi1_default { - group1 { - psels = , - , - ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/planck/Kconfig.board b/app/boards/arm/planck/Kconfig.board index fe15e1a9..28b7381f 100644 --- a/app/boards/arm/planck/Kconfig.board +++ b/app/boards/arm/planck/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PLANCK_REV6 - bool "Planck V6 Keyboard" - depends on SOC_STM32F303XC + bool "Planck V6 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/planck/Kconfig.defconfig b/app/boards/arm/planck/Kconfig.defconfig index 913c1c13..d1304da0 100644 --- a/app/boards/arm/planck/Kconfig.defconfig +++ b/app/boards/arm/planck/Kconfig.defconfig @@ -6,10 +6,10 @@ if BOARD_PLANCK_REV6 config ZMK_KEYBOARD_NAME - default "Planck V6" + default "Planck V6" config ZMK_USB - default y + default y config ZMK_KSCAN_MATRIX_POLLING default y diff --git a/app/boards/arm/planck/planck_rev6.dts b/app/boards/arm/planck/planck_rev6.dts index 97239595..5fdd2c21 100644 --- a/app/boards/arm/planck/planck_rev6.dts +++ b/app/boards/arm/planck/planck_rev6.dts @@ -10,123 +10,123 @@ #include / { - model = "Plack PCD, rev6"; - compatible = "planck,rev6", "st,stm32f303"; + model = "Plack PCD, rev6"; + compatible = "planck,rev6", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,kscan = &kscan0; - zmk,matrix_transform = &layout_grid_transform; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,kscan = &kscan0; + zmk,matrix_transform = &layout_grid_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; - row-gpios - = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpiob 11 GPIO_ACTIVE_HIGH> - , <&gpiob 10 GPIO_ACTIVE_HIGH> - , <&gpiob 2 GPIO_ACTIVE_HIGH> - , <&gpiob 1 GPIO_ACTIVE_HIGH> - , <&gpioa 7 GPIO_ACTIVE_HIGH> - , <&gpiob 0 GPIO_ACTIVE_HIGH> - ; - }; + row-gpios + = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpiob 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioc 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpioa 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpiob 11 GPIO_ACTIVE_HIGH> + , <&gpiob 10 GPIO_ACTIVE_HIGH> + , <&gpiob 2 GPIO_ACTIVE_HIGH> + , <&gpiob 1 GPIO_ACTIVE_HIGH> + , <&gpioa 7 GPIO_ACTIVE_HIGH> + , <&gpiob 0 GPIO_ACTIVE_HIGH> + ; + }; layout_grid_transform: - keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,5) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,5) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; layout_mit_transform: - keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,4) RC(7,0) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; layout_2x2u_transform: - keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <6>; - rows = <8>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) - RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,5) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) - >; - }; + keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <6>; + rows = <8>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) + RC(3,0) RC(3,1) RC(3,2) RC(7,3) RC(7,5) RC(7,1) RC(7,2) RC(3,3) RC(3,4) RC(3,5) + >; + }; }; &usb { - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &clk_hse { - status = "okay"; - clock-frequency = ; + status = "okay"; + clock-frequency = ; }; &pll { - prediv = <1>; - mul = <9>; - clocks = <&clk_hse>; - status = "okay"; + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <2>; - apb2-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/planck/planck_rev6.keymap b/app/boards/arm/planck/planck_rev6.keymap index 7e4f6732..65138057 100644 --- a/app/boards/arm/planck/planck_rev6.keymap +++ b/app/boards/arm/planck/planck_rev6.keymap @@ -8,39 +8,39 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ----------------------------------------------------------------------------------------- - // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | - // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT - >; - }; + default_layer { + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; - lower { - bindings = < - &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans - &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; - }; + lower { + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; - raise { - bindings = < - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; - }; - }; + raise { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; + }; }; diff --git a/app/boards/arm/preonic/Kconfig.board b/app/boards/arm/preonic/Kconfig.board index a930b90f..39f35db6 100644 --- a/app/boards/arm/preonic/Kconfig.board +++ b/app/boards/arm/preonic/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PREONIC_REV3 - bool "Preonic V3 Keyboard" - depends on SOC_STM32F303XC + bool "Preonic V3 Keyboard" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/Kconfig.board b/app/boards/arm/proton_c/Kconfig.board index ffa7ffd6..1596077f 100644 --- a/app/boards/arm/proton_c/Kconfig.board +++ b/app/boards/arm/proton_c/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_QMK_PROTON_C - bool "QMK Proton-C" - depends on SOC_STM32F303XC + bool "QMK Proton-C" + depends on SOC_STM32F303XC diff --git a/app/boards/arm/proton_c/Kconfig.defconfig b/app/boards/arm/proton_c/Kconfig.defconfig index 78ccbabd..f5089119 100644 --- a/app/boards/arm/proton_c/Kconfig.defconfig +++ b/app/boards/arm/proton_c/Kconfig.defconfig @@ -6,9 +6,9 @@ if BOARD_QMK_PROTON_C config BOARD - default "proton_c" + default "proton_c" config ZMK_USB - default y + default y endif # BOARD_QMK_PROTON_C diff --git a/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi b/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi index 9a026adf..18311942 100644 --- a/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/proton_c/arduino_pro_micro_pins.dtsi @@ -5,50 +5,50 @@ */ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpioa 10 0> /* D0 */ - , <1 0 &gpioa 9 0> /* D1 */ - , <2 0 &gpiob 7 0> /* D2 */ - , <3 0 &gpiob 6 0> /* D3 */ - , <4 0 &gpiob 5 0> /* D4/A6 */ - , <5 0 &gpiob 4 0> /* D5 */ - , <6 0 &gpiob 3 0> /* D6/A7 */ - , <7 0 &gpiob 2 0> /* D7 */ - , <8 0 &gpiob 1 0> /* D8/A8 */ - , <9 0 &gpiob 0 0> /* D9/A9 */ - , <10 0 &gpiob 9 0> /* D10/A10 */ - , <16 0 &gpiob 15 0> /* D16 */ - , <14 0 &gpiob 14 0> /* D14 */ - , <15 0 &gpiob 13 0> /* D15 */ - , <18 0 &gpiob 8 0> /* D18/A0 */ - , <19 0 &gpioa 0 0> /* D19/A1 */ - , <20 0 &gpioa 1 0> /* D20/A2 */ - , <21 0 &gpioa 2 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpioa 10 0> /* D0 */ + , <1 0 &gpioa 9 0> /* D1 */ + , <2 0 &gpiob 7 0> /* D2 */ + , <3 0 &gpiob 6 0> /* D3 */ + , <4 0 &gpiob 5 0> /* D4/A6 */ + , <5 0 &gpiob 4 0> /* D5 */ + , <6 0 &gpiob 3 0> /* D6/A7 */ + , <7 0 &gpiob 2 0> /* D7 */ + , <8 0 &gpiob 1 0> /* D8/A8 */ + , <9 0 &gpiob 0 0> /* D9/A9 */ + , <10 0 &gpiob 9 0> /* D10/A10 */ + , <16 0 &gpiob 15 0> /* D16 */ + , <14 0 &gpiob 14 0> /* D14 */ + , <15 0 &gpiob 13 0> /* D15 */ + , <18 0 &gpiob 8 0> /* D18/A0 */ + , <19 0 &gpioa 0 0> /* D19/A1 */ + , <20 0 &gpioa 1 0> /* D20/A2 */ + , <21 0 &gpioa 2 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpiob 8 0> /* D18/A0 */ - , <1 0 &gpioa 0 0> /* D19/A1 */ - , <2 0 &gpioa 1 0> /* D20/A2 */ - , <3 0 &gpioa 2 0> /* D21/A3 */ - , <6 0 &gpiob 5 0> /* D4/A6 */ - , <7 0 &gpiob 3 0> /* D6/A7 */ - , <8 0 &gpiob 1 0> /* D8/A8 */ - , <9 0 &gpiob 0 0> /* D9/A9 */ - , <10 0 &gpiob 9 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpiob 8 0> /* D18/A0 */ + , <1 0 &gpioa 0 0> /* D19/A1 */ + , <2 0 &gpioa 1 0> /* D20/A2 */ + , <3 0 &gpioa 2 0> /* D21/A3 */ + , <6 0 &gpiob 5 0> /* D4/A6 */ + , <7 0 &gpiob 3 0> /* D6/A7 */ + , <8 0 &gpiob 1 0> /* D8/A8 */ + , <9 0 &gpiob 0 0> /* D9/A9 */ + , <10 0 &gpiob 9 0> /* D10/A10 */ + ; + }; }; pro_micro_d: &pro_micro {}; diff --git a/app/boards/arm/proton_c/proton_c.dts b/app/boards/arm/proton_c/proton_c.dts index df63427f..b5a490ee 100644 --- a/app/boards/arm/proton_c/proton_c.dts +++ b/app/boards/arm/proton_c/proton_c.dts @@ -10,91 +10,91 @@ #include "arduino_pro_micro_pins.dtsi" / { - model = "QMK Proton C"; - compatible = "qmk,proton_c", "st,stm32f303"; + model = "QMK Proton C"; + compatible = "qmk,proton_c", "st,stm32f303"; - chosen { - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart0; - }; + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart0; + }; - aliases { - led0 = &led; - }; + aliases { + led0 = &led; + }; - leds { - compatible = "gpio-leds"; - led: led_0 { - gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>; - label = "User LED"; - }; - }; + leds { + compatible = "gpio-leds"; + led: led_0 { + gpios = <&gpioc 13 GPIO_ACTIVE_HIGH>; + label = "User LED"; + }; + }; }; &usart1 { - pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; - pinctrl-names = "default"; + pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>; + pinctrl-names = "default"; }; &spi2 { - pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; - pinctrl-names = "default"; + pinctrl-0 = <&spi2_sck_pb13 &spi2_miso_pb14 &spi2_mosi_pb15>; + pinctrl-names = "default"; }; &i2c1 { - pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>; - pinctrl-names = "default"; + pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>; + pinctrl-names = "default"; }; &clk_hse { - status = "okay"; - clock-frequency = ; + status = "okay"; + clock-frequency = ; }; &pll { - prediv = <1>; - mul = <9>; - clocks = <&clk_hse>; - status = "okay"; + prediv = <1>; + mul = <9>; + clocks = <&clk_hse>; + status = "okay"; }; &rcc { - clocks = <&pll>; - clock-frequency = ; - ahb-prescaler = <1>; - apb1-prescaler = <2>; - apb2-prescaler = <1>; + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; }; &usb { - pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; - pinctrl-names = "default"; - status = "okay"; - cdc_acm_uart0: cdc_acm_uart0 { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &rtc { - status = "okay"; + status = "okay"; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - /* Set 6Kb of storage at the end of the 256Kb of flash */ - storage_partition: partition@3e800 { - label = "storage"; - reg = <0x0003e800 0x00001800>; - }; - }; + /* Set 6Kb of storage at the end of the 256Kb of flash */ + storage_partition: partition@3e800 { + label = "storage"; + reg = <0x0003e800 0x00001800>; + }; + }; }; diff --git a/app/boards/arm/puchi_ble/Kconfig.board b/app/boards/arm/puchi_ble/Kconfig.board index 07638885..0f5b7f96 100644 --- a/app/boards/arm/puchi_ble/Kconfig.board +++ b/app/boards/arm/puchi_ble/Kconfig.board @@ -4,5 +4,5 @@ # SPDX-License-Identifier: MIT config BOARD_PUCHI_BLE_v1 - bool "puchi_ble_v1" - depends on SOC_NRF52840_QIAA + bool "puchi_ble_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/puchi_ble/Kconfig.defconfig b/app/boards/arm/puchi_ble/Kconfig.defconfig index 94d12c17..c4fca8e1 100644 --- a/app/boards/arm/puchi_ble/Kconfig.defconfig +++ b/app/boards/arm/puchi_ble/Kconfig.defconfig @@ -4,25 +4,25 @@ if BOARD_PUCHI_BLE_v1 config BOARD - default "puchi_ble" + default "puchi_ble" if USB_DEVICE_STACK config USB_NRFX - default y + default y endif # USB_DEVICE_STACK config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y config PINMUX - default y + default y endif # BOARD_PUCHI_BLE_v1 diff --git a/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi index ed3317f1..3037ea3e 100644 --- a/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi +++ b/app/boards/arm/puchi_ble/arduino_pro_micro_pins.dtsi @@ -6,50 +6,50 @@ / { - pro_micro: connector { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 8 0> /* D0 */ - , <1 0 &gpio0 6 0> /* D1 */ - , <2 0 &gpio0 15 0> /* D2 */ - , <3 0 &gpio0 17 0> /* D3 */ - , <4 0 &gpio0 20 0> /* D4/A6 */ - , <5 0 &gpio0 13 0> /* D5 */ - , <6 0 &gpio0 24 0> /* D6/A7 */ - , <7 0 &gpio0 9 0> /* D7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - , <16 0 &gpio0 28 0> /* D16 */ - , <14 0 &gpio0 3 0> /* D14 */ - , <15 0 &gpio1 13 0> /* D15 */ - , <18 0 &gpio0 2 0> /* D18/A0 */ - , <19 0 &gpio0 29 0> /* D19/A1 */ - , <20 0 &gpio0 31 0> /* D20/A2 */ - , <21 0 &gpio0 30 0> /* D21/A3 */ - ; - }; + pro_micro: connector { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 8 0> /* D0 */ + , <1 0 &gpio0 6 0> /* D1 */ + , <2 0 &gpio0 15 0> /* D2 */ + , <3 0 &gpio0 17 0> /* D3 */ + , <4 0 &gpio0 20 0> /* D4/A6 */ + , <5 0 &gpio0 13 0> /* D5 */ + , <6 0 &gpio0 24 0> /* D6/A7 */ + , <7 0 &gpio0 9 0> /* D7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + , <16 0 &gpio0 28 0> /* D16 */ + , <14 0 &gpio0 3 0> /* D14 */ + , <15 0 &gpio1 13 0> /* D15 */ + , <18 0 &gpio0 2 0> /* D18/A0 */ + , <19 0 &gpio0 29 0> /* D19/A1 */ + , <20 0 &gpio0 31 0> /* D20/A2 */ + , <21 0 &gpio0 30 0> /* D21/A3 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &gpio0 2 0> /* D18/A0 */ - , <1 0 &gpio0 29 0> /* D19/A1 */ - , <2 0 &gpio0 31 0> /* D20/A2 */ - , <3 0 &gpio0 30 0> /* D21/A3 */ - , <6 0 &gpio0 20 0> /* D4/A6 */ - , <7 0 &gpio0 24 0> /* D6/A7 */ - , <8 0 &gpio0 10 0> /* D8/A8 */ - , <9 0 &gpio1 6 0> /* D9/A9 */ - , <10 0 &gpio1 11 0> /* D10/A10 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &gpio0 2 0> /* D18/A0 */ + , <1 0 &gpio0 29 0> /* D19/A1 */ + , <2 0 &gpio0 31 0> /* D20/A2 */ + , <3 0 &gpio0 30 0> /* D21/A3 */ + , <6 0 &gpio0 20 0> /* D4/A6 */ + , <7 0 &gpio0 24 0> /* D6/A7 */ + , <8 0 &gpio0 10 0> /* D8/A8 */ + , <9 0 &gpio1 6 0> /* D9/A9 */ + , <10 0 &gpio1 11 0> /* D10/A10 */ + ; + }; }; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi index a5385690..35a46e5a 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi +++ b/app/boards/arm/puchi_ble/puchi_ble_v1-pinctrl.dtsi @@ -4,36 +4,36 @@ */ &pinctrl { - uart0_default: uart0_default { - group1 { - psels = ; - bias-pull-up; - }; - group2 { - psels = ; - }; - }; + uart0_default: uart0_default { + group1 { + psels = ; + bias-pull-up; + }; + group2 { + psels = ; + }; + }; - uart0_sleep: uart0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; - i2c0_default: i2c0_default { - group1 { - psels = , - ; - }; - }; + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; - i2c0_sleep: i2c0_sleep { - group1 { - psels = , - ; - low-power-enable; - }; - }; + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; }; diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1.dts b/app/boards/arm/puchi_ble/puchi_ble_v1.dts index a8f25c37..b056f711 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1.dts +++ b/app/boards/arm/puchi_ble/puchi_ble_v1.dts @@ -10,115 +10,115 @@ #include "puchi_ble_v1-pinctrl.dtsi" / { - model = "puchi_ble"; - compatible = "puchi_ble"; + model = "puchi_ble"; + compatible = "puchi_ble"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - ext-power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; - }; + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &i2c0 { - compatible = "nordic,nrf-twi"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-twi"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; }; &uart0 { - compatible = "nordic,nrf-uarte"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "softdevice"; - reg = <0x00000000 0x00026000>; - }; - code_partition: partition@26000 { - label = "code_partition"; - reg = <0x00026000 0x000c6000>; - }; + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; - /* - * The flash starting at 0x000ec000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@ec000 { - label = "storage"; - reg = <0x000ec000 0x00008000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/s40nc/Kconfig.board b/app/boards/arm/s40nc/Kconfig.board index 673e3b24..e703d726 100644 --- a/app/boards/arm/s40nc/Kconfig.board +++ b/app/boards/arm/s40nc/Kconfig.board @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config BOARD_S40NC - bool "S40NC" - depends on SOC_NRF52840_QIAA + bool "S40NC" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/s40nc/Kconfig.defconfig b/app/boards/arm/s40nc/Kconfig.defconfig index 266f8443..11e62cf5 100644 --- a/app/boards/arm/s40nc/Kconfig.defconfig +++ b/app/boards/arm/s40nc/Kconfig.defconfig @@ -4,25 +4,25 @@ if BOARD_S40NC config ZMK_KEYBOARD_NAME - default "S40NC" + default "S40NC" if USB config USB_NRFX - default y + default y config USB_DEVICE_STACK - default y + default y endif # USB config BT_CTLR - default BT + default BT config ZMK_BLE - default y + default y config ZMK_USB - default y + default y endif # BOARD_S40NC diff --git a/app/boards/arm/s40nc/s40nc.dts b/app/boards/arm/s40nc/s40nc.dts index 5b588b45..6eb9e2a5 100644 --- a/app/boards/arm/s40nc/s40nc.dts +++ b/app/boards/arm/s40nc/s40nc.dts @@ -9,137 +9,137 @@ #include / { - model = "S40NC"; - compatible = "s40nc"; + model = "S40NC"; + compatible = "s40nc"; - chosen { - zephyr,code-partition = &code_partition; - zephyr,sram = &sram0; - zephyr,flash = &flash0; - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; - map = < + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,11) RC(2,0) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,6) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio1 2 GPIO_ACTIVE_HIGH> - , <&gpio1 1 GPIO_ACTIVE_HIGH> - , <&gpio1 3 GPIO_ACTIVE_HIGH> - , <&gpio1 0 GPIO_ACTIVE_HIGH> - , <&gpio0 22 GPIO_ACTIVE_HIGH> - , <&gpio1 15 GPIO_ACTIVE_HIGH> - , <&gpio0 3 GPIO_ACTIVE_HIGH> - , <&gpio0 2 GPIO_ACTIVE_HIGH> - , <&gpio0 28 GPIO_ACTIVE_HIGH> - , <&gpio0 29 GPIO_ACTIVE_HIGH> - , <&gpio0 30 GPIO_ACTIVE_HIGH> - , <&gpio0 31 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio1 2 GPIO_ACTIVE_HIGH> + , <&gpio1 1 GPIO_ACTIVE_HIGH> + , <&gpio1 3 GPIO_ACTIVE_HIGH> + , <&gpio1 0 GPIO_ACTIVE_HIGH> + , <&gpio0 22 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + ; + }; - leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; - }; + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 2>; - output-ohms = <2000000>; - full-ohms = <(2000000 + 820000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 2>; + output-ohms = <2000000>; + full-ohms = <(2000000 + 820000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &gpiote { - status = "okay"; + status = "okay"; }; &gpio0 { - status = "okay"; + status = "okay"; }; &gpio1 { - status = "okay"; + status = "okay"; }; &usbd { - status = "okay"; - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; &flash0 { - /* - * For more information, see: - * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html - */ - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; - sd_partition: partition@0 { - label = "mbr"; - reg = <0x00000000 0x00001000>; - }; + sd_partition: partition@0 { + label = "mbr"; + reg = <0x00000000 0x00001000>; + }; - code_partition: partition@1000 { - label = "code_partition"; - reg = <0x00001000 0x000d3000>; - }; + code_partition: partition@1000 { + label = "code_partition"; + reg = <0x00001000 0x000d3000>; + }; - /* - * The flash starting at 0x000d4000 and ending at - * 0x000f3fff is reserved for use by the application. - */ + /* + * The flash starting at 0x000d4000 and ending at + * 0x000f3fff is reserved for use by the application. + */ - /* - * Storage partition will be used by FCB/LittleFS/NVS - * if enabled. - */ - storage_partition: partition@d4000 { - label = "storage"; - reg = <0x000d4000 0x00020000>; - }; + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@d4000 { + label = "storage"; + reg = <0x000d4000 0x00020000>; + }; - boot_partition: partition@f4000 { - label = "adafruit_boot"; - reg = <0x000f4000 0x0000c000>; - }; - }; + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; }; diff --git a/app/boards/arm/s40nc/s40nc.keymap b/app/boards/arm/s40nc/s40nc.keymap index f0e60e7d..dfc352d7 100644 --- a/app/boards/arm/s40nc/s40nc.keymap +++ b/app/boards/arm/s40nc/s40nc.keymap @@ -15,44 +15,44 @@ #define CONTROL 3 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &mo LOWER &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp ENTER &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp FSLH &kp UP &kp RSHFT &kp LCTRL &kp LGUI &kp LALT < LOWER SPACE < CONTROL SPACE < RAISE SPACE &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - lower_layer { - bindings = < + lower_layer { + bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &kp PSCRN &kp MINUS &kp EQUAL &trans &trans &trans &trans &kp LBKT &kp RBKT &kp SEMI &kp APOS &trans &trans &trans &trans &trans &trans &trans &kp COMMA &kp DOT &kp PG_UP &kp BSLH &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END - >; - }; + >; + }; raise_layer { - bindings = < + bindings = < &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &trans &kp PSCRN &kp UNDER &kp PLUS &trans &trans &trans &trans &kp LBRC &kp RBRC &kp COLON &kp DQT &trans &trans &trans &trans &trans &trans &trans &kp LT &kp GT &kp PG_UP &kp PIPE &trans &trans &trans &kp TAB &kp TAB &kp TAB &kp HOME &kp PG_DN &kp END - >; - }; + >; + }; control_layer { - bindings = < + bindings = < &bt BT_CLR &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp C_PP &bt BT_SEL 0 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &kp K_LOCK &bt BT_SEL 1 &out OUT_USB &kp CAPS &kp KP_NUM &kp SLCK &trans &trans &kp COMMA &kp DOT &kp K_VOL_UP &kp K_MUTE &bt BT_SEL 2 &out OUT_BLE &kp PAUSE_BREAK &sys_reset &trans &bootloader &kp C_BRI_DN &kp K_VOL_DN &kp C_BRI_UP - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/native_posix.overlay b/app/boards/native_posix.overlay index 2c1ed79d..f8a8f700 100644 --- a/app/boards/native_posix.overlay +++ b/app/boards/native_posix.overlay @@ -3,16 +3,16 @@ #include / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-mock"; - label = "KSCAN_MOCK"; + kscan: kscan { + compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; - rows = <2>; - columns = <2>; - exit-after; - }; + rows = <2>; + columns = <2>; + exit-after; + }; }; diff --git a/app/boards/native_posix_64.overlay b/app/boards/native_posix_64.overlay index 2c1ed79d..f8a8f700 100644 --- a/app/boards/native_posix_64.overlay +++ b/app/boards/native_posix_64.overlay @@ -3,16 +3,16 @@ #include / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-mock"; - label = "KSCAN_MOCK"; + kscan: kscan { + compatible = "zmk,kscan-mock"; + label = "KSCAN_MOCK"; - rows = <2>; - columns = <2>; - exit-after; - }; + rows = <2>; + columns = <2>; + exit-after; + }; }; diff --git a/app/boards/seeeduino_xiao.overlay b/app/boards/seeeduino_xiao.overlay index 70080286..a2ddaea4 100644 --- a/app/boards/seeeduino_xiao.overlay +++ b/app/boards/seeeduino_xiao.overlay @@ -5,15 +5,15 @@ */ / { - chosen { - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,console = &cdc_acm_uart; + }; }; &usb0 { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay index 452786d1..51671a80 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -6,29 +6,29 @@ / { - chosen { - zephyr,console = &cdc_acm_uart; - zmk,battery = &vbatt; - }; + chosen { + zephyr,console = &cdc_acm_uart; + zmk,battery = &vbatt; + }; - vbatt: vbatt { - compatible = "zmk,battery-voltage-divider"; - label = "BATTERY"; - io-channels = <&adc 7>; - power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; - output-ohms = <510000>; - full-ohms = <(1000000 + 510000)>; - }; + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 7>; + power-gpios = <&gpio0 14 (GPIO_OPEN_DRAIN | GPIO_ACTIVE_LOW)>; + output-ohms = <510000>; + full-ohms = <(1000000 + 510000)>; + }; }; &adc { - status = "okay"; + status = "okay"; }; &usbd { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/boards/shields/Kconfig.defconfig b/app/boards/shields/Kconfig.defconfig index 5b9ca9a1..58dd45d6 100644 --- a/app/boards/shields/Kconfig.defconfig +++ b/app/boards/shields/Kconfig.defconfig @@ -2,13 +2,13 @@ config ZMK_KEYBOARD_NAME - default "cradios" + default "cradios" # Unable to use interrupts as the same pin number is used # across A & B controllers, and STM32F303CCT6 can't enable # interrutps for multiple controllers for the same "line" # for the external interrupts. config ZMK_KSCAN_GPIO_POLLING - default y + default y diff --git a/app/boards/shields/Kconfig.shield b/app/boards/shields/Kconfig.shield index 844d4332..cab78898 100644 --- a/app/boards/shields/Kconfig.shield +++ b/app/boards/shields/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CRADIOS - def_bool $(shields_list_contains,cradios) + def_bool $(shields_list_contains,cradios) diff --git a/app/boards/shields/a_dux/Kconfig.defconfig b/app/boards/shields/a_dux/Kconfig.defconfig index 53cd1986..2dc40dbe 100644 --- a/app/boards/shields/a_dux/Kconfig.defconfig +++ b/app/boards/shields/a_dux/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_A_DUX_LEFT config ZMK_KEYBOARD_NAME - default "A. Dux" + default "A. Dux" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_A_DUX_LEFT || SHIELD_A_DUX_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/a_dux/Kconfig.shield b/app/boards/shields/a_dux/Kconfig.shield index 6058f290..928f432c 100644 --- a/app/boards/shields/a_dux/Kconfig.shield +++ b/app/boards/shields/a_dux/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_A_DUX_LEFT - def_bool $(shields_list_contains,a_dux_left) + def_bool $(shields_list_contains,a_dux_left) config SHIELD_A_DUX_RIGHT - def_bool $(shields_list_contains,a_dux_right) + def_bool $(shields_list_contains,a_dux_right) diff --git a/app/boards/shields/a_dux/a_dux.dtsi b/app/boards/shields/a_dux/a_dux.dtsi index 4840227c..28156f42 100644 --- a/app/boards/shields/a_dux/a_dux.dtsi +++ b/app/boards/shields/a_dux/a_dux.dtsi @@ -8,45 +8,45 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; - input-gpios = - <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, - <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + input-gpios = + <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>, + <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/a_dux/a_dux.keymap b/app/boards/shields/a_dux/a_dux.keymap index eda03ff9..0f162a33 100644 --- a/app/boards/shields/a_dux/a_dux.keymap +++ b/app/boards/shields/a_dux/a_dux.keymap @@ -9,18 +9,18 @@ / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - // This is a sample keymap intended to be replaced with your own - base_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI - &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH - &kp TAB &kp BSPC &kp SPACE &kp ENTER - >; - }; + // This is a sample keymap intended to be replaced with your own + base_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH + &kp TAB &kp BSPC &kp SPACE &kp ENTER + >; + }; - }; + }; }; diff --git a/app/boards/shields/a_dux/a_dux_right.overlay b/app/boards/shields/a_dux/a_dux_right.overlay index 0034317e..d4aed65c 100644 --- a/app/boards/shields/a_dux/a_dux_right.overlay +++ b/app/boards/shields/a_dux/a_dux_right.overlay @@ -7,5 +7,5 @@ #include "a_dux.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/bfo9000/Kconfig.defconfig b/app/boards/shields/bfo9000/Kconfig.defconfig index 7e9ccf9c..7e41b04a 100644 --- a/app/boards/shields/bfo9000/Kconfig.defconfig +++ b/app/boards/shields/bfo9000/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_BFO9000_LEFT config ZMK_KEYBOARD_NAME - default "BFO-9000" + default "BFO-9000" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_BFO9000_LEFT || SHIELD_BFO9000_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/bfo9000/Kconfig.shield b/app/boards/shields/bfo9000/Kconfig.shield index 4750e43a..5746abbe 100644 --- a/app/boards/shields/bfo9000/Kconfig.shield +++ b/app/boards/shields/bfo9000/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_BFO9000_LEFT - def_bool $(shields_list_contains,bfo9000_left) + def_bool $(shields_list_contains,bfo9000_left) config SHIELD_BFO9000_RIGHT - def_bool $(shields_list_contains,bfo9000_right) + def_bool $(shields_list_contains,bfo9000_right) diff --git a/app/boards/shields/bfo9000/bfo9000.dtsi b/app/boards/shields/bfo9000/bfo9000.dtsi index 0ceb9127..c5547920 100644 --- a/app/boards/shields/bfo9000/bfo9000.dtsi +++ b/app/boards/shields/bfo9000/bfo9000.dtsi @@ -7,38 +7,38 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <18>; - rows = <6>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(1,16) RC(1,17) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(2,16) RC(2,17) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) RC(3,15) RC(3,16) RC(3,17) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) RC(4,16) RC(4,17) - RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) RC(5,6) RC(5,7) RC(5,8) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) RC(5,16) RC(5,17) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <18>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(0,16) RC(0,17) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(1,16) RC(1,17) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(2,16) RC(2,17) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,14) RC(3,15) RC(3,16) RC(3,17) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) RC(4,16) RC(4,17) + RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(5,5) RC(5,6) RC(5,7) RC(5,8) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) RC(5,16) RC(5,17) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/bfo9000/bfo9000.keymap b/app/boards/shields/bfo9000/bfo9000.keymap index 22186a1d..18a2085c 100644 --- a/app/boards/shields/bfo9000/bfo9000.keymap +++ b/app/boards/shields/bfo9000/bfo9000.keymap @@ -15,41 +15,41 @@ #define LOWER 1 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | - // | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc | - // | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ | - // | Pg Up | Caps | Ctrl | A | S | D | F | G | H | G | H | J | K | L | ; | ' | Enter | Enter | - // | Pg Dn | Up | Shift | Z | X | C | V | B | N | B | N | M | , | . | / | Shift | Up | | - // | Left | Dn | Right | Ctrl | Alt | Win | Spc | Spc | Enter | Bk Spc | Spc | Spc | Win | Alt | Ctrl | Left | Dn | Right | - bindings = < - &kp ESC &kp C_VOL_UP &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL - &kp HOME &kp C_VOL_DN &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp END &kp TAB &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp PG_UP &kp CAPS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp APOS &kp ENTER &kp ENTER - &kp PG_DN &kp UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP &mo LOWER - &kp LEFT &kp DOWN &kp RIGHT &kp LCTRL &kp LALT &kp LMETA &kp SPACE &kp SPACE &kp ENTER &kp BSPC &kp SPACE &kp SPACE &kp RMETA &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; + default_layer { + // | Esc | Vol Up | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | + // | Home | Vol Dn | ` | 1 | 2 | 3 | 4 | 5 | 6 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bk Spc | + // | End | Tab | Tab | Q | W | E | R | T | Y | T | Y | U | I | O | P | [ | ] | \ | + // | Pg Up | Caps | Ctrl | A | S | D | F | G | H | G | H | J | K | L | ; | ' | Enter | Enter | + // | Pg Dn | Up | Shift | Z | X | C | V | B | N | B | N | M | , | . | / | Shift | Up | | + // | Left | Dn | Right | Ctrl | Alt | Win | Spc | Spc | Enter | Bk Spc | Spc | Spc | Win | Alt | Ctrl | Left | Dn | Right | + bindings = < + &kp ESC &kp C_VOL_UP &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &kp HOME &kp C_VOL_DN &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp END &kp TAB &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp PG_UP &kp CAPS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp APOS &kp ENTER &kp ENTER + &kp PG_DN &kp UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RSHFT &kp UP &mo LOWER + &kp LEFT &kp DOWN &kp RIGHT &kp LCTRL &kp LALT &kp LMETA &kp SPACE &kp SPACE &kp ENTER &kp BSPC &kp SPACE &kp SPACE &kp RMETA &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; - lower_layer { - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - // | | | | | | | | | | | | | | | | | | | - bindings = < - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 - &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans - &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans - &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans - &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans - &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans - >; - }; - }; + lower_layer { + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + bindings = < + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_SEL 5 &bt BT_SEL 6 &bt BT_SEL 7 + &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans &out OUT_USB &out OUT_BLE &trans &trans &trans &trans &trans &trans &trans + &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans &ext_power EP_ON &ext_power EP_OFF &trans &trans &trans &trans &trans &trans &trans + &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans + &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &trans &trans &trans + &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/bfo9000/bfo9000_left.overlay b/app/boards/shields/bfo9000/bfo9000_left.overlay index 3f034d95..9e921053 100644 --- a/app/boards/shields/bfo9000/bfo9000_left.overlay +++ b/app/boards/shields/bfo9000/bfo9000_left.overlay @@ -7,15 +7,15 @@ #include "bfo9000.dtsi" &kscan0 { - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/bfo9000/bfo9000_right.overlay b/app/boards/shields/bfo9000/bfo9000_right.overlay index 30bd35e2..897c6b0b 100644 --- a/app/boards/shields/bfo9000/bfo9000_right.overlay +++ b/app/boards/shields/bfo9000/bfo9000_right.overlay @@ -7,19 +7,19 @@ #include "bfo9000.dtsi" &default_transform { - col-offset = <9>; + col-offset = <9>; }; &kscan0 { - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/boardsource3x4/Kconfig.shield b/app/boards/shields/boardsource3x4/Kconfig.shield index cda55d07..7f574cea 100644 --- a/app/boards/shields/boardsource3x4/Kconfig.shield +++ b/app/boards/shields/boardsource3x4/Kconfig.shield @@ -2,5 +2,5 @@ # SPDX-License-Identifier: MIT config SHIELD_BOARDSOURCE3X4 - def_bool $(shields_list_contains,boardsource3x4) + def_bool $(shields_list_contains,boardsource3x4) diff --git a/app/boards/shields/chalice/boards/nice_nano.overlay b/app/boards/shields/chalice/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/chalice/boards/nice_nano.overlay +++ b/app/boards/shields/chalice/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/chalice/boards/nice_nano_v2.overlay b/app/boards/shields/chalice/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/chalice/boards/nice_nano_v2.overlay +++ b/app/boards/shields/chalice/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/clog/Kconfig.defconfig b/app/boards/shields/clog/Kconfig.defconfig index 1ca779f3..53ded4d7 100644 --- a/app/boards/shields/clog/Kconfig.defconfig +++ b/app/boards/shields/clog/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_CLOG_LEFT config ZMK_KEYBOARD_NAME - default "Clog" + default "Clog" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CLOG_LEFT || SHIELD_CLOG_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/clog/Kconfig.shield b/app/boards/shields/clog/Kconfig.shield index 2301af94..69ecef8d 100644 --- a/app/boards/shields/clog/Kconfig.shield +++ b/app/boards/shields/clog/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CLOG_LEFT - def_bool $(shields_list_contains,clog_left) + def_bool $(shields_list_contains,clog_left) config SHIELD_CLOG_RIGHT - def_bool $(shields_list_contains,clog_right) + def_bool $(shields_list_contains,clog_right) diff --git a/app/boards/shields/clog/clog.dtsi b/app/boards/shields/clog/clog.dtsi index ccad150c..40e9a39f 100644 --- a/app/boards/shields/clog/clog.dtsi +++ b/app/boards/shields/clog/clog.dtsi @@ -8,44 +8,44 @@ / { chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) RC(0,21) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) RC(0,21) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; }; kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; }; diff --git a/app/boards/shields/clog/clog_right.overlay b/app/boards/shields/clog/clog_right.overlay index 0dc5d64f..8b0efb3d 100644 --- a/app/boards/shields/clog/clog_right.overlay +++ b/app/boards/shields/clog/clog_right.overlay @@ -7,5 +7,5 @@ #include "clog.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/clueboard_california/Kconfig.defconfig b/app/boards/shields/clueboard_california/Kconfig.defconfig index e101ea76..278aaa44 100644 --- a/app/boards/shields/clueboard_california/Kconfig.defconfig +++ b/app/boards/shields/clueboard_california/Kconfig.defconfig @@ -2,13 +2,13 @@ if SHIELD_CLUEBOARD_CALIFORNIA config ZMK_KEYBOARD_NAME - default "Clueboard California Macropad" + default "Clueboard California Macropad" # Unable to use interrupts as the same pin number is used # across A & B controllers, and STM32F303CCT6 can't enable # interrutps for multiple controllers for the same "line" # for the external interrupts. config ZMK_KSCAN_DIRECT_POLLING - default y + default y endif diff --git a/app/boards/shields/clueboard_california/Kconfig.shield b/app/boards/shields/clueboard_california/Kconfig.shield index eca025d1..e987d29a 100644 --- a/app/boards/shields/clueboard_california/Kconfig.shield +++ b/app/boards/shields/clueboard_california/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CLUEBOARD_CALIFORNIA - def_bool $(shields_list_contains,clueboard_california) + def_bool $(shields_list_contains,clueboard_california) diff --git a/app/boards/shields/clueboard_california/clueboard_california.keymap b/app/boards/shields/clueboard_california/clueboard_california.keymap index b9041c37..9af22fa1 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.keymap +++ b/app/boards/shields/clueboard_california/clueboard_california.keymap @@ -8,18 +8,18 @@ #include / { - keymap0: keymap { - compatible = "zmk,keymap"; + keymap0: keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp N9 &kp N8 - &kp N7 &kp N6 - &kp N5 - &kp N4 &kp N3 - &kp N2 &kp N1 - &kp N0 - >; - }; - }; + default_layer { + bindings = < + &kp N9 &kp N8 + &kp N7 &kp N6 + &kp N5 + &kp N4 &kp N3 + &kp N2 &kp N1 + &kp N0 + >; + }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/clueboard_california/clueboard_california.overlay b/app/boards/shields/clueboard_california/clueboard_california.overlay index 9f52d0d3..dfa5d9cf 100644 --- a/app/boards/shields/clueboard_california/clueboard_california.overlay +++ b/app/boards/shields/clueboard_california/clueboard_california.overlay @@ -5,30 +5,30 @@ */ / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-direct"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + label = "KSCAN"; - input-gpios - = <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpioa 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&gpiob 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpioa 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpiob 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; - // TODO: Per-key LED node(s) + // TODO: Per-key LED node(s) }; diff --git a/app/boards/shields/contra/Kconfig.shield b/app/boards/shields/contra/Kconfig.shield index 59412ff5..e9f8e804 100644 --- a/app/boards/shields/contra/Kconfig.shield +++ b/app/boards/shields/contra/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CONTRA - def_bool $(shields_list_contains,contra) \ No newline at end of file + def_bool $(shields_list_contains,contra) \ No newline at end of file diff --git a/app/boards/shields/corne/Kconfig.defconfig b/app/boards/shields/corne/Kconfig.defconfig index acf542d7..07dd07e9 100644 --- a/app/boards/shields/corne/Kconfig.defconfig +++ b/app/boards/shields/corne/Kconfig.defconfig @@ -1,44 +1,44 @@ if SHIELD_CORNE_LEFT config ZMK_KEYBOARD_NAME - default "Corne" + default "Corne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CORNE_LEFT || SHIELD_CORNE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/corne/Kconfig.shield b/app/boards/shields/corne/Kconfig.shield index 3cac86fe..099680b9 100644 --- a/app/boards/shields/corne/Kconfig.shield +++ b/app/boards/shields/corne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CORNE_LEFT - def_bool $(shields_list_contains,corne_left) + def_bool $(shields_list_contains,corne_left) config SHIELD_CORNE_RIGHT - def_bool $(shields_list_contains,corne_right) + def_bool $(shields_list_contains,corne_right) diff --git a/app/boards/shields/corne/boards/nice_nano.overlay b/app/boards/shields/corne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/corne/boards/nice_nano.overlay +++ b/app/boards/shields/corne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/corne/boards/nice_nano_v2.overlay b/app/boards/shields/corne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/corne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/corne/corne.dtsi b/app/boards/shields/corne/corne.dtsi index a9c1c287..0e9eddf9 100644 --- a/app/boards/shields/corne/corne.dtsi +++ b/app/boards/shields/corne/corne.dtsi @@ -7,77 +7,77 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/corne/corne.keymap b/app/boards/shields/corne/corne.keymap index 53218a86..0555cf41 100644 --- a/app/boards/shields/corne/corne.keymap +++ b/app/boards/shields/corne/corne.keymap @@ -35,7 +35,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -49,7 +49,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/shields/corne/corne_left.overlay b/app/boards/shields/corne/corne_left.overlay index fe7e3c78..117cb19e 100644 --- a/app/boards/shields/corne/corne_left.overlay +++ b/app/boards/shields/corne/corne_left.overlay @@ -7,12 +7,12 @@ #include "corne.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/corne/corne_right.overlay b/app/boards/shields/corne/corne_right.overlay index 1d7ed9ec..a8a0cfe7 100644 --- a/app/boards/shields/corne/corne_right.overlay +++ b/app/boards/shields/corne/corne_right.overlay @@ -7,20 +7,20 @@ #include "corne.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/cradio/Kconfig.defconfig b/app/boards/shields/cradio/Kconfig.defconfig index b600383a..c5d03f4e 100644 --- a/app/boards/shields/cradio/Kconfig.defconfig +++ b/app/boards/shields/cradio/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_CRADIO_LEFT config ZMK_KEYBOARD_NAME - default "Cradio" + default "Cradio" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_CRADIO_LEFT || SHIELD_CRADIO_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/cradio/Kconfig.shield b/app/boards/shields/cradio/Kconfig.shield index bb5f0735..affb1c53 100644 --- a/app/boards/shields/cradio/Kconfig.shield +++ b/app/boards/shields/cradio/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_CRADIO_LEFT - def_bool $(shields_list_contains,cradio_left) + def_bool $(shields_list_contains,cradio_left) config SHIELD_CRADIO_RIGHT - def_bool $(shields_list_contains,cradio_right) + def_bool $(shields_list_contains,cradio_right) diff --git a/app/boards/shields/cradio/README.md b/app/boards/shields/cradio/README.md index ee1cab0e..2c4e2e60 100644 --- a/app/boards/shields/cradio/README.md +++ b/app/boards/shields/cradio/README.md @@ -10,25 +10,25 @@ Some revisions of the aforementioned PCBs have slightly different pin arrangemen /* Adjusted Cradio pin arrangement */ /* The position of Q and B keys have been swapped */ &kscan0 { - input-gpios - = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; ``` diff --git a/app/boards/shields/cradio/cradio.dtsi b/app/boards/shields/cradio/cradio.dtsi index ca464c95..57dcfd4b 100644 --- a/app/boards/shields/cradio/cradio.dtsi +++ b/app/boards/shields/cradio/cradio.dtsi @@ -8,45 +8,45 @@ / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <34>; - rows = <1>; - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) - RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) - RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) - RC(0,15) RC(0,16) RC(0,33) RC(0,32) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <34>; + rows = <1>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,21) RC(0,20) RC(0,19) RC(0,18) RC(0,17) + RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,26) RC(0,25) RC(0,24) RC(0,23) RC(0,22) + RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,31) RC(0,30) RC(0,29) RC(0,28) RC(0,27) + RC(0,15) RC(0,16) RC(0,33) RC(0,32) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; - input-gpios - = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + input-gpios + = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/cradio/cradio_right.overlay b/app/boards/shields/cradio/cradio_right.overlay index 41436e97..fea9ae1c 100644 --- a/app/boards/shields/cradio/cradio_right.overlay +++ b/app/boards/shields/cradio/cradio_right.overlay @@ -7,5 +7,5 @@ #include "cradio.dtsi" &default_transform { - col-offset = <17>; + col-offset = <17>; }; diff --git a/app/boards/shields/crbn/Kconfig.defconfig b/app/boards/shields/crbn/Kconfig.defconfig index 2a5c8e39..c00e97a4 100644 --- a/app/boards/shields/crbn/Kconfig.defconfig +++ b/app/boards/shields/crbn/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_CRBN config ZMK_KEYBOARD_NAME - default "CRBN" + default "CRBN" endif diff --git a/app/boards/shields/crbn/Kconfig.shield b/app/boards/shields/crbn/Kconfig.shield index ceeb5f63..bf92dbf1 100644 --- a/app/boards/shields/crbn/Kconfig.shield +++ b/app/boards/shields/crbn/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_CRBN - def_bool $(shields_list_contains,crbn) + def_bool $(shields_list_contains,crbn) diff --git a/app/boards/shields/crbn/crbn.keymap b/app/boards/shields/crbn/crbn.keymap index b967e5e2..f963ba84 100644 --- a/app/boards/shields/crbn/crbn.keymap +++ b/app/boards/shields/crbn/crbn.keymap @@ -9,54 +9,54 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // ----------------------------------------------------------------------------------------- - // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | - // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | - // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET - &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT - >; + default_layer { + // ----------------------------------------------------------------------------------------- + // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | + // | ESC | A | S | D | F | G | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | + // | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | + bindings = < + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET + &trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - }; + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + }; - lower { - bindings = < - &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans - &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; + lower { + bindings = < + &kp LS(GRAVE) &kp LS(N1) &kp LS(N2) &kp LS(N3) &kp LS(N4) &kp LS(N5) &kp LS(N6) &kp LS(N7) &kp LS(N8) &kp LS(N9) &kp LS(N0) &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(HASH) &kp LS(BSLH) &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise { - bindings = < - &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans - &trans &trans &trans &trans &mo 3 &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP - >; + raise { + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp HASH &kp BSLH &kp PG_UP &kp PG_DN &trans + &trans &trans &trans &trans &mo 3 &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; - sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; - }; + sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; + }; - control { - bindings = < - &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - }; + control { + bindings = < + &sys_reset &bootloader &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/crbn/crbn.overlay b/app/boards/shields/crbn/crbn.overlay index 18382cce..817a83d0 100644 --- a/app/boards/shields/crbn/crbn.overlay +++ b/app/boards/shields/crbn/crbn.overlay @@ -7,49 +7,49 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 3 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 3 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + row-gpios + = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - encoder: encoder { - compatible = "alps,ec11"; - label = "ENCODER"; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <2>; - status = "okay"; - }; + encoder: encoder { + compatible = "alps,ec11"; + label = "ENCODER"; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + status = "okay"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; }; diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig index 55ee6c87..70a312c1 100644 --- a/app/boards/shields/elephant42/Kconfig.defconfig +++ b/app/boards/shields/elephant42/Kconfig.defconfig @@ -14,34 +14,34 @@ endif if SHIELD_ELEPHANT42_LEFT || SHIELD_ELEPHANT42_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/elephant42/boards/nice_nano.overlay b/app/boards/shields/elephant42/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/elephant42/boards/nice_nano.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay +++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi index 2d3f5166..b0e9a32e 100644 --- a/app/boards/shields/elephant42/elephant42.dtsi +++ b/app/boards/shields/elephant42/elephant42.dtsi @@ -40,21 +40,21 @@ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; \ No newline at end of file diff --git a/app/boards/shields/ergodash/Kconfig.defconfig b/app/boards/shields/ergodash/Kconfig.defconfig index 43cab0b1..34a87e8e 100644 --- a/app/boards/shields/ergodash/Kconfig.defconfig +++ b/app/boards/shields/ergodash/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_ERGODASH_LEFT config ZMK_KEYBOARD_NAME - default "Ergodash" + default "Ergodash" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_ERGODASH_LEFT || SHIELD_ERGODASH_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/ergodash/Kconfig.shield b/app/boards/shields/ergodash/Kconfig.shield index b3cca293..5814e21e 100644 --- a/app/boards/shields/ergodash/Kconfig.shield +++ b/app/boards/shields/ergodash/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ERGODASH_LEFT - def_bool $(shields_list_contains,ergodash_left) + def_bool $(shields_list_contains,ergodash_left) config SHIELD_ERGODASH_RIGHT - def_bool $(shields_list_contains,ergodash_right) + def_bool $(shields_list_contains,ergodash_right) diff --git a/app/boards/shields/ergodash/ergodash.dtsi b/app/boards/shields/ergodash/ergodash.dtsi index a2b76075..d109fa66 100644 --- a/app/boards/shields/ergodash/ergodash.dtsi +++ b/app/boards/shields/ergodash/ergodash.dtsi @@ -7,15 +7,15 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // Numbering based on rev 1.2 schema // * keys that can be in different positions are denoted as MW // * MW40 can be broken off @@ -24,38 +24,38 @@ // | SW3 | SW7 | SW11 | SW15 | SW19 | SW23 | SW27 | | | | SW27 | SW23 | SW19 | SW15 | SW11 | SW7 | SW3 | // | SW4 | SW8 | SW12 | SW16 | SW20 | SW24 | | MW28 | | MW28 | | SW24 | SW20 | SW16 | SW12 | SW8 | SW4 | // | SW30 | SW31 | SW32 | MW33 | SW34 | | MW35 | MW40 | | MW40 | MW35 | | SW34 | MW33 | SW32 | SW31 | SW30 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(0,7) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,7) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(2,8) RC(2,7) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(3,8) RC(3,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(4,8) RC(4,7) - >; + >; }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + col-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; }; diff --git a/app/boards/shields/ergodash/ergodash_right.overlay b/app/boards/shields/ergodash/ergodash_right.overlay index 464b3f5d..07fbbb70 100644 --- a/app/boards/shields/ergodash/ergodash_right.overlay +++ b/app/boards/shields/ergodash/ergodash_right.overlay @@ -7,5 +7,5 @@ #include "ergodash.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; diff --git a/app/boards/shields/eternal_keypad/Kconfig.defconfig b/app/boards/shields/eternal_keypad/Kconfig.defconfig index 4d4195ef..72514192 100644 --- a/app/boards/shields/eternal_keypad/Kconfig.defconfig +++ b/app/boards/shields/eternal_keypad/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_ETERNAL_KEYPAD || SHIELD_ETERNAL_KEYPAD_LEFTY config ZMK_KEYBOARD_NAME - default "Eternal Keypad" + default "Eternal Keypad" endif diff --git a/app/boards/shields/eternal_keypad/Kconfig.shield b/app/boards/shields/eternal_keypad/Kconfig.shield index 4a59379e..23015153 100644 --- a/app/boards/shields/eternal_keypad/Kconfig.shield +++ b/app/boards/shields/eternal_keypad/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ETERNAL_KEYPAD - def_bool $(shields_list_contains,eternal_keypad) + def_bool $(shields_list_contains,eternal_keypad) config SHIELD_ETERNAL_KEYPAD_LEFTY - def_bool $(shields_list_contains,eternal_keypad_lefty) + def_bool $(shields_list_contains,eternal_keypad_lefty) diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/eternal_keypad/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/fourier/Kconfig.defconfig b/app/boards/shields/fourier/Kconfig.defconfig index b887870c..a07ca714 100644 --- a/app/boards/shields/fourier/Kconfig.defconfig +++ b/app/boards/shields/fourier/Kconfig.defconfig @@ -5,16 +5,16 @@ if SHIELD_FOURIER_LEFT config ZMK_KEYBOARD_NAME - default "Fourier" + default "Fourier" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_FOURIER_LEFT || SHIELD_FOURIER_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/fourier/Kconfig.shield b/app/boards/shields/fourier/Kconfig.shield index 2e337410..ee28c7ac 100644 --- a/app/boards/shields/fourier/Kconfig.shield +++ b/app/boards/shields/fourier/Kconfig.shield @@ -3,7 +3,7 @@ config SHIELD_FOURIER_LEFT - def_bool $(shields_list_contains,fourier_left) + def_bool $(shields_list_contains,fourier_left) config SHIELD_FOURIER_RIGHT - def_bool $(shields_list_contains,fourier_right) + def_bool $(shields_list_contains,fourier_right) diff --git a/app/boards/shields/fourier/fourier.dtsi b/app/boards/shields/fourier/fourier.dtsi index 99027ea9..0902d687 100644 --- a/app/boards/shields/fourier/fourier.dtsi +++ b/app/boards/shields/fourier/fourier.dtsi @@ -7,37 +7,37 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - /* - * This transform correspondsto the 60% left without macro keypad and 65% right, even this - * combination of PCBs can have keys in different locations based on configuration. - */ - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <13>; - rows = <4>; - map = < + /* + * This transform correspondsto the 60% left without macro keypad and 65% right, even this + * combination of PCBs can have keys in different locations based on configuration. + */ + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <13>; + rows = <4>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) /**/ RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0, 11) RC(0,12) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/ RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,12) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,6) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) /**/ RC(3,6) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D - ; - }; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D + ; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano.overlay b/app/boards/shields/helix/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/helix/boards/nice_nano.overlay +++ b/app/boards/shields/helix/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/boards/nice_nano_v2.overlay b/app/boards/shields/helix/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/helix/boards/nice_nano_v2.overlay +++ b/app/boards/shields/helix/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/helix/helix_right.overlay b/app/boards/shields/helix/helix_right.overlay index 42dd0f52..0d3cc63d 100644 --- a/app/boards/shields/helix/helix_right.overlay +++ b/app/boards/shields/helix/helix_right.overlay @@ -7,7 +7,7 @@ #include "helix.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { diff --git a/app/boards/shields/hummingbird/hummingbird.overlay b/app/boards/shields/hummingbird/hummingbird.overlay index 0c48c128..1b40acba 100644 --- a/app/boards/shields/hummingbird/hummingbird.overlay +++ b/app/boards/shields/hummingbird/hummingbird.overlay @@ -10,8 +10,8 @@ chosen { zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; - /delete-property/ zephyr,console; - /delete-property/ zephyr,shell-uart; + /delete-property/ zephyr,console; + /delete-property/ zephyr,shell-uart; }; default_transform: keymap_transform_0 { diff --git a/app/boards/shields/iris/Kconfig.defconfig b/app/boards/shields/iris/Kconfig.defconfig index 83331d10..b68bc999 100644 --- a/app/boards/shields/iris/Kconfig.defconfig +++ b/app/boards/shields/iris/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_IRIS_LEFT config ZMK_KEYBOARD_NAME - default "Iris" + default "Iris" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_IRIS_LEFT || SHIELD_IRIS_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/iris/Kconfig.shield b/app/boards/shields/iris/Kconfig.shield index 370bd222..764d8101 100644 --- a/app/boards/shields/iris/Kconfig.shield +++ b/app/boards/shields/iris/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_IRIS_LEFT - def_bool $(shields_list_contains,iris_left) + def_bool $(shields_list_contains,iris_left) config SHIELD_IRIS_RIGHT - def_bool $(shields_list_contains,iris_right) + def_bool $(shields_list_contains,iris_right) diff --git a/app/boards/shields/iris/iris.dtsi b/app/boards/shields/iris/iris.dtsi index 0e976f86..a0caf1ad 100644 --- a/app/boards/shields/iris/iris.dtsi +++ b/app/boards/shields/iris/iris.dtsi @@ -7,41 +7,41 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/iris/iris.keymap b/app/boards/shields/iris/iris.keymap index 7c00d0a5..209c2277 100644 --- a/app/boards/shields/iris/iris.keymap +++ b/app/boards/shields/iris/iris.keymap @@ -9,55 +9,55 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | -// | GUI | LOWER| SPACE | | ENTER | RAISE| ALT | - bindings = < +// | GUI | LOWER| SPACE | | ENTER | RAISE| ALT | + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT - >; - }; + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE - &trans &trans &trans &trans &trans &trans - >; - }; + &trans &trans &trans &trans &trans &trans + >; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | ^ | v | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH - &trans &trans &trans &trans &trans &trans - >; - }; - }; + &trans &trans &trans &trans &trans &trans + >; + }; + }; }; diff --git a/app/boards/shields/iris/iris_left.overlay b/app/boards/shields/iris/iris_left.overlay index 2c52fca8..eb330d31 100644 --- a/app/boards/shields/iris/iris_left.overlay +++ b/app/boards/shields/iris/iris_left.overlay @@ -7,12 +7,12 @@ #include "iris.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/iris/iris_right.overlay b/app/boards/shields/iris/iris_right.overlay index 2ed712a2..d2375b18 100644 --- a/app/boards/shields/iris/iris_right.overlay +++ b/app/boards/shields/iris/iris_right.overlay @@ -7,16 +7,16 @@ #include "iris.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jian/Kconfig.defconfig b/app/boards/shields/jian/Kconfig.defconfig index bbdafbae..2f3d0a17 100644 --- a/app/boards/shields/jian/Kconfig.defconfig +++ b/app/boards/shields/jian/Kconfig.defconfig @@ -2,16 +2,16 @@ if SHIELD_JIAN_LEFT config ZMK_KEYBOARD_NAME - default "Jian" + default "Jian" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JIAN_LEFT || SHIELD_JIAN_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/jian/Kconfig.shield b/app/boards/shields/jian/Kconfig.shield index 5b874f03..efcfa214 100644 --- a/app/boards/shields/jian/Kconfig.shield +++ b/app/boards/shields/jian/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JIAN_LEFT - def_bool $(shields_list_contains,jian_left) + def_bool $(shields_list_contains,jian_left) config SHIELD_JIAN_RIGHT - def_bool $(shields_list_contains,jian_right) + def_bool $(shields_list_contains,jian_right) diff --git a/app/boards/shields/jian/jian.dtsi b/app/boards/shields/jian/jian.dtsi index 2b1eb391..8e772791 100644 --- a/app/boards/shields/jian/jian.dtsi +++ b/app/boards/shields/jian/jian.dtsi @@ -7,70 +7,70 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW0 | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | SW0 | // | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(2,0) RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) RC(2,11) RC(1,0) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(1,11) RC(2,1) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(2,10) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - crkbd_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + crkbd_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) + map = < + RC(0,0) RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(1,11) RC(2,1) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(2,10) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - five_column_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < - RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) + map = < + RC(0,1) RC(1,2) RC(0,2) RC(0,3) RC(0,4) RC(0,7) RC(0,8) RC(0,9) RC(1,9) RC(0,10) RC(1,1) RC(2,2) RC(1,3) RC(1,4) RC(0,5) RC(0,6) RC(1,7) RC(1,8) RC(2,9) RC(1,10) RC(3,2) RC(3,3) RC(2,3) RC(2,4) RC(1,5) RC(1,6) RC(2,7) RC(2,8) RC(3,8) RC(3,9) RC(3,4) RC(2,5) RC(3,5) RC(3,6) RC(2,6) RC(3,7) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/jian/jian_left.overlay b/app/boards/shields/jian/jian_left.overlay index e7f9d5b5..e402f03b 100644 --- a/app/boards/shields/jian/jian_left.overlay +++ b/app/boards/shields/jian/jian_left.overlay @@ -7,12 +7,12 @@ #include "jian.dtsi" &kscan0 { - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jian/jian_right.overlay b/app/boards/shields/jian/jian_right.overlay index cac83fd3..f646741b 100644 --- a/app/boards/shields/jian/jian_right.overlay +++ b/app/boards/shields/jian/jian_right.overlay @@ -7,24 +7,24 @@ #include "jian.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jiran/Kconfig.defconfig b/app/boards/shields/jiran/Kconfig.defconfig index b5b1f97b..0c6683f4 100644 --- a/app/boards/shields/jiran/Kconfig.defconfig +++ b/app/boards/shields/jiran/Kconfig.defconfig @@ -4,16 +4,16 @@ if SHIELD_JIRAN_LEFT config ZMK_KEYBOARD_NAME - default "Jiran" + default "Jiran" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JIRAN_LEFT || SHIELD_JIRAN_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/jiran/Kconfig.shield b/app/boards/shields/jiran/Kconfig.shield index 8a24ace0..8f480723 100644 --- a/app/boards/shields/jiran/Kconfig.shield +++ b/app/boards/shields/jiran/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JIRAN_LEFT - def_bool $(shields_list_contains,jiran_left) + def_bool $(shields_list_contains,jiran_left) config SHIELD_JIRAN_RIGHT - def_bool $(shields_list_contains,jiran_right) + def_bool $(shields_list_contains,jiran_right) diff --git a/app/boards/shields/jiran/jiran.dtsi b/app/boards/shields/jiran/jiran.dtsi index f0727dd4..b7e74c27 100644 --- a/app/boards/shields/jiran/jiran.dtsi +++ b/app/boards/shields/jiran/jiran.dtsi @@ -7,76 +7,76 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW0 | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | SW0 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(4,0) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(4,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - jian_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + jian_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW0 | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | SW0 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(4,0) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(4,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - crkbd_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; + crkbd_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | // | SW25 | SW26 | SW27 | | SW27 | SW26 | SW25 | - map = < + map = < RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/jiran/jiran_left.overlay b/app/boards/shields/jiran/jiran_left.overlay index 4466202c..3b7f5e55 100644 --- a/app/boards/shields/jiran/jiran_left.overlay +++ b/app/boards/shields/jiran/jiran_left.overlay @@ -7,12 +7,12 @@ #include "jiran.dtsi" &kscan0 { - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jiran/jiran_right.overlay b/app/boards/shields/jiran/jiran_right.overlay index c3648797..668c5513 100644 --- a/app/boards/shields/jiran/jiran_right.overlay +++ b/app/boards/shields/jiran/jiran_right.overlay @@ -7,24 +7,24 @@ #include "jiran.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &jian_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jorne/Kconfig.defconfig b/app/boards/shields/jorne/Kconfig.defconfig index 775bb56a..04beb792 100644 --- a/app/boards/shields/jorne/Kconfig.defconfig +++ b/app/boards/shields/jorne/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_JORNE_LEFT config ZMK_KEYBOARD_NAME - default "Jorne" + default "Jorne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_JORNE_LEFT || SHIELD_JORNE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/jorne/Kconfig.shield b/app/boards/shields/jorne/Kconfig.shield index 88fd4e5a..37a3cab5 100644 --- a/app/boards/shields/jorne/Kconfig.shield +++ b/app/boards/shields/jorne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_JORNE_LEFT - def_bool $(shields_list_contains,jorne_left) + def_bool $(shields_list_contains,jorne_left) config SHIELD_JORNE_RIGHT - def_bool $(shields_list_contains,jorne_right) + def_bool $(shields_list_contains,jorne_right) diff --git a/app/boards/shields/jorne/boards/nice_nano.overlay b/app/boards/shields/jorne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/jorne/boards/nice_nano.overlay +++ b/app/boards/shields/jorne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/jorne/boards/nice_nano_v2.overlay b/app/boards/shields/jorne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/jorne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/jorne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/jorne/jorne.dtsi b/app/boards/shields/jorne/jorne.dtsi index bb862b8d..1d12b85c 100644 --- a/app/boards/shields/jorne/jorne.dtsi +++ b/app/boards/shields/jorne/jorne.dtsi @@ -7,93 +7,93 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW0 | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | SW0 | // | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(3,0) RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(3,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - crkbd_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + crkbd_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_2 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/jorne/jorne_left.overlay b/app/boards/shields/jorne/jorne_left.overlay index 7e132cd9..f0476b41 100644 --- a/app/boards/shields/jorne/jorne_left.overlay +++ b/app/boards/shields/jorne/jorne_left.overlay @@ -7,12 +7,12 @@ #include "jorne.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/jorne/jorne_right.overlay b/app/boards/shields/jorne/jorne_right.overlay index 698bf9dd..604f4816 100644 --- a/app/boards/shields/jorne/jorne_right.overlay +++ b/app/boards/shields/jorne/jorne_right.overlay @@ -7,24 +7,24 @@ #include "jorne.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &crkbd_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index 82f48b4c..2d162736 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_REV2_LEFT || SHIELD_KYRIA_REV3_LEFT config ZMK_KEYBOARD_NAME - default "Kyria" + default "Kyria" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_KYRIA config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/kyria/Kconfig.shield b/app/boards/shields/kyria/Kconfig.shield index 52df9378..a9d5ac4f 100644 --- a/app/boards/shields/kyria/Kconfig.shield +++ b/app/boards/shields/kyria/Kconfig.shield @@ -5,25 +5,25 @@ config SHIELD_KYRIA bool config SHIELD_KYRIA_LEFT - def_bool $(shields_list_contains,kyria_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_left) + select SHIELD_KYRIA config SHIELD_KYRIA_RIGHT - def_bool $(shields_list_contains,kyria_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_right) + select SHIELD_KYRIA config SHIELD_KYRIA_REV2_LEFT - def_bool $(shields_list_contains,kyria_rev2_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev2_left) + select SHIELD_KYRIA config SHIELD_KYRIA_REV2_RIGHT - def_bool $(shields_list_contains,kyria_rev2_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev2_right) + select SHIELD_KYRIA config SHIELD_KYRIA_REV3_LEFT - def_bool $(shields_list_contains,kyria_rev3_left) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev3_left) + select SHIELD_KYRIA config SHIELD_KYRIA_REV3_RIGHT - def_bool $(shields_list_contains,kyria_rev3_right) - select SHIELD_KYRIA + def_bool $(shields_list_contains,kyria_rev3_right) + select SHIELD_KYRIA diff --git a/app/boards/shields/kyria/boards/nice_nano.overlay b/app/boards/shields/kyria/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/kyria/boards/nice_nano.overlay +++ b/app/boards/shields/kyria/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nice_nano_v2.overlay b/app/boards/shields/kyria/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/kyria/boards/nice_nano_v2.overlay +++ b/app/boards/shields/kyria/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11.overlay b/app/boards/shields/kyria/boards/nrfmicro_11.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_11_flipped.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/boards/nrfmicro_13.overlay b/app/boards/shields/kyria/boards/nrfmicro_13.overlay index 172859ae..8754dec6 100644 --- a/app/boards/shields/kyria/boards/nrfmicro_13.overlay +++ b/app/boards/shields/kyria/boards/nrfmicro_13.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index cffe23b0..b98240e4 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -7,58 +7,58 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; // | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | // | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | // | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - map = < + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) - >; - }; + >; + }; }; &kscan0 { - row-gpios - = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; &left_encoder { - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - a-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria.keymap b/app/boards/shields/kyria/kyria.keymap index a8804dd9..9a2163db 100644 --- a/app/boards/shields/kyria/kyria.keymap +++ b/app/boards/shields/kyria/kyria.keymap @@ -8,23 +8,23 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index 1e61cc6b..2e10cd37 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -7,54 +7,54 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - }; + diode-direction = "col2row"; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - // TODO: RGB node(s) + // TODO: RGB node(s) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <64>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <63>; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/kyria/kyria_left.overlay b/app/boards/shields/kyria/kyria_left.overlay index 20ced548..d89a0775 100644 --- a/app/boards/shields/kyria/kyria_left.overlay +++ b/app/boards/shields/kyria/kyria_left.overlay @@ -7,18 +7,18 @@ #include "kyria.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev2.dtsi b/app/boards/shields/kyria/kyria_rev2.dtsi index b40af365..e61131bf 100644 --- a/app/boards/shields/kyria/kyria_rev2.dtsi +++ b/app/boards/shields/kyria/kyria_rev2.dtsi @@ -7,49 +7,49 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(2,15) RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) - >; - }; + >; + }; // | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | // | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | // | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - map = < + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,14) RC(3,2) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) - >; - }; + >; + }; }; &left_encoder { - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria_rev2.keymap b/app/boards/shields/kyria/kyria_rev2.keymap index a8804dd9..9a2163db 100644 --- a/app/boards/shields/kyria/kyria_rev2.keymap +++ b/app/boards/shields/kyria/kyria_rev2.keymap @@ -8,23 +8,23 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_rev2_left.overlay b/app/boards/shields/kyria/kyria_rev2_left.overlay index cee2e2a8..67eaeac2 100644 --- a/app/boards/shields/kyria/kyria_rev2_left.overlay +++ b/app/boards/shields/kyria/kyria_rev2_left.overlay @@ -7,24 +7,24 @@ #include "kyria_rev2.dtsi" &kscan0 { - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev2_right.overlay b/app/boards/shields/kyria/kyria_rev2_right.overlay index 9e29c6f7..acc806cf 100644 --- a/app/boards/shields/kyria/kyria_rev2_right.overlay +++ b/app/boards/shields/kyria/kyria_rev2_right.overlay @@ -7,32 +7,32 @@ #include "kyria_rev2.dtsi" &default_transform { - col-offset = <8>; + col-offset = <8>; }; &five_column_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan0 { - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev3.dtsi b/app/boards/shields/kyria/kyria_rev3.dtsi index 4a500006..0cf91c60 100644 --- a/app/boards/shields/kyria/kyria_rev3.dtsi +++ b/app/boards/shields/kyria/kyria_rev3.dtsi @@ -7,35 +7,35 @@ #include "kyria_common.dtsi" / { - chosen { - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <4>; - // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | - // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | - // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | - // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | - map = < - RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) - RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <4>; + // | MX6 | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | + // | MX12 | MX11 | MX10 | MX9 | MX8 | MX7 | | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | + // | MX20 | MX19 | MX18 | MX17 | MX16 | MX15 | MX14 | MX13 | | MX13 | MX14 | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | + // | MX25 | MX24 | MX23 | MX22 | MX21 | | MX21 | MX22 | MX23 | MX24 | MX25 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,3) RC(2,6) RC(2,7) RC(3,10) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,2) RC(3,4) RC(3,5) RC(3,1) RC(3,6) RC(3,7) RC(3,12) RC(3,8) RC(3,9) RC(3,11) + >; + }; }; &left_encoder { - resolution = <2>; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; &right_encoder { - resolution = <2>; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; }; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap index fff2e051..d74757ca 100644 --- a/app/boards/shields/kyria/kyria_rev3.keymap +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -9,30 +9,30 @@ /* Uncomment this block if using RGB &led_strip { - chain-length = <6>; - // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs - // chain-length = <25>; // Uncomment if using only per-key LEDs. + chain-length = <6>; + // chain-length = <31>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <25>; // Uncomment if using only per-key LEDs. }; */ / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - // --------------------------------------------------------------------------------------------------------------------------------- - // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | - // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | - // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | - bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | + // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | + bindings = < + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; diff --git a/app/boards/shields/kyria/kyria_rev3_left.overlay b/app/boards/shields/kyria/kyria_rev3_left.overlay index d00b9e4a..577b89dc 100644 --- a/app/boards/shields/kyria/kyria_rev3_left.overlay +++ b/app/boards/shields/kyria/kyria_rev3_left.overlay @@ -7,23 +7,23 @@ #include "kyria_rev3.dtsi" &kscan0 { - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_rev3_right.overlay b/app/boards/shields/kyria/kyria_rev3_right.overlay index ee69730c..88ed6589 100644 --- a/app/boards/shields/kyria/kyria_rev3_right.overlay +++ b/app/boards/shields/kyria/kyria_rev3_right.overlay @@ -7,27 +7,27 @@ #include "kyria_rev3.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/kyria/kyria_right.overlay b/app/boards/shields/kyria/kyria_right.overlay index 00ba5b2f..72d97027 100644 --- a/app/boards/shields/kyria/kyria_right.overlay +++ b/app/boards/shields/kyria/kyria_right.overlay @@ -7,27 +7,27 @@ #include "kyria.dtsi" &default_transform { - col-offset = <8>; + col-offset = <8>; }; &five_column_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index d5bfab3d..7388a4b9 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -4,28 +4,28 @@ if SHIELD_LEELOO_LEFT config ZMK_KEYBOARD_NAME - default "Leeloo" + default "Leeloo" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY @@ -33,16 +33,16 @@ if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/leeloo/Kconfig.shield b/app/boards/shields/leeloo/Kconfig.shield index 1736c6eb..46ea9640 100644 --- a/app/boards/shields/leeloo/Kconfig.shield +++ b/app/boards/shields/leeloo/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LEELOO_LEFT - def_bool $(shields_list_contains,leeloo_left) + def_bool $(shields_list_contains,leeloo_left) config SHIELD_LEELOO_RIGHT - def_bool $(shields_list_contains,leeloo_right) + def_bool $(shields_list_contains,leeloo_right) diff --git a/app/boards/shields/leeloo/leeloo.dtsi b/app/boards/shields/leeloo/leeloo.dtsi index 5f2cbeac..438f9a9d 100644 --- a/app/boards/shields/leeloo/leeloo.dtsi +++ b/app/boards/shields/leeloo/leeloo.dtsi @@ -67,21 +67,21 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/leeloo/leeloo_left.overlay b/app/boards/shields/leeloo/leeloo_left.overlay index 1d6424fd..59fce1b0 100644 --- a/app/boards/shields/leeloo/leeloo_left.overlay +++ b/app/boards/shields/leeloo/leeloo_left.overlay @@ -6,16 +6,16 @@ #include "leeloo.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/leeloo/leeloo_right.overlay b/app/boards/shields/leeloo/leeloo_right.overlay index 2f3fbf5c..80e89529 100644 --- a/app/boards/shields/leeloo/leeloo_right.overlay +++ b/app/boards/shields/leeloo/leeloo_right.overlay @@ -6,20 +6,20 @@ #include "leeloo.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index 97cecce1..e77a9c22 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_LILY58_LEFT config ZMK_KEYBOARD_NAME - default "Lily58" + default "Lily58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LILY58_LEFT || SHIELD_LILY58_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lily58/Kconfig.shield b/app/boards/shields/lily58/Kconfig.shield index 932e33b3..1b3bb6ba 100644 --- a/app/boards/shields/lily58/Kconfig.shield +++ b/app/boards/shields/lily58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LILY58_LEFT - def_bool $(shields_list_contains,lily58_left) + def_bool $(shields_list_contains,lily58_left) config SHIELD_LILY58_RIGHT - def_bool $(shields_list_contains,lily58_right) + def_bool $(shields_list_contains,lily58_right) diff --git a/app/boards/shields/lily58/boards/nice_nano.overlay b/app/boards/shields/lily58/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/lily58/boards/nice_nano.overlay +++ b/app/boards/shields/lily58/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/lily58/boards/nice_nano_v2.overlay b/app/boards/shields/lily58/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/lily58/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 1a296a8c..ec520f6b 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -7,75 +7,75 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/lily58/lily58.keymap b/app/boards/shields/lily58/lily58.keymap index dd935c7a..7df3277f 100644 --- a/app/boards/shields/lily58/lily58.keymap +++ b/app/boards/shields/lily58/lily58.keymap @@ -10,61 +10,61 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | // | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp TILDE &trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/shields/lily58/lily58_left.overlay b/app/boards/shields/lily58/lily58_left.overlay index daa53651..b95332d9 100644 --- a/app/boards/shields/lily58/lily58_left.overlay +++ b/app/boards/shields/lily58/lily58_left.overlay @@ -7,16 +7,16 @@ #include "lily58.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lily58/lily58_right.overlay b/app/boards/shields/lily58/lily58_right.overlay index 18ec806b..15820ad2 100644 --- a/app/boards/shields/lily58/lily58_right.overlay +++ b/app/boards/shields/lily58/lily58_right.overlay @@ -7,16 +7,16 @@ #include "lily58.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/lotus58/Kconfig.defconfig b/app/boards/shields/lotus58/Kconfig.defconfig index b6bb37d8..62695c20 100644 --- a/app/boards/shields/lotus58/Kconfig.defconfig +++ b/app/boards/shields/lotus58/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_LOTUS58_LEFT config ZMK_KEYBOARD_NAME - default "Lotus58" + default "Lotus58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_LOTUS58_LEFT || SHIELD_LOTUS58_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/lotus58/Kconfig.shield b/app/boards/shields/lotus58/Kconfig.shield index dbf7ba01..2d91c58c 100644 --- a/app/boards/shields/lotus58/Kconfig.shield +++ b/app/boards/shields/lotus58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_LOTUS58_LEFT - def_bool $(shields_list_contains,lotus58_left) + def_bool $(shields_list_contains,lotus58_left) config SHIELD_LOTUS58_RIGHT - def_bool $(shields_list_contains,lotus58_right) + def_bool $(shields_list_contains,lotus58_right) diff --git a/app/boards/shields/lotus58/lotus58_left.overlay b/app/boards/shields/lotus58/lotus58_left.overlay index a51659df..a1fc1e28 100644 --- a/app/boards/shields/lotus58/lotus58_left.overlay +++ b/app/boards/shields/lotus58/lotus58_left.overlay @@ -7,16 +7,16 @@ #include "lotus58.dtsi" &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/lotus58/lotus58_right.overlay b/app/boards/shields/lotus58/lotus58_right.overlay index dffcaeb1..5bdfe710 100644 --- a/app/boards/shields/lotus58/lotus58_right.overlay +++ b/app/boards/shields/lotus58/lotus58_right.overlay @@ -7,20 +7,20 @@ #include "lotus58.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/m60/Kconfig.defconfig b/app/boards/shields/m60/Kconfig.defconfig index ad105ed9..a4696954 100644 --- a/app/boards/shields/m60/Kconfig.defconfig +++ b/app/boards/shields/m60/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_M60 config ZMK_KEYBOARD_NAME - default "m60" + default "m60" endif diff --git a/app/boards/shields/m60/Kconfig.shield b/app/boards/shields/m60/Kconfig.shield index 4ed58c49..b1414b96 100644 --- a/app/boards/shields/m60/Kconfig.shield +++ b/app/boards/shields/m60/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_M60 - def_bool $(shields_list_contains,m60) + def_bool $(shields_list_contains,m60) diff --git a/app/boards/shields/m60/m60.keymap b/app/boards/shields/m60/m60.keymap index aa656929..8daa6b7c 100644 --- a/app/boards/shields/m60/m60.keymap +++ b/app/boards/shields/m60/m60.keymap @@ -9,10 +9,10 @@ #include / { - keymap0: keymap { - compatible = "zmk,keymap"; + keymap0: keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | @@ -20,23 +20,23 @@ // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | CTL | WIN | ALT | SPACE | ALT | MO(1) | WIN | CTRL | // ------------------------------------------------------------------------------------------ - bindings = < - &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH - &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RGUI &kp RCTRL - >; - }; + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RGUI &kp RCTRL + >; + }; - fn_layer { - bindings = < + fn_layer { + bindings = < &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bootloader &trans &bt BT_CLR &none &none &none &none &none &none &none &none &none &none &none &sys_reset &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &none &none &trans &trans &none &none &none &none &none &none &none &none &none &none &trans &trans &trans &trans &trans &trans &trans &trans &trans - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/m60/m60.overlay b/app/boards/shields/m60/m60.overlay index 18d06511..a2ab2593 100644 --- a/app/boards/shields/m60/m60.overlay +++ b/app/boards/shields/m60/m60.overlay @@ -7,42 +7,42 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - col-gpios - = <&gpio0 19 GPIO_ACTIVE_HIGH> - , <&gpio0 20 GPIO_ACTIVE_HIGH> - , <&gpio0 21 GPIO_ACTIVE_HIGH> - , <&gpio0 22 GPIO_ACTIVE_HIGH> - , <&gpio0 23 GPIO_ACTIVE_HIGH> - , <&gpio0 24 GPIO_ACTIVE_HIGH> - , <&gpio0 25 GPIO_ACTIVE_HIGH> - , <&gpio0 26 GPIO_ACTIVE_HIGH> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 20 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 22 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 24 GPIO_ACTIVE_HIGH> + , <&gpio0 25 GPIO_ACTIVE_HIGH> + , <&gpio0 26 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <8>; - rows = <8>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <8>; // | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 | // | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX24 | MX25 | MX26 | MX27 | MX28 | // | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 | @@ -55,6 +55,6 @@ RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4 RC(6,4) RC(6,3) RC(6,2) RC(6,1) RC(6,0) RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(6,5) RC(6,6) RC(6,7) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,4) >; - }; + }; }; diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index 8c0b042e..d05ae045 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_MICRODOX_LEFT config ZMK_KEYBOARD_NAME - default "Microdox" + default "Microdox" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/microdox/Kconfig.shield b/app/boards/shields/microdox/Kconfig.shield index ac79eab6..47543760 100644 --- a/app/boards/shields/microdox/Kconfig.shield +++ b/app/boards/shields/microdox/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_MICRODOX_LEFT - def_bool $(shields_list_contains,microdox_left) + def_bool $(shields_list_contains,microdox_left) config SHIELD_MICRODOX_RIGHT - def_bool $(shields_list_contains,microdox_right) + def_bool $(shields_list_contains,microdox_right) diff --git a/app/boards/shields/microdox/boards/nice_nano.overlay b/app/boards/shields/microdox/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/microdox/boards/nice_nano.overlay +++ b/app/boards/shields/microdox/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/microdox/boards/nice_nano_v2.overlay b/app/boards/shields/microdox/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/microdox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/microdox/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index e3fabb3e..e02aa554 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -7,59 +7,59 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 | // | SW11 | SW12 | SW13 | SW14 | SW15 | | SW15 | SW14 | SW13 | SW12 | SW11 | // | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/microdox/microdox_left.overlay b/app/boards/shields/microdox/microdox_left.overlay index 307776e7..d38f50da 100644 --- a/app/boards/shields/microdox/microdox_left.overlay +++ b/app/boards/shields/microdox/microdox_left.overlay @@ -7,11 +7,11 @@ #include "microdox.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/microdox/microdox_right.overlay b/app/boards/shields/microdox/microdox_right.overlay index 5475c31f..4dd29016 100644 --- a/app/boards/shields/microdox/microdox_right.overlay +++ b/app/boards/shields/microdox/microdox_right.overlay @@ -7,20 +7,20 @@ #include "microdox.dtsi" &default_transform { - col-offset = <5>; + col-offset = <5>; }; &oled { - segment-remap; - com-invdir; + segment-remap; + com-invdir; }; &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/murphpad/Kconfig.defconfig b/app/boards/shields/murphpad/Kconfig.defconfig index 07e71826..80e65351 100644 --- a/app/boards/shields/murphpad/Kconfig.defconfig +++ b/app/boards/shields/murphpad/Kconfig.defconfig @@ -4,34 +4,34 @@ if SHIELD_MURPHPAD config ZMK_KEYBOARD_NAME - default "MurphPad" + default "MurphPad" if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/murphpad/Kconfig.shield b/app/boards/shields/murphpad/Kconfig.shield index 389caa26..1c961aea 100644 --- a/app/boards/shields/murphpad/Kconfig.shield +++ b/app/boards/shields/murphpad/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_MURPHPAD - def_bool $(shields_list_contains,murphpad) \ No newline at end of file + def_bool $(shields_list_contains,murphpad) \ No newline at end of file diff --git a/app/boards/shields/murphpad/boards/nice_nano.overlay b/app/boards/shields/murphpad/boards/nice_nano.overlay index 3e2241a2..ac6c51d5 100644 --- a/app/boards/shields/murphpad/boards/nice_nano.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay index 3e2241a2..ac6c51d5 100644 --- a/app/boards/shields/murphpad/boards/nice_nano_v2.overlay +++ b/app/boards/shields/murphpad/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index b7fead60..13905092 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -7,69 +7,69 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + diode-direction = "col2row"; + row-gpios + = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_2: encoder_2 { - compatible = "alps,ec11"; - label = "Encoder 2"; - a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "Encoder 2"; + a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index d5e8cbeb..31ac7cfe 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -4,38 +4,38 @@ if SHIELD_NIBBLE config ZMK_KEYBOARD_NAME - default "NIBBLE" + default "NIBBLE" config ZMK_USB - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/nibble/Kconfig.shield b/app/boards/shields/nibble/Kconfig.shield index 44364f4e..cb6fd15e 100644 --- a/app/boards/shields/nibble/Kconfig.shield +++ b/app/boards/shields/nibble/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NIBBLE - def_bool $(shields_list_contains,nibble) + def_bool $(shields_list_contains,nibble) diff --git a/app/boards/shields/nibble/boards/nice_nano.overlay b/app/boards/shields/nibble/boards/nice_nano.overlay index 54ab9fec..45c55263 100644 --- a/app/boards/shields/nibble/boards/nice_nano.overlay +++ b/app/boards/shields/nibble/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/nibble/boards/nice_nano_v2.overlay b/app/boards/shields/nibble/boards/nice_nano_v2.overlay index 54ab9fec..45c55263 100644 --- a/app/boards/shields/nibble/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nibble/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index c02aad75..5b90f6c1 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -9,39 +9,39 @@ #include / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_1>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "Default"; + default_layer { + label = "Default"; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp HOME &kp C_MUTE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp DEL &trans &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &trans &kp LSHFT &trans &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &trans &kp LCTRL &kp LGUI &kp LALT &kp SPACE &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; - function_layer { - label = "Function"; + >; + }; + function_layer { + label = "Function"; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - bindings = < + bindings = < &kp TILDE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &kp END &kp C_MUTE &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &bt BT_CLR &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_PRV &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &kp C_PREV &kp C_PP &kp C_NEXT - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index baf1eb10..cd117640 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -7,69 +7,69 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "okay"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-demux"; - label = "KSCAN"; - polling-interval-msec = <25>; - input-gpios - = <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - ; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-demux"; + label = "KSCAN"; + polling-interval-msec = <25>; + input-gpios + = <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,15) RC(3,0) RC(3,1) RC(0,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,14) RC(3,15) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,6) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) - >; - }; + >; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index 22c5f647..d2378409 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -4,24 +4,24 @@ if SHIELD_NICE_VIEW config ZMK_DISPLAY - select LV_FONT_MONTSERRAT_26 + select LV_FONT_MONTSERRAT_26 if ZMK_DISPLAY config SPI - default y + default y config LS0XX - default y + default y config ZMK_WIDGET_WPM_STATUS - default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # ZMK_DISPLAY diff --git a/app/boards/shields/nice_view/Kconfig.shield b/app/boards/shields/nice_view/Kconfig.shield index 55cba788..fbe4fde8 100644 --- a/app/boards/shields/nice_view/Kconfig.shield +++ b/app/boards/shields/nice_view/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NICE_VIEW - def_bool $(shields_list_contains,nice_view) + def_bool $(shields_list_contains,nice_view) diff --git a/app/boards/shields/nice_view/nice_view.overlay b/app/boards/shields/nice_view/nice_view.overlay index eacdd41a..49ce0f23 100644 --- a/app/boards/shields/nice_view/nice_view.overlay +++ b/app/boards/shields/nice_view/nice_view.overlay @@ -5,19 +5,19 @@ */ &nice_view_spi { - status = "okay"; - nice_view: ls0xx@0 { - compatible = "sharp,ls0xx"; - label = "DISPLAY"; - spi-max-frequency = <1000000>; - reg = <0>; - width = <160>; - height = <68>; - }; + status = "okay"; + nice_view: ls0xx@0 { + compatible = "sharp,ls0xx"; + label = "DISPLAY"; + spi-max-frequency = <1000000>; + reg = <0>; + width = <160>; + height = <68>; + }; }; / { - chosen { - zephyr,display = &nice_view; - }; + chosen { + zephyr,display = &nice_view; + }; }; diff --git a/app/boards/shields/nice_view_adapter/Kconfig.shield b/app/boards/shields/nice_view_adapter/Kconfig.shield index bf9ba7cb..f95a209c 100644 --- a/app/boards/shields/nice_view_adapter/Kconfig.shield +++ b/app/boards/shields/nice_view_adapter/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_NICE_VIEW_ADAPTER - def_bool $(shields_list_contains,nice_view_adapter) + def_bool $(shields_list_contains,nice_view_adapter) diff --git a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/bluemicro840_v1.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay index d9cc0835..e00b599c 100644 --- a/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay +++ b/app/boards/shields/nice_view_adapter/boards/mikoto_520.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay index 2a1b757d..45ba34de 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay index 2a1b757d..45ba34de 100644 --- a/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nice_nano_v2.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay index 1cd19db9..5b5dbfb1 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_11_flipped.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay +++ b/app/boards/shields/nice_view_adapter/boards/nrfmicro_13.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay index b8b07258..706cffbe 100644 --- a/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay +++ b/app/boards/shields/nice_view_adapter/boards/puchi_ble_v1.overlay @@ -5,31 +5,31 @@ */ &pinctrl { - spi0_default: spi0_default { - group1 { - psels = , - , - ; - }; - }; - spi0_sleep: spi0_sleep { - group1 { - psels = , - , - ; - low-power-enable; - }; - }; + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; }; nice_view_spi: &spi0 { - compatible = "nordic,nrf-spim"; - pinctrl-0 = <&spi0_default>; - pinctrl-1 = <&spi0_sleep>; - pinctrl-names = "default", "sleep"; - cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi0_default>; + pinctrl-1 = <&spi0_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&pro_micro 1 GPIO_ACTIVE_HIGH>; }; &pro_micro_i2c { - status = "disabled"; + status = "disabled"; }; diff --git a/app/boards/shields/pancake/Kconfig.shield b/app/boards/shields/pancake/Kconfig.shield index 784d25a4..ca00d303 100644 --- a/app/boards/shields/pancake/Kconfig.shield +++ b/app/boards/shields/pancake/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_PANCAKE - def_bool $(shields_list_contains,pancake) \ No newline at end of file + def_bool $(shields_list_contains,pancake) \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.defconfig b/app/boards/shields/quefrency/Kconfig.defconfig index 28e46a56..db618287 100644 --- a/app/boards/shields/quefrency/Kconfig.defconfig +++ b/app/boards/shields/quefrency/Kconfig.defconfig @@ -5,16 +5,16 @@ if SHIELD_QUEFRENCY_LEFT config ZMK_KEYBOARD_NAME - default "Quefrency" + default "Quefrency" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_QUEFRENCY_LEFT || SHIELD_QUEFRENCY_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/quefrency/Kconfig.shield b/app/boards/shields/quefrency/Kconfig.shield index d205e58f..d30d30f1 100644 --- a/app/boards/shields/quefrency/Kconfig.shield +++ b/app/boards/shields/quefrency/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_QUEFRENCY_LEFT - def_bool $(shields_list_contains,quefrency_left) + def_bool $(shields_list_contains,quefrency_left) config SHIELD_QUEFRENCY_RIGHT - def_bool $(shields_list_contains,quefrency_right) + def_bool $(shields_list_contains,quefrency_right) diff --git a/app/boards/shields/quefrency/quefrency.dtsi b/app/boards/shields/quefrency/quefrency.dtsi index c9cb7d43..f7dc4489 100644 --- a/app/boards/shields/quefrency/quefrency.dtsi +++ b/app/boards/shields/quefrency/quefrency.dtsi @@ -7,26 +7,26 @@ #include / { - chosen { - zmk,kscan = &kscan0; + chosen { + zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + zmk,matrix_transform = &default_transform; + }; - /* - * This transform correspondsto the 60% left without macro keypad and 65% right, even this - * combination of PCBs can have keys in different locations based on configuration. - */ - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <15>; - rows = <6>; - map = < + /* + * This transform correspondsto the 60% left without macro keypad and 65% right, even this + * combination of PCBs can have keys in different locations based on configuration. + */ + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <6>; + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) /**/ RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,14) RC(5,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) /**/RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(5,14) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) /**/ RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) RC(2,13) RC(3,0) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) /**/ RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,12) RC(3,13) RC(3,14) RC(3,11) RC(4,0) RC(4,1) RC(4,2) RC(4,4) RC(4,6) /**/ RC(4,7) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,9) - >; - }; + >; + }; }; diff --git a/app/boards/shields/redox/Kconfig.defconfig b/app/boards/shields/redox/Kconfig.defconfig index bf122b5e..32e30ad5 100644 --- a/app/boards/shields/redox/Kconfig.defconfig +++ b/app/boards/shields/redox/Kconfig.defconfig @@ -3,16 +3,16 @@ if SHIELD_REDOX_LEFT config ZMK_KEYBOARD_NAME - default "Redox" + default "Redox" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_REDOX_LEFT || SHIELD_REDOX_RIGHT config ZMK_SPLIT - default y + default y endif \ No newline at end of file diff --git a/app/boards/shields/redox/Kconfig.shield b/app/boards/shields/redox/Kconfig.shield index 2df91c11..8e6c601d 100644 --- a/app/boards/shields/redox/Kconfig.shield +++ b/app/boards/shields/redox/Kconfig.shield @@ -1,7 +1,7 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT config SHIELD_REDOX_LEFT - def_bool $(shields_list_contains,redox_left) + def_bool $(shields_list_contains,redox_left) config SHIELD_REDOX_RIGHT - def_bool $(shields_list_contains,redox_right) + def_bool $(shields_list_contains,redox_right) diff --git a/app/boards/shields/redox/boards/nice_nano.overlay b/app/boards/shields/redox/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/redox/boards/nice_nano.overlay +++ b/app/boards/shields/redox/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/redox/boards/nice_nano_v2.overlay b/app/boards/shields/redox/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/redox/boards/nice_nano_v2.overlay +++ b/app/boards/shields/redox/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/redox/redox.dtsi b/app/boards/shields/redox/redox.dtsi index 9c0705a6..d2d72d0f 100644 --- a/app/boards/shields/redox/redox.dtsi +++ b/app/boards/shields/redox/redox.dtsi @@ -7,42 +7,42 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | SW13 | | SW13 | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW14 | SW15 | SW16 | SW17 | SW18 | SW19 | SW20 | | SW20 | SW19 | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW21 | SW22 | SW23 | SW24 | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 | SW24 | SW23 | SW22 | SW21 | // | SW29 | SW30 | SW31 | SW32 | SW33 | SW34 | SW35 | | SW35 | SW34 | SW33 | SW32 | SW31 | SW30 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(0,6) RC(0,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(1,6) RC(1,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(2,6) RC(3,6) RC(3,7) RC(2,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; }; diff --git a/app/boards/shields/redox/redox_left.overlay b/app/boards/shields/redox/redox_left.overlay index 322dca79..d68029d8 100644 --- a/app/boards/shields/redox/redox_left.overlay +++ b/app/boards/shields/redox/redox_left.overlay @@ -7,13 +7,13 @@ #include "redox.dtsi" &kscan0 { - col-gpios - = <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/redox/redox_right.overlay b/app/boards/shields/redox/redox_right.overlay index f2dcfed0..09b14637 100644 --- a/app/boards/shields/redox/redox_right.overlay +++ b/app/boards/shields/redox/redox_right.overlay @@ -7,17 +7,17 @@ #include "redox.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano.overlay b/app/boards/shields/reviung41/boards/nice_nano.overlay index 741237e1..8590149e 100644 --- a/app/boards/shields/reviung41/boards/nice_nano.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <11>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <11>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay index 741237e1..8590149e 100644 --- a/app/boards/shields/reviung41/boards/nice_nano_v2.overlay +++ b/app/boards/shields/reviung41/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <11>; - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <11>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac/Kconfig.defconfig b/app/boards/shields/romac/Kconfig.defconfig index 53527971..5cd94faa 100644 --- a/app/boards/shields/romac/Kconfig.defconfig +++ b/app/boards/shields/romac/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_ROMAC config ZMK_KEYBOARD_NAME - default "RoMac" + default "RoMac" endif diff --git a/app/boards/shields/romac/Kconfig.shield b/app/boards/shields/romac/Kconfig.shield index 59669d33..9bdd2c5f 100644 --- a/app/boards/shields/romac/Kconfig.shield +++ b/app/boards/shields/romac/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ROMAC - def_bool $(shields_list_contains,romac) + def_bool $(shields_list_contains,romac) diff --git a/app/boards/shields/romac/romac.overlay b/app/boards/shields/romac/romac.overlay index 827273a4..480d3f84 100644 --- a/app/boards/shields/romac/romac.overlay +++ b/app/boards/shields/romac/romac.overlay @@ -7,28 +7,28 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; - }; + }; }; diff --git a/app/boards/shields/romac_plus/Kconfig.defconfig b/app/boards/shields/romac_plus/Kconfig.defconfig index c4efdb97..442bc0bd 100644 --- a/app/boards/shields/romac_plus/Kconfig.defconfig +++ b/app/boards/shields/romac_plus/Kconfig.defconfig @@ -4,6 +4,6 @@ if SHIELD_ROMAC_PLUS config ZMK_KEYBOARD_NAME - default "RoMac+ v4" + default "RoMac+ v4" endif \ No newline at end of file diff --git a/app/boards/shields/romac_plus/Kconfig.shield b/app/boards/shields/romac_plus/Kconfig.shield index a7c7c614..277f1eb3 100644 --- a/app/boards/shields/romac_plus/Kconfig.shield +++ b/app/boards/shields/romac_plus/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ROMAC_PLUS - def_bool $(shields_list_contains,romac_plus) + def_bool $(shields_list_contains,romac_plus) diff --git a/app/boards/shields/romac_plus/boards/nice_nano.overlay b/app/boards/shields/romac_plus/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay +++ b/app/boards/shields/romac_plus/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/romac_plus/romac_plus.dtsi b/app/boards/shields/romac_plus/romac_plus.dtsi index 0fd4374a..71ec87b2 100644 --- a/app/boards/shields/romac_plus/romac_plus.dtsi +++ b/app/boards/shields/romac_plus/romac_plus.dtsi @@ -7,50 +7,50 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <3>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <3>; + rows = <4>; - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(1,0) RC(1,1) RC(1,2) RC(2,0) RC(2,1) RC(2,2) RC(3,0) RC(3,1) RC(3,2) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder>; + }; - // TODO: per-key RGB node(s)? + // TODO: per-key RGB node(s)? }; \ No newline at end of file diff --git a/app/boards/shields/romac_plus/romac_plus.overlay b/app/boards/shields/romac_plus/romac_plus.overlay index 4ef38744..2308e284 100644 --- a/app/boards/shields/romac_plus/romac_plus.overlay +++ b/app/boards/shields/romac_plus/romac_plus.overlay @@ -7,22 +7,22 @@ #include "romac_plus.dtsi" / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; + }; }; diff --git a/app/boards/shields/settings_reset/Kconfig.defconfig b/app/boards/shields/settings_reset/Kconfig.defconfig index 6d050cb4..05f3b406 100644 --- a/app/boards/shields/settings_reset/Kconfig.defconfig +++ b/app/boards/shields/settings_reset/Kconfig.defconfig @@ -4,7 +4,7 @@ if SHIELD_SETTINGS_RESET config ZMK_KEYBOARD_NAME - default "SETTINGS RESET" + default "SETTINGS RESET" endif diff --git a/app/boards/shields/settings_reset/Kconfig.shield b/app/boards/shields/settings_reset/Kconfig.shield index b5ce97f9..b1e6ed0e 100644 --- a/app/boards/shields/settings_reset/Kconfig.shield +++ b/app/boards/shields/settings_reset/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_SETTINGS_RESET - def_bool $(shields_list_contains,settings_reset) + def_bool $(shields_list_contains,settings_reset) diff --git a/app/boards/shields/settings_reset/settings_reset.overlay b/app/boards/shields/settings_reset/settings_reset.overlay index 51e04ba7..77a9d858 100644 --- a/app/boards/shields/settings_reset/settings_reset.overlay +++ b/app/boards/shields/settings_reset/settings_reset.overlay @@ -7,18 +7,18 @@ #include / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; diff --git a/app/boards/shields/snap/Kconfig.defconfig b/app/boards/shields/snap/Kconfig.defconfig index c4a67e65..e21111e9 100644 --- a/app/boards/shields/snap/Kconfig.defconfig +++ b/app/boards/shields/snap/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_SNAP_LEFT config ZMK_KEYBOARD_NAME - default "SNAP" + default "SNAP" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SNAP_LEFT || SHIELD_SNAP_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/snap/Kconfig.shield b/app/boards/shields/snap/Kconfig.shield index eb02c45f..edbd1b57 100644 --- a/app/boards/shields/snap/Kconfig.shield +++ b/app/boards/shields/snap/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SNAP_LEFT - def_bool $(shields_list_contains,snap_left) + def_bool $(shields_list_contains,snap_left) config SHIELD_SNAP_RIGHT - def_bool $(shields_list_contains,snap_right) + def_bool $(shields_list_contains,snap_right) diff --git a/app/boards/shields/snap/boards/nice_nano.overlay b/app/boards/shields/snap/boards/nice_nano.overlay index 28e9ce69..1a51eb16 100644 --- a/app/boards/shields/snap/boards/nice_nano.overlay +++ b/app/boards/shields/snap/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/snap/boards/nice_nano_v2.overlay b/app/boards/shields/snap/boards/nice_nano_v2.overlay index 28e9ce69..1a51eb16 100644 --- a/app/boards/shields/snap/boards/nice_nano_v2.overlay +++ b/app/boards/shields/snap/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index 77070db9..a374ad17 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -7,30 +7,30 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan_composite; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan_composite; + zmk,matrix_transform = &default_transform; + }; - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - resolution = <4>; - status = "disabled"; - }; + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + resolution = <4>; + status = "disabled"; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <17>; - rows = <6>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <17>; + rows = <6>; // | R0C06L | R0C05L | R0C04L | R0C03L | R0C02L | R0C01L | R0C00L | | R0C15R | R0C14R | R0C13R | R0C12R | R0C11R | R0C10R | R0C09R | R0C08R | // R1C07L | R1C06L | R1C05L | R1C04L | R1C03L | R1C02L | R1C01L | R1C00L | | R1C15R | R1C14R | R1C13R | R1C12R | R1C11R | R1C10R | R1C09R | R1C08R | R2C0XR | @@ -39,48 +39,48 @@ // R4C07L | R4C06L | R4C05L | R4C04L | R4C03L | R4C02L | R4C01L | R4C00L | | R4C15R | R4C14R | R4C13R | R4C12R | R4C11R | R4C10R | R4C09R | R5C08R | // R5C07L | R5C06L | R5C05L | R5C04L | R5C02L | R5C00L | | R5C15R | R5C14R | R5C13R | R5C12R | R5C11R | R5C10R | R5C09R | - map = < - RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) + map = < + RC(0,6) RC(0,5) RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,15) RC(0,14) RC(0,13) RC(0,12) RC(0,11) RC(0,10) RC(0,9) RC(0,8) RC(1,7) RC(1,6) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,15) RC(1,14) RC(1,13) RC(1,12) RC(1,11) RC(1,10) RC(1,9) RC(1,8) RC(1,16) RC(2,7) RC(2,6) RC(2,5) RC(2,4) RC(2,3) RC(2,2) RC(2,0) RC(2,15) RC(2,14) RC(2,13) RC(2,12) RC(2,11) RC(2,10) RC(2,9) RC(3,8) RC(2,8) RC(3,7) RC(3,6) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,0) RC(3,15) RC(3,14) RC(3,13) RC(3,12) RC(3,11) RC(3,10) RC(3,9) RC(4,8) RC(4,7) RC(4,6) RC(4,5) RC(4,4) RC(4,3) RC(4,2) RC(4,1) RC(4,0) RC(4,15) RC(4,14) RC(4,13) RC(4,12) RC(4,11) RC(4,10) RC(4,9) RC(5,8) RC(5,7) RC(5,6) RC(5,5) RC(5,4) RC(5,2) RC(5,0) RC(5,15) RC(5,14) RC(5,13) RC(5,12) RC(5,11) RC(5,10) RC(5,9) - >; - }; + >; + }; - kscan_composite: kscan { - compatible = "zmk,kscan-composite"; - label = "KSCAN"; - rows = <6>; - columns = <17>; + kscan_composite: kscan { + compatible = "zmk,kscan-composite"; + label = "KSCAN"; + rows = <6>; + columns = <17>; - demux { - kscan = <&kscan_demux>; - }; - }; + demux { + kscan = <&kscan_demux>; + }; + }; - kscan_demux: kscan_demux { - compatible = "zmk,kscan-gpio-demux"; - label = "DEMUX"; - polling-interval-msec = <25>; - }; + kscan_demux: kscan_demux { + compatible = "zmk,kscan-gpio-demux"; + label = "DEMUX"; + polling-interval-msec = <25>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index cc4c5255..7c750f9f 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -10,38 +10,38 @@ #include / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "Default"; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; - bindings = < + default_layer { + label = "Default"; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp C_VOL_UP C_VOL_DN>; + bindings = < &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp KP_NUM &kp PAUSE_BREAK &kp C_MUTE &kp TILDE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME &kp F13 &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END &kp F14 &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &kp F15 &kp LSHFT &kp NUHS &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &kp F16 &kp LCTRL &kp LGUI &kp LALT &mo 1 &kp SPACE &kp BSPC &mo 1 &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - function_layer { - label = "Function"; - sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; - bindings = < + function_layer { + label = "Function"; + sensor-bindings = <&inc_dec_kp C_NEXT C_PREV &inc_dec_kp C_NEXT C_PREV>; + bindings = < &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_PP &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_TOG &rgb_ug RGB_BRI &rgb_ug RGB_EFF &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_HUI - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/snap/snap_left.overlay b/app/boards/shields/snap/snap_left.overlay index b5b8a841..abbe9450 100644 --- a/app/boards/shields/snap/snap_left.overlay +++ b/app/boards/shields/snap/snap_left.overlay @@ -7,28 +7,28 @@ #include "snap.dtsi" &kscan_demux { - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - ; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 6 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - status = "okay"; + a-gpios = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; }; &oled { - segment-remap; - com-invdir; + segment-remap; + com-invdir; }; diff --git a/app/boards/shields/snap/snap_right.overlay b/app/boards/shields/snap/snap_right.overlay index dc71a5cf..ad04ae24 100644 --- a/app/boards/shields/snap/snap_right.overlay +++ b/app/boards/shields/snap/snap_right.overlay @@ -8,44 +8,44 @@ / { kscan_direct: kscan_direct { - compatible = "zmk,kscan-gpio-direct"; - label = "DIRECT"; - input-gpios - = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + compatible = "zmk,kscan-gpio-direct"; + label = "DIRECT"; + input-gpios + = <&pro_micro 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; }; &default_transform { - col-offset = <8>; + col-offset = <8>; }; &kscan_composite { - direct { - kscan = <&kscan_direct>; - row-offset = <1>; - column-offset = <8>; - }; + direct { + kscan = <&kscan_direct>; + row-offset = <1>; + column-offset = <8>; + }; }; &kscan_demux { - input-gpios - = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - output-gpios - = <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - ; + input-gpios + = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + output-gpios + = <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - status = "okay"; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; }; diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index afa710ff..cc598d67 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_SOFLE_LEFT config ZMK_KEYBOARD_NAME - default "Sofle" + default "Sofle" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SOFLE_LEFT || SHIELD_SOFLE_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/sofle/Kconfig.shield b/app/boards/shields/sofle/Kconfig.shield index e23a97a1..a865e839 100644 --- a/app/boards/shields/sofle/Kconfig.shield +++ b/app/boards/shields/sofle/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SOFLE_LEFT - def_bool $(shields_list_contains,sofle_left) + def_bool $(shields_list_contains,sofle_left) config SHIELD_SOFLE_RIGHT - def_bool $(shields_list_contains,sofle_right) + def_bool $(shields_list_contains,sofle_right) diff --git a/app/boards/shields/sofle/sofle_left.overlay b/app/boards/shields/sofle/sofle_left.overlay index 13bfb397..057e6050 100644 --- a/app/boards/shields/sofle/sofle_left.overlay +++ b/app/boards/shields/sofle/sofle_left.overlay @@ -7,16 +7,16 @@ #include "sofle.dtsi" &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/sofle/sofle_right.overlay b/app/boards/shields/sofle/sofle_right.overlay index 53b10e60..65e5f330 100644 --- a/app/boards/shields/sofle/sofle_right.overlay +++ b/app/boards/shields/sofle/sofle_right.overlay @@ -7,20 +7,20 @@ #include "sofle.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig index 03078cd6..a28792c7 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_CORNE_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Corne" + default "Aurora Corne" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_CORNE_LEFT if SHIELD_SPLITKB_AURORA_CORNE_LEFT || SHIELD_SPLITKB_AURORA_CORNE_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield index 3de10105..1efcdf00 100644 --- a/app/boards/shields/splitkb_aurora_corne/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_corne/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_CORNE_LEFT - def_bool $(shields_list_contains,splitkb_aurora_corne_left) + def_bool $(shields_list_contains,splitkb_aurora_corne_left) config SHIELD_SPLITKB_AURORA_CORNE_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_corne_right) + def_bool $(shields_list_contains,splitkb_aurora_corne_right) diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_corne/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi index aa525948..a1b7b643 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi @@ -8,85 +8,85 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <4>; // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - five_column_transform: keymap_transform_1 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; + five_column_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) - >; - }; + >; + }; - left_encoder: left_encoder { - compatible = "alps,ec11"; - label = "L_ENCODER"; - resolution = <4>; - status = "disabled"; + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 4 GPIO_PULL_UP>; - b-gpios = <&pro_micro 5 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 4 GPIO_PULL_UP>; + b-gpios = <&pro_micro 5 GPIO_PULL_UP>; + }; - right_encoder: right_encoder { - compatible = "alps,ec11"; - label = "R_ENCODER"; - resolution = <4>; - status = "disabled"; + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 19 GPIO_PULL_UP>; - b-gpios = <&pro_micro 18 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 19 GPIO_PULL_UP>; + b-gpios = <&pro_micro 18 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap index 53218a86..0555cf41 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.keymap @@ -35,7 +35,7 @@ &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; @@ -49,7 +49,7 @@ &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT >; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay index 82234278..89563f42 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_left.overlay @@ -7,36 +7,36 @@ #include "splitkb_aurora_corne.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + label = "KSCAN"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; + row-gpios + = <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; - col-gpios - = <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; + }; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay index c1d34ffd..e05df223 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne_right.overlay @@ -7,42 +7,42 @@ #include "splitkb_aurora_corne.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "col2row"; + label = "KSCAN"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; + row-gpios + = <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; - col-gpios - = <&pro_micro 9 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; }; &right_encoder { - status = "okay"; + status = "okay"; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; &five_column_transform { - col-offset = <6>; + col-offset = <6>; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig index 221bf90a..e54e2b43 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_LILY58_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Lily58" + default "Aurora Lily58" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_LILY58_LEFT if SHIELD_SPLITKB_AURORA_LILY58_LEFT || SHIELD_SPLITKB_AURORA_LILY58_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield index 35f8b2d1..a64f47dc 100644 --- a/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_lily58/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_LILY58_LEFT - def_bool $(shields_list_contains,splitkb_aurora_lily58_left) + def_bool $(shields_list_contains,splitkb_aurora_lily58_left) config SHIELD_SPLITKB_AURORA_LILY58_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_lily58_right) + def_bool $(shields_list_contains,splitkb_aurora_lily58_right) diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay index 5b9ce4a8..0eafa704 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano.overlay @@ -2,46 +2,46 @@ &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay index 9e168625..6601d27d 100644 --- a/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/boards/nice_nano_v2.overlay @@ -1,46 +1,46 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <5>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; - color-mapping = ; - }; + /* WS2812 */ + chain-length = <5>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi index 08e2ac9e..908356c7 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -8,71 +8,71 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <14>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) - >; - }; + >; + }; - left_encoder: left_encoder { - compatible = "alps,ec11"; - label = "L_ENCODER"; - resolution = <4>; - status = "disabled"; + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 5 GPIO_PULL_UP>; - b-gpios = <&pro_micro 4 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 5 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + }; - right_encoder: right_encoder { - compatible = "alps,ec11"; - label = "R_ENCODER"; - resolution = <4>; - status = "disabled"; + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + resolution = <4>; + status = "disabled"; - a-gpios = <&pro_micro 18 GPIO_PULL_UP>; - b-gpios = <&pro_micro 19 GPIO_PULL_UP>; - }; + a-gpios = <&pro_micro 18 GPIO_PULL_UP>; + b-gpios = <&pro_micro 19 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap index 376bcf26..b8a9103b 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.keymap @@ -10,61 +10,61 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | // | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - lower_layer { + lower_layer { // ------------------------------------------------------------------------------------------------------------ // | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | // | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | // | | | | | | | | | | | _ | + | { | } | "|" | // | | | | | | | | | | - bindings = < + bindings = < &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE &trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; - raise_layer { + raise_layer { // ------------------------------------------------------------------------------------------------------------ // | | | | | | | | | | | | | | // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | // | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | // | | | | | | | | | | - bindings = < + bindings = < &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &trans &trans &trans &trans &trans &trans &trans &trans - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay index 10a195ff..c4f12dda 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_left.overlay @@ -7,37 +7,37 @@ #include "splitkb_aurora_lily58.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - , <&pro_micro 7 GPIO_ACTIVE_HIGH> - , <&pro_micro 8 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 16 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay index eaebff36..09da298c 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58_right.overlay @@ -7,39 +7,39 @@ #include "splitkb_aurora_lily58.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &right_encoder { - status = "okay"; + status = "okay"; }; &default_transform { - col-offset = <6>; + col-offset = <6>; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig index ac07c935..83cb1bf6 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.defconfig @@ -4,50 +4,50 @@ if SHIELD_SPLITKB_AURORA_SWEEP_LEFT config ZMK_KEYBOARD_NAME - default "Aurora Sweep" + default "Aurora Sweep" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif # SHIELD_SPLITKB_AURORA_SWEEP_LEFT if SHIELD_SPLITKB_AURORA_SWEEP_LEFT || SHIELD_SPLITKB_AURORA_SWEEP_RIGHT config ZMK_SPLIT - default y + default y config ZMK_RGB_UNDERGLOW - select WS2812_STRIP - select SPI + select WS2812_STRIP + select SPI config ZMK_DISPLAY if ZMK_DISPLAY config SSD1306 - default y + default y config I2C - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield index abb05282..7d92134c 100644 --- a/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield +++ b/app/boards/shields/splitkb_aurora_sweep/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITKB_AURORA_SWEEP_LEFT - def_bool $(shields_list_contains,splitkb_aurora_sweep_left) + def_bool $(shields_list_contains,splitkb_aurora_sweep_left) config SHIELD_SPLITKB_AURORA_SWEEP_RIGHT - def_bool $(shields_list_contains,splitkb_aurora_sweep_right) + def_bool $(shields_list_contains,splitkb_aurora_sweep_right) diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay index f1330669..810340f9 100644 --- a/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi index a999df6a..ab568a09 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi @@ -8,73 +8,73 @@ / { - chosen { - zephyr,display = &oled; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; - map = < - RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) - RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) - RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) - RC(3,1) RC(3,0) RC(3,5) RC(3,6) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; + map = < + RC(0,4) RC(0,3) RC(0,2) RC(0,1) RC(0,0) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) + RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) + RC(2,4) RC(2,3) RC(2,2) RC(2,1) RC(2,0) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,1) RC(3,0) RC(3,5) RC(3,6) + >; + }; - left_encoder1: left_encoder1 { - compatible = "alps,ec11"; - label = "L_ENCODER1"; - resolution = <4>; - status = "disabled"; - }; + left_encoder1: left_encoder1 { + compatible = "alps,ec11"; + label = "L_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; - left_encoder2: left_encoder2 { - compatible = "alps,ec11"; - label = "L_ENCODER2"; - resolution = <4>; - status = "disabled"; - }; + left_encoder2: left_encoder2 { + compatible = "alps,ec11"; + label = "L_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; - right_encoder1: right_encoder1 { - compatible = "alps,ec11"; - label = "R_ENCODER1"; - resolution = <4>; - status = "disabled"; - }; + right_encoder1: right_encoder1 { + compatible = "alps,ec11"; + label = "R_ENCODER1"; + resolution = <4>; + status = "disabled"; + }; - right_encoder2: right_encoder2 { - compatible = "alps,ec11"; - label = "R_ENCODER2"; - resolution = <4>; - status = "disabled"; - }; + right_encoder2: right_encoder2 { + compatible = "alps,ec11"; + label = "R_ENCODER2"; + resolution = <4>; + status = "disabled"; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder1 &right_encoder1>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder1 &right_encoder1>; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap index 385d2022..4b57beac 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.keymap @@ -62,41 +62,41 @@ keymap { compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT - &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET - &mo 1 &kp LCTL &kp SPC &mo 2 - >; - }; + default_layer { + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT + &mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET + &mo 1 &kp LCTL &kp SPC &mo 2 + >; + }; - left_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 - &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL - &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL - &mo 1 &kp LGUI &kp RGUI &mo 2 - >; - }; + left_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 + &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL + &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL + &mo 1 &kp LGUI &kp RGUI &mo 2 + >; + }; - right_layer { - bindings = < - &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN - &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP - &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT - &mo 3 &kp LCTL &kp SPC &mo 2 - >; - }; + right_layer { + bindings = < + &kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN + &kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP + &kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT + &mo 3 &kp LCTL &kp SPC &mo 2 + >; + }; - tri_layer { - bindings = < - &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans - &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans - &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans - &trans &trans &trans &trans - >; - }; + tri_layer { + bindings = < + &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans + &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans + &trans &trans &trans &trans + >; + }; - }; + }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay index 1ff5ed5e..f62d24fa 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_left.overlay @@ -7,42 +7,42 @@ #include "splitkb_aurora_sweep.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 10 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &left_encoder1 { - status = "okay"; - a-gpios = <&pro_micro 9 GPIO_PULL_UP>; - b-gpios = <&pro_micro 8 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 9 GPIO_PULL_UP>; + b-gpios = <&pro_micro 8 GPIO_PULL_UP>; }; &left_encoder2 { - status = "okay"; - a-gpios = <&pro_micro 14 GPIO_PULL_UP>; - b-gpios = <&pro_micro 16 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 14 GPIO_PULL_UP>; + b-gpios = <&pro_micro 16 GPIO_PULL_UP>; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay index 81ddca40..ff1d16d3 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep_right.overlay @@ -7,45 +7,45 @@ #include "splitkb_aurora_sweep.dtsi" / { - chosen { - zmk,kscan = &kscan; - }; + chosen { + zmk,kscan = &kscan; + }; - kscan: kscan { - compatible = "zmk,kscan-gpio-matrix"; + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - diode-direction = "row2col"; + label = "KSCAN"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - ; + row-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + ; - col-gpios - = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> - ; - }; + col-gpios + = <&pro_micro 9 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 8 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 7 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + }; }; &right_encoder1 { - status = "okay"; - a-gpios = <&pro_micro 16 GPIO_PULL_UP>; - b-gpios = <&pro_micro 10 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; }; &right_encoder2 { - status = "okay"; - a-gpios = <&pro_micro 20 GPIO_PULL_UP>; - b-gpios = <&pro_micro 4 GPIO_PULL_UP>; + status = "okay"; + a-gpios = <&pro_micro 20 GPIO_PULL_UP>; + b-gpios = <&pro_micro 4 GPIO_PULL_UP>; }; &default_transform { - col-offset = <5>; + col-offset = <5>; }; diff --git a/app/boards/shields/splitreus62/Kconfig.defconfig b/app/boards/shields/splitreus62/Kconfig.defconfig index 14063d3e..52d62c9d 100644 --- a/app/boards/shields/splitreus62/Kconfig.defconfig +++ b/app/boards/shields/splitreus62/Kconfig.defconfig @@ -6,16 +6,16 @@ if SHIELD_SPLITREUS62_LEFT config ZMK_KEYBOARD_NAME - default "Splitreus62" + default "Splitreus62" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_SPLITREUS62_LEFT || SHIELD_SPLITREUS62_RIGHT config ZMK_SPLIT - default y + default y endif diff --git a/app/boards/shields/splitreus62/Kconfig.shield b/app/boards/shields/splitreus62/Kconfig.shield index 762d991b..951ab9fb 100644 --- a/app/boards/shields/splitreus62/Kconfig.shield +++ b/app/boards/shields/splitreus62/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_SPLITREUS62_LEFT - def_bool $(shields_list_contains,splitreus62_left) + def_bool $(shields_list_contains,splitreus62_left) config SHIELD_SPLITREUS62_RIGHT - def_bool $(shields_list_contains,splitreus62_right) + def_bool $(shields_list_contains,splitreus62_right) diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi index 905605e9..abc3b7f7 100644 --- a/app/boards/shields/splitreus62/splitreus62.dtsi +++ b/app/boards/shields/splitreus62/splitreus62.dtsi @@ -7,44 +7,44 @@ #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <6>; -// | SW0 | SW5 | SW10 | SW15 | SW20 | SW25 | SW25 | SW20 | SW15 | SW10 | SW5 | SW1 | -// | SW1 | SW6 | SW11 | SW16 | SW21 | SW26 | SW26 | SW21 | SW16 | SW11 | SW6 | SW2 | -// | SW2 | SW7 | SW12 | SW17 | SW22 | SW27 | SW27 | SW22 | SW17 | SW12 | SW7 | SW3 | -// | SW3 | SW8 | SW13 | SW18 | SW23 | SW28 | SW28 | SW23 | SW18 | SW13 | SW8 | SW4 | + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <6>; +// | SW0 | SW5 | SW10 | SW15 | SW20 | SW25 | SW25 | SW20 | SW15 | SW10 | SW5 | SW1 | +// | SW1 | SW6 | SW11 | SW16 | SW21 | SW26 | SW26 | SW21 | SW16 | SW11 | SW6 | SW2 | +// | SW2 | SW7 | SW12 | SW17 | SW22 | SW27 | SW27 | SW22 | SW17 | SW12 | SW7 | SW3 | +// | SW3 | SW8 | SW13 | SW18 | SW23 | SW28 | SW28 | SW23 | SW18 | SW13 | SW8 | SW4 | // | SW4 | SW9 | SW14 | SW19 | SW24 | SW29 | SW29 | SW24 | SW19 | SW14 | SW9 | SW5 | // SW30 | SW30 - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(5,5) RC(5,6) - >; - }; + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "row2col"; - row-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH > - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 4 GPIO_ACTIVE_HIGH> - , <&pro_micro 5 GPIO_ACTIVE_HIGH> - , <&pro_micro 6 GPIO_ACTIVE_HIGH> - ; + diode-direction = "row2col"; + row-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH > + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + ; - }; + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62.keymap b/app/boards/shields/splitreus62/splitreus62.keymap index c1b0f50f..c7bdb443 100644 --- a/app/boards/shields/splitreus62/splitreus62.keymap +++ b/app/boards/shields/splitreus62/splitreus62.keymap @@ -9,24 +9,24 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // ------------------------------------------------------------------------------------------------------------ // | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | | N | M | , | . | / | SHIFT | // | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BKSP| | RET | SPC | LBKT | RBKT | LBKT | HOME | END | - bindings = < + bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LCTRL &kp LGUI &kp LALT &kp GRAVE &kp EQUAL &kp DEL &kp SPACE &kp LBKT &kp RBKT &kp MINUS &kp HOME &kp END &kp BSPC &kp RET - >; - }; - }; + >; + }; + }; }; diff --git a/app/boards/shields/splitreus62/splitreus62_left.overlay b/app/boards/shields/splitreus62/splitreus62_left.overlay index ba5c21ff..992eb0db 100644 --- a/app/boards/shields/splitreus62/splitreus62_left.overlay +++ b/app/boards/shields/splitreus62/splitreus62_left.overlay @@ -7,12 +7,12 @@ #include "splitreus62.dtsi" &kscan0 { - col-gpios - = <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; diff --git a/app/boards/shields/splitreus62/splitreus62_right.overlay b/app/boards/shields/splitreus62/splitreus62_right.overlay index 9f76e7eb..d83db26d 100644 --- a/app/boards/shields/splitreus62/splitreus62_right.overlay +++ b/app/boards/shields/splitreus62/splitreus62_right.overlay @@ -7,16 +7,16 @@ #include "splitreus62.dtsi" &default_transform { - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; diff --git a/app/boards/shields/tg4x/Kconfig.shield b/app/boards/shields/tg4x/Kconfig.shield index 27166b10..d7fc1c13 100644 --- a/app/boards/shields/tg4x/Kconfig.shield +++ b/app/boards/shields/tg4x/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TG4X - def_bool $(shields_list_contains,tg4x) + def_bool $(shields_list_contains,tg4x) diff --git a/app/boards/shields/tg4x/boards/nice_nano.overlay b/app/boards/shields/tg4x/boards/nice_nano.overlay index 54046bf5..85ab6fbc 100644 --- a/app/boards/shields/tg4x/boards/nice_nano.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay index 54046bf5..85ab6fbc 100644 --- a/app/boards/shields/tg4x/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tg4x/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tg4x/tg4x.keymap b/app/boards/shields/tg4x/tg4x.keymap index e68d0f92..89a478ae 100644 --- a/app/boards/shields/tg4x/tg4x.keymap +++ b/app/boards/shields/tg4x/tg4x.keymap @@ -9,46 +9,46 @@ #include / { - behaviors { - ht: hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "Hold Tap"; - #binding-cells = <2>; - tapping-term-ms = <200>; - flavor = "tap-preferred"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht: hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "Hold Tap"; + #binding-cells = <2>; + tapping-term-ms = <200>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp SEMI &kp BSPC &ht CAPS TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp APOS &kp RET &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp RSHFT &kp LCTRL &kp LGUI &kp LALT < 1 SPACE &kp SPACE &kp RALT &kp RGUI &mo 2 &kp RCTRL - >; - }; + >; + }; - function_layer { - bindings = < + function_layer { + bindings = < &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp DEL &none &kp HOME &kp PG_UP &trans &trans &trans &kp LBKT &kp RBKT &kp EQUAL &kp BSLH &kp FSLH &trans &trans &kp END &kp PG_DN &trans &trans &trans &trans &trans &trans &kp UP &trans &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp RIGHT - >; - }; + >; + }; - other_layer { - bindings = < + other_layer { + bindings = < &kp PRINTSCREEN &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &bootloader &sys_reset &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_VOL_DN &kp C_PP - >; - }; + >; + }; - }; + }; }; diff --git a/app/boards/shields/tg4x/tg4x.overlay b/app/boards/shields/tg4x/tg4x.overlay index ca6e23c3..c0b1b3bc 100644 --- a/app/boards/shields/tg4x/tg4x.overlay +++ b/app/boards/shields/tg4x/tg4x.overlay @@ -7,49 +7,49 @@ #include / { - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; + diode-direction = "col2row"; - row-gpios - = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; - }; + col-gpios + = <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - rows = <8>; - columns = <7>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + rows = <8>; + columns = <7>; - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(6,0) RC(6,1) RC(6,2) RC(6,4) RC(3,0) RC(3,1) RC(3,2) RC(3,4) RC(3,5) RC(7,1) RC(7,2) RC(7,3) RC(7,4) - >; - }; + >; + }; - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; }; diff --git a/app/boards/shields/tidbit/Kconfig.defconfig b/app/boards/shields/tidbit/Kconfig.defconfig index e3655a9e..393fbef1 100644 --- a/app/boards/shields/tidbit/Kconfig.defconfig +++ b/app/boards/shields/tidbit/Kconfig.defconfig @@ -4,35 +4,35 @@ if SHIELD_TIDBIT config ZMK_KEYBOARD_NAME - default "tidbit" + default "tidbit" if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/tidbit/Kconfig.shield b/app/boards/shields/tidbit/Kconfig.shield index c1e8ecca..dc811bb2 100644 --- a/app/boards/shields/tidbit/Kconfig.shield +++ b/app/boards/shields/tidbit/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TIDBIT - def_bool $(shields_list_contains,tidbit) + def_bool $(shields_list_contains,tidbit) diff --git a/app/boards/shields/tidbit/boards/nice_nano.overlay b/app/boards/shields/tidbit/boards/nice_nano.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/tidbit/boards/nice_nano.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/tidbit/boards/nice_nano_v2.overlay +++ b/app/boards/shields/tidbit/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/tidbit/tidbit.dtsi b/app/boards/shields/tidbit/tidbit.dtsi index ba97a57a..fb84c89e 100644 --- a/app/boards/shields/tidbit/tidbit.dtsi +++ b/app/boards/shields/tidbit/tidbit.dtsi @@ -7,111 +7,111 @@ #include / { - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "row2col"; + diode-direction = "row2col"; - row-gpios - = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - col-gpios - = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + col-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <4>; - rows = <5>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <4>; + rows = <5>; - map = < - RC(0,1) RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) RC(1,3) - RC(2,0) RC(2,1) RC(2,2) RC(2,3) - RC(3,0) RC(3,1) RC(3,2) RC(3,3) - RC(4,0) RC(4,1) RC(4,2) RC(4,3) - >; - }; + map = < + RC(0,1) RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) + >; + }; - encoder_1_top_row: encoder_1_top_row { - compatible = "alps,ec11"; - label = "Top Row Encoder"; - a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1_top_row: encoder_1_top_row { + compatible = "alps,ec11"; + label = "Top Row Encoder"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_1: encoder_1 { - compatible = "alps,ec11"; - label = "Encoder 1"; - a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "Encoder 1"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_2: encoder_2 { - compatible = "alps,ec11"; - label = "Encoder 2"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "Encoder 2"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_3: encoder_3 { - compatible = "alps,ec11"; - label = "Encoder 3"; - a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_3: encoder_3 { + compatible = "alps,ec11"; + label = "Encoder 3"; + a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - encoder_4: encoder_4 { - compatible = "alps,ec11"; - label = "Encoder 4"; - a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; - status = "disabled"; - }; + encoder_4: encoder_4 { + compatible = "alps,ec11"; + label = "Encoder 4"; + a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 11424dc8..2e415bf8 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -10,40 +10,40 @@ #include &encoder_1_top_row { - status = "okay"; + status = "okay"; }; / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_1_top_row>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1_top_row>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS - &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none - &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER - &none &kp KP_NUMBER_0 &kp KP_DOT &none - >; + default_layer { + bindings = < + &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS + &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none + &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 < 1 KP_ENTER + &none &kp KP_NUMBER_0 &kp KP_DOT &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; - func_layer { - bindings = < - &none &sys_reset &bootloader - &out OUT_TOG &out OUT_USB &out OUT_BLE &none - &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR - &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 - &kp C_MUTE &none &none &none - >; + func_layer { + bindings = < + &none &sys_reset &bootloader + &out OUT_TOG &out OUT_USB &out OUT_BLE &none + &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 + &kp C_MUTE &none &none &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + }; }; diff --git a/app/boards/shields/tidbit/tidbit_19key.keymap b/app/boards/shields/tidbit/tidbit_19key.keymap index 5710aeaf..1be71e7a 100644 --- a/app/boards/shields/tidbit/tidbit_19key.keymap +++ b/app/boards/shields/tidbit/tidbit_19key.keymap @@ -11,40 +11,40 @@ #include &encoder_4 { - status = "okay"; + status = "okay"; }; / { - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder_4>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_4>; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &tog 1 &kp KP_NUMLOCK &kp KP_SLASH - &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK - &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS - &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS - &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER - >; + default_layer { + bindings = < + &tog 1 &kp KP_NUMLOCK &kp KP_SLASH + &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK + &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS + &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS + &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; - func_layer { - bindings = < - &tog 0 &sys_reset &bootloader - &out OUT_TOG &out OUT_USB &out OUT_BLE &none - &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR - &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none - &kp C_MUTE &none &none &none - >; + func_layer { + bindings = < + &tog 0 &sys_reset &bootloader + &out OUT_TOG &out OUT_USB &out OUT_BLE &none + &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR + &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none + &kp C_MUTE &none &none &none + >; - sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; + }; + }; }; diff --git a/app/boards/shields/two_percent_milk/Kconfig.shield b/app/boards/shields/two_percent_milk/Kconfig.shield index ec2c3b1f..b6fbcfdc 100644 --- a/app/boards/shields/two_percent_milk/Kconfig.shield +++ b/app/boards/shields/two_percent_milk/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_TWO_PERCENT_MILK - def_bool $(shields_list_contains,two_percent_milk) + def_bool $(shields_list_contains,two_percent_milk) diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay index ad66feac..75514ac4 100644 --- a/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay +++ b/app/boards/shields/two_percent_milk/boards/nice_nano_v2.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi3_default>; - pinctrl-1 = <&spi3_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay index 64d16572..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay index b84beb93..31678980 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_11_flipped.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay index 64d16572..d20e58e7 100644 --- a/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay +++ b/app/boards/shields/two_percent_milk/boards/nrfmicro_13.overlay @@ -1,47 +1,47 @@ #include &pinctrl { - spi1_default: spi1_default { - group1 { - psels = ; - }; - }; + spi1_default: spi1_default { + group1 { + psels = ; + }; + }; - spi1_sleep: spi1_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi1_sleep: spi1_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi1 { - compatible = "nordic,nrf-spim"; - status = "okay"; + compatible = "nordic,nrf-spim"; + status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; - label = "WS2812"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <10>; /* arbitrary; change at will */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <10>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; diff --git a/app/boards/shields/two_percent_milk/two_percent_milk.overlay b/app/boards/shields/two_percent_milk/two_percent_milk.overlay index d43ed321..8d4a244a 100644 --- a/app/boards/shields/two_percent_milk/two_percent_milk.overlay +++ b/app/boards/shields/two_percent_milk/two_percent_milk.overlay @@ -5,20 +5,20 @@ */ / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; - label = "KSCAN"; + label = "KSCAN"; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/Kconfig.defconfig b/app/boards/shields/waterfowl/Kconfig.defconfig index 5a77ca11..dbee82b8 100644 --- a/app/boards/shields/waterfowl/Kconfig.defconfig +++ b/app/boards/shields/waterfowl/Kconfig.defconfig @@ -2,44 +2,44 @@ if SHIELD_WATERFOWL_LEFT config ZMK_KEYBOARD_NAME - default "Waterfowl" + default "Waterfowl" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_WATERFOWL_LEFT || SHIELD_WATERFOWL_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/waterfowl/Kconfig.shield b/app/boards/shields/waterfowl/Kconfig.shield index a321b73d..ec01a626 100644 --- a/app/boards/shields/waterfowl/Kconfig.shield +++ b/app/boards/shields/waterfowl/Kconfig.shield @@ -3,7 +3,7 @@ config SHIELD_WATERFOWL_LEFT - def_bool $(shields_list_contains,waterfowl_left) + def_bool $(shields_list_contains,waterfowl_left) config SHIELD_WATERFOWL_RIGHT - def_bool $(shields_list_contains,waterfowl_right) + def_bool $(shields_list_contains,waterfowl_right) diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index a156360e..7f4929b3 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -7,79 +7,79 @@ #include / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; -// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | -// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | -// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | -// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | - map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) -RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) - >; - }; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; +// | MX5 | MX4 | MX3 | MX2 | MX1 | | MX1 | MX2 | MX3 | MX4 | MX5 | +// | MX10 | MX9 | MX8 | MX7 | MX6 | | MX6 | MX7 | MX8 | MX9 | MX10 | +// | MX15 | MX14 | MX13 | MX12 | MX11 | | MX11 | MX12 | MX13 | MX14 | MX15 | +// | MX20 | MX19 | MX18 | MX17 | MX16 | | MX16 | MX17 | MX18 | MX19 | MX20 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - left_encoder: encoder_left { //roller - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; + left_encoder: encoder_left { //roller + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; - right_encoder: encoder_right { //Standard encoder on left half - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <2>; - }; + right_encoder: encoder_right { //Standard encoder on left half + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <2>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; - // TODO: RGB node(s) + // TODO: RGB node(s) }; &pro_micro_i2c { - status = "okay"; + status = "okay"; - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <64>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <63>; - prechargep = <0x22>; - }; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <63>; + prechargep = <0x22>; + }; }; diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index 9583499c..c47f188b 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -9,10 +9,10 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { /* QWERTY * * ,----------------------------------. ,----------------------------------. @@ -26,17 +26,17 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P - &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI - &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P + &mt LGUI A &mt LALT S &mt LCTRL D &mt LSHFT F &kp G &kp H &mt LSHFT J &mt LCTRL K &mt LALT L &mt LGUI SEMI + &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - navnum_layer { + navnum_layer { /* NAVNUM * * ,----------------------------------. ,----------------------------------. @@ -50,17 +50,17 @@ * | 1 | | DEL | SPACE | MO(3)| | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS - &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS - &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &trans &kp PG_UP &kp UP &kp PG_DN &trans &kp FSLH &kp N7 &kp N8 &kp N9 &kp MINUS + &kp HOME &kp LEFT &kp DOWN &kp RIGHT &kp END &kp EQUAL &kp N4 &kp N5 &kp N6 &kp PLUS + &trans &trans &kp INS &trans &trans &kp N0 &kp N1 &kp N2 &kp N3 &kp ASTERISK + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - symbol_layer { + symbol_layer { /* SYM * * ,----------------------------------. ,----------------------------------. @@ -74,17 +74,17 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans - &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE - &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &kp PRCNT &kp AT &kp LBKT &kp RBKT &kp NON_US_BSLH &trans &trans &kp CARET &trans &trans + &kp HASH &kp EXCL &kp LPAR &kp RPAR &kp PIPE &kp UNDER &kp APOS &kp DOUBLE_QUOTES &kp TILDE &kp GRAVE + &kp DLLR &trans &kp LBRC &kp RBRC &kp AMPS &trans &trans &trans &trans &trans + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - function_layer { + function_layer { /* FUNC * * ,----------------------------------. ,----------------------------------. @@ -98,15 +98,15 @@ * | 1 | | DEL | SPACE | TAB | | ESC | BS | ENTER | | 4 | * `-----' `--------------------' `--------------------' `-----' */ - bindings = < - &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 - &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 - &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 - &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 - >; + bindings = < + &trans &trans &bt BT_CLR &trans &sys_reset &sys_reset &kp F7 &kp F8 &kp F9 &kp F11 + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &kp F4 &kp F5 &kp F6 &kp F12 + &trans &trans &trans &trans &trans &kp F10 &kp F1 &kp F2 &kp F3 &kp F13 + &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 + >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; - }; + sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + }; - }; + }; }; \ No newline at end of file diff --git a/app/boards/shields/waterfowl/waterfowl_left.overlay b/app/boards/shields/waterfowl/waterfowl_left.overlay index 031936ea..3b9fd42d 100644 --- a/app/boards/shields/waterfowl/waterfowl_left.overlay +++ b/app/boards/shields/waterfowl/waterfowl_left.overlay @@ -7,15 +7,15 @@ #include "waterfowl.dtsi" &kscan0 { - col-gpios - = <&pro_micro 21 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/waterfowl/waterfowl_right.overlay b/app/boards/shields/waterfowl/waterfowl_right.overlay index cff0d53c..bf8f3a44 100644 --- a/app/boards/shields/waterfowl/waterfowl_right.overlay +++ b/app/boards/shields/waterfowl/waterfowl_right.overlay @@ -7,20 +7,20 @@ #include "waterfowl.dtsi" &default_transform { - col-offset = <5>; + col-offset = <5>; }; &kscan0 { - col-gpios - = <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 18 GPIO_ACTIVE_HIGH> - , <&pro_micro 19 GPIO_ACTIVE_HIGH> - , <&pro_micro 20 GPIO_ACTIVE_HIGH> - , <&pro_micro 21 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/zmk_uno/Kconfig.shield b/app/boards/shields/zmk_uno/Kconfig.shield index 3f7331c3..958915f5 100644 --- a/app/boards/shields/zmk_uno/Kconfig.shield +++ b/app/boards/shields/zmk_uno/Kconfig.shield @@ -2,4 +2,4 @@ # SPDX-License-Identifier: MIT config SHIELD_ZMK_UNO - def_bool $(shields_list_contains,zmk_uno) + def_bool $(shields_list_contains,zmk_uno) diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 12b5e2b3..04332911 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -8,172 +8,172 @@ #include &arduino_i2c { - status = "okay"; + status = "okay"; }; &arduino_spi { - status = "okay"; + status = "okay"; - led_strip: ws2812@0 { - compatible = "worldsemi,ws2812-spi"; + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; - /* SPI */ - reg = <0>; /* ignored, but necessary for SPI bindings */ - spi-max-frequency = <4000000>; + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; - /* WS2812 */ - chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ - spi-one-frame = <0x70>; - spi-zero-frame = <0x40>; + /* WS2812 */ + chain-length = <7>; /* 4 underglow + 3 per-key LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; - color-mapping = ; - }; + color-mapping = ; + }; }; / { - chosen { - zmk,kscan = &kscan_matrix_comp; - zmk,backlight = &backlight; - zmk,underglow = &led_strip; - zmk,matrix-transform = &matrix_transform; - }; + chosen { + zmk,kscan = &kscan_matrix_comp; + zmk,backlight = &backlight; + zmk,underglow = &led_strip; + zmk,matrix-transform = &matrix_transform; + }; - // Commented out until we add more powerful power domain support - // external_power { - // compatible = "zmk,ext-power-generic"; - // label = "EXT_POWER"; - // init-delay-ms = <200>; - // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - // }; + // Commented out until we add more powerful power domain support + // external_power { + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // }; - rgb_power { - compatible = "zmk,ext-power-generic"; - label = "EXT_POWER"; - // label = "RGB_POWER"; - init-delay-ms = <200>; - control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; - }; + rgb_power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + // label = "RGB_POWER"; + init-delay-ms = <200>; + control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + }; - backlight: gpioleds { - compatible = "gpio-leds"; - label = "Backlight LEDs"; - gpio_led_0 { - gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - }; + backlight: gpioleds { + compatible = "gpio-leds"; + label = "Backlight LEDs"; + gpio_led_0 { + gpios = <&arduino_header 12 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + }; - matrix_transform: matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; + matrix_transform: matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; - map = < - RC(0,0) RC(0,1) - RC(1,0) RC(1,1) - RC(2,0) RC(2,1) RC(2,2) - >; - }; + map = < + RC(0,0) RC(0,1) + RC(1,0) RC(1,1) + RC(2,0) RC(2,1) RC(2,2) + >; + }; - direct_matrix_transform: direct_matrix_transform { - compatible = "zmk,matrix-transform"; - rows = <3>; - columns = <4>; + direct_matrix_transform: direct_matrix_transform { + compatible = "zmk,matrix-transform"; + rows = <3>; + columns = <4>; - map = < - RC(0,0) RC(0,1) - RC(0,2) RC(0,3) - RC(1,0) RC(1,1) RC(1,2) - >; - }; + map = < + RC(0,0) RC(0,1) + RC(0,2) RC(0,3) + RC(1,0) RC(1,1) RC(1,2) + >; + }; - kscan_matrix_comp: kscan_matrix_comp { - compatible = "zmk,kscan-composite"; - rows = <1>; - columns = <7>; + kscan_matrix_comp: kscan_matrix_comp { + compatible = "zmk,kscan-composite"; + rows = <1>; + columns = <7>; - label = "KSCAN_MATRIX_COMP"; + label = "KSCAN_MATRIX_COMP"; - matrix { - kscan = <&kscan_matrix>; - }; + matrix { + kscan = <&kscan_matrix>; + }; - toggle { - kscan = <&kscan_sp3t_toggle>; - row-offset = <2>; - }; + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <2>; + }; - }; + }; - kscan_direct_comp: kscan_direct_comp { - compatible = "zmk,kscan-composite"; + kscan_direct_comp: kscan_direct_comp { + compatible = "zmk,kscan-composite"; - label = "KSCAN_DIRECT_COMP"; - status = "disabled"; + label = "KSCAN_DIRECT_COMP"; + status = "disabled"; - matrix { - kscan = <&kscan_direct>; - }; + matrix { + kscan = <&kscan_direct>; + }; - toggle { - kscan = <&kscan_sp3t_toggle>; - row-offset = <1>; - }; + toggle { + kscan = <&kscan_sp3t_toggle>; + row-offset = <1>; + }; - }; + }; - kscan_matrix: kscan_matrix { - compatible = "zmk,kscan-gpio-matrix"; + kscan_matrix: kscan_matrix { + compatible = "zmk,kscan-gpio-matrix"; - diode-direction = "col2row"; + diode-direction = "col2row"; - col-gpios - = <&arduino_header 10 GPIO_ACTIVE_HIGH> - , <&arduino_header 9 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; - row-gpios - = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + row-gpios + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; - }; + }; - kscan_direct: kscan_direct { - compatible = "zmk,kscan-gpio-direct"; - status = "disabled"; + kscan_direct: kscan_direct { + compatible = "zmk,kscan-gpio-direct"; + status = "disabled"; - input-gpios - = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + input-gpios + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; - }; + }; - kscan_sp3t_toggle: kscan_sp3t_toggle { - compatible = "zmk,kscan-gpio-direct"; - toggle-mode; + kscan_sp3t_toggle: kscan_sp3t_toggle { + compatible = "zmk,kscan-gpio-direct"; + toggle-mode; - input-gpios - = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; - }; + input-gpios + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; - encoder: encoder { - label = "ENCODER"; - resolution = <4>; - compatible = "alps,ec11"; - a-gpios = <&arduino_header 14 GPIO_PULL_UP>; - b-gpios = <&arduino_header 15 GPIO_PULL_UP>; - }; + encoder: encoder { + label = "ENCODER"; + resolution = <4>; + compatible = "alps,ec11"; + a-gpios = <&arduino_header 14 GPIO_PULL_UP>; + b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + }; - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&encoder>; - }; + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder>; + }; }; diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig index c6024694..e7538c41 100644 --- a/app/boards/shields/zodiark/Kconfig.defconfig +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -4,44 +4,44 @@ if SHIELD_ZODIARK_LEFT config ZMK_KEYBOARD_NAME - default "Zodiark" + default "Zodiark" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_ZODIARK_LEFT || SHIELD_ZODIARK_RIGHT config ZMK_SPLIT - default y + default y if ZMK_DISPLAY config I2C - default y + default y config SSD1306 - default y + default y config SSD1306_REVERSE_MODE - default y + default y endif # ZMK_DISPLAY if LVGL config LV_Z_VDB_SIZE - default 64 + default 64 config LV_Z_DPI - default 148 + default 148 config LV_Z_BITS_PER_PIXEL - default 1 + default 1 choice LV_COLOR_DEPTH - default LV_COLOR_DEPTH_1 + default LV_COLOR_DEPTH_1 endchoice endif # LVGL diff --git a/app/boards/shields/zodiark/Kconfig.shield b/app/boards/shields/zodiark/Kconfig.shield index 25e23a14..0eb4e8ad 100644 --- a/app/boards/shields/zodiark/Kconfig.shield +++ b/app/boards/shields/zodiark/Kconfig.shield @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MIT config SHIELD_ZODIARK_LEFT - def_bool $(shields_list_contains,zodiark_left) + def_bool $(shields_list_contains,zodiark_left) config SHIELD_ZODIARK_RIGHT - def_bool $(shields_list_contains,zodiark_right) + def_bool $(shields_list_contains,zodiark_right) diff --git a/app/boards/shields/zodiark/zodiark_left.overlay b/app/boards/shields/zodiark/zodiark_left.overlay index fe55edc6..1f866f78 100644 --- a/app/boards/shields/zodiark/zodiark_left.overlay +++ b/app/boards/shields/zodiark/zodiark_left.overlay @@ -7,17 +7,17 @@ #include "zodiark.dtsi" &kscan0 { - col-gpios - = <&pro_micro 2 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 10 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; }; &left_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/shields/zodiark/zodiark_right.overlay b/app/boards/shields/zodiark/zodiark_right.overlay index 3405f59b..998f1e00 100644 --- a/app/boards/shields/zodiark/zodiark_right.overlay +++ b/app/boards/shields/zodiark/zodiark_right.overlay @@ -7,21 +7,21 @@ #include "zodiark.dtsi" &default_transform { - col-offset = <7>; + col-offset = <7>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> - , <&pro_micro 16 GPIO_ACTIVE_HIGH> - , <&pro_micro 14 GPIO_ACTIVE_HIGH> - , <&pro_micro 15 GPIO_ACTIVE_HIGH> - , <&pro_micro 0 GPIO_ACTIVE_HIGH> - , <&pro_micro 1 GPIO_ACTIVE_HIGH> - , <&pro_micro 2 GPIO_ACTIVE_HIGH> - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + ; }; &right_encoder { - status = "okay"; + status = "okay"; }; diff --git a/app/boards/usb_console.dtsi b/app/boards/usb_console.dtsi index 4ce59408..3cc76ad3 100644 --- a/app/boards/usb_console.dtsi +++ b/app/boards/usb_console.dtsi @@ -6,15 +6,15 @@ / { - chosen { - zephyr,console = &cdc_acm_uart; - }; + chosen { + zephyr,console = &cdc_acm_uart; + }; }; &usbd { - cdc_acm_uart: cdc_acm_uart { - compatible = "zephyr,cdc-acm-uart"; - label = "CDC_ACM_0"; - }; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; }; diff --git a/app/cmake/ZephyrBuildConfig.cmake b/app/cmake/ZephyrBuildConfig.cmake index 931dd7ac..ade34199 100644 --- a/app/cmake/ZephyrBuildConfig.cmake +++ b/app/cmake/ZephyrBuildConfig.cmake @@ -14,13 +14,13 @@ get_property(cached_user_config_value CACHE ZMK_CONFIG PROPERTY VALUE) set(user_config_cli_argument ${cached_user_config_value}) # Either new or old if(user_config_cli_argument STREQUAL CACHED_ZMK_CONFIG) - # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI + # We already have a CACHED_ZMK_CONFIG so there is no new input on the CLI unset(user_config_cli_argument) endif() set(user_config_app_cmake_lists ${ZMK_CONFIG}) if(cached_user_config_value STREQUAL ZMK_CONFIG) - # The app build scripts did not set a default, The ZMK_CONFIG we are + # The app build scripts did not set a default, The ZMK_CONFIG we are # reading is the cached value from the CLI unset(user_config_app_cmake_lists) endif() @@ -29,172 +29,172 @@ if(CACHED_ZMK_CONFIG) # Warn the user if it looks like he is trying to change the user_config # without cleaning first if(user_config_cli_argument) - if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) + if(NOT (CACHED_ZMK_CONFIG STREQUAL user_config_cli_argument)) message(WARNING "The build directory must be cleaned pristinely when changing user ZMK config") endif() endif() set(ZMK_CONFIG ${CACHED_ZMK_CONFIG}) elseif(user_config_cli_argument) - set(ZMK_CONFIG ${user_config_cli_argument}) + set(ZMK_CONFIG ${user_config_cli_argument}) elseif(DEFINED ENV{ZMK_CONFIG}) - set(ZMK_CONFIG $ENV{ZMK_CONFIG}) + set(ZMK_CONFIG $ENV{ZMK_CONFIG}) elseif(user_config_app_cmake_lists) - set(ZMK_CONFIG ${user_config_app_cmake_lists}) + set(ZMK_CONFIG ${user_config_app_cmake_lists}) endif() # Store the selected user_config in the cache set(CACHED_ZMK_CONFIG ${ZMK_CONFIG} CACHE STRING "Selected user ZMK config") if (ZMK_CONFIG) - set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") - if(EXISTS ${ZMK_CONFIG}/boards) - message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") - list(APPEND BOARD_ROOT ${ZMK_CONFIG}) - endif() - if(EXISTS ${ZMK_CONFIG}/dts) - message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") - list(APPEND DTS_ROOT ${ZMK_CONFIG}) - endif() + set(ENV{ZMK_CONFIG} "${ZMK_CONFIG}") + if(EXISTS ${ZMK_CONFIG}/boards) + message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") + list(APPEND BOARD_ROOT ${ZMK_CONFIG}) + endif() + if(EXISTS ${ZMK_CONFIG}/dts) + message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") + list(APPEND DTS_ROOT ${ZMK_CONFIG}) + endif() endif() if(DEFINED SHIELD) - string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") + string(REPLACE " " ";" SHIELD_AS_LIST "${SHIELD}") endif() foreach(root ${BOARD_ROOT}) - set(shield_dir ${root}/boards/shields) - # Match the Kconfig.shield files in the shield directories to make sure we are - # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield - file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) - unset(SHIELD_LIST) - foreach(shields_refs ${shields_refs_list}) - get_filename_component(shield_path ${shields_refs} DIRECTORY) - file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) - foreach(overlay ${shield_overlays}) - get_filename_component(shield ${overlay} NAME_WE) - list(APPEND SHIELD_LIST ${shield}) - set(SHIELD_DIR_${shield} ${shield_path}) - endforeach() - endforeach() + set(shield_dir ${root}/boards/shields) + # Match the Kconfig.shield files in the shield directories to make sure we are + # finding shields, e.g. x_nucleo_iks01a1/Kconfig.shield + file(GLOB_RECURSE shields_refs_list ${shield_dir}/*/Kconfig.shield) + unset(SHIELD_LIST) + foreach(shields_refs ${shields_refs_list}) + get_filename_component(shield_path ${shields_refs} DIRECTORY) + file(GLOB shield_overlays RELATIVE ${shield_path} ${shield_path}/*.overlay) + foreach(overlay ${shield_overlays}) + get_filename_component(shield ${overlay} NAME_WE) + list(APPEND SHIELD_LIST ${shield}) + set(SHIELD_DIR_${shield} ${shield_path}) + endforeach() + endforeach() - if (EXISTS "${root}/boards/${BOARD}.overlay") - list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") - endif() - if (NOT DEFINED BOARD_DIR_NAME) - find_path(BOARD_DIR - NAMES ${BOARD}_defconfig - PATHS ${root}/boards/*/* - NO_DEFAULT_PATH - ) - if(BOARD_DIR) - get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) - list(APPEND KEYMAP_DIRS ${BOARD_DIR}) - endif() - endif() + if (EXISTS "${root}/boards/${BOARD}.overlay") + list(APPEND shield_dts_files "${root}/boards/${BOARD}.overlay") + endif() + if (NOT DEFINED BOARD_DIR_NAME) + find_path(BOARD_DIR + NAMES ${BOARD}_defconfig + PATHS ${root}/boards/*/* + NO_DEFAULT_PATH + ) + if(BOARD_DIR) + get_filename_component(BOARD_DIR_NAME ${BOARD_DIR} NAME) + list(APPEND KEYMAP_DIRS ${BOARD_DIR}) + endif() + endif() - if(DEFINED SHIELD) - foreach(s ${SHIELD_AS_LIST}) - if(NOT ${s} IN_LIST SHIELD_LIST) - message(WARNING "Didn't find ${s}") - continue() - endif() - message(STATUS "Adding ${SHIELD_DIR_${s}}") - list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - list(APPEND SHIELD_DIR ${shield_dir_name}) - endforeach() - endif() + if(DEFINED SHIELD) + foreach(s ${SHIELD_AS_LIST}) + if(NOT ${s} IN_LIST SHIELD_LIST) + message(WARNING "Didn't find ${s}") + continue() + endif() + message(STATUS "Adding ${SHIELD_DIR_${s}}") + list(APPEND KEYMAP_DIRS ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + list(APPEND SHIELD_DIR ${shield_dir_name}) + endforeach() + endif() endforeach() # Give a shield like `kyria_rev2_left` we want to use `kyria_rev2` and `kyria` as candidate names for # overlay/conf/keymap files. if(DEFINED SHIELD) - foreach(s ${SHIELD_AS_LIST}) - if (DEFINED $SHIELD_DIR_${s}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - endif() - string(REPLACE "_" ";" S_PIECES ${s}) - list(LENGTH S_PIECES S_PIECES_LEN) - while(NOT S_PIECES STREQUAL "") - list(POP_BACK S_PIECES) - list(JOIN S_PIECES "_" s_substr) - if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") - break() - endif() - list(APPEND shield_candidate_names ${s_substr}) - endwhile() - endforeach() + foreach(s ${SHIELD_AS_LIST}) + if (DEFINED $SHIELD_DIR_${s}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + string(REPLACE "_" ";" S_PIECES ${s}) + list(LENGTH S_PIECES S_PIECES_LEN) + while(NOT S_PIECES STREQUAL "") + list(POP_BACK S_PIECES) + list(JOIN S_PIECES "_" s_substr) + if ("${s_substr}" STREQUAL "" OR "${s_substr}" STREQUAL "${shield_dir_name}") + break() + endif() + list(APPEND shield_candidate_names ${s_substr}) + endwhile() + endforeach() endif() if (ZMK_CONFIG) - if (EXISTS ${ZMK_CONFIG}) - message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") - list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") + if (EXISTS ${ZMK_CONFIG}) + message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") + list(PREPEND KEYMAP_DIRS "${ZMK_CONFIG}") - if (DEFINED SHIELD) - foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) - if (DEFINED ${SHIELD_DIR_${s}}) - get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) - endif() - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") - if (NOT "${shield_dir_name}" STREQUAL "${s}") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") - endif() - list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") - endforeach() - endif() + if (DEFINED SHIELD) + foreach (s ${shield_candidate_names} ${SHIELD_AS_LIST}) + if (DEFINED ${SHIELD_DIR_${s}}) + get_filename_component(shield_dir_name ${SHIELD_DIR_${s}} NAME) + endif() + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}_${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${s}.overlay") + if (NOT "${shield_dir_name}" STREQUAL "${s}") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${shield_dir_name}.conf") + endif() + list(APPEND config_candidates "${ZMK_CONFIG}/${s}_${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${s}.conf") + endforeach() + endif() - # TODO: Board revisions? - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") - list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") - list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") + # TODO: Board revisions? + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${BOARD}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/default.overlay") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD_DIR_NAME}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${BOARD}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/default.conf") - foreach(overlay ${overlay_candidates}) - if (EXISTS "${overlay}") - message(STATUS "ZMK Config devicetree overlay: ${overlay}") - list(APPEND shield_dts_files "${overlay}") - break() - endif() - endforeach() + foreach(overlay ${overlay_candidates}) + if (EXISTS "${overlay}") + message(STATUS "ZMK Config devicetree overlay: ${overlay}") + list(APPEND shield_dts_files "${overlay}") + break() + endif() + endforeach() - foreach(conf ${config_candidates}) - if (EXISTS "${conf}") - message(STATUS "ZMK Config Kconfig: ${conf}") - list(APPEND shield_conf_files "${conf}") - endif() - endforeach() - else() - message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") - endif() + foreach(conf ${config_candidates}) + if (EXISTS "${conf}") + message(STATUS "ZMK Config Kconfig: ${conf}") + list(APPEND shield_conf_files "${conf}") + endif() + endforeach() + else() + message(WARNING "Unable to locate ZMK config at: ${ZMK_CONFIG}") + endif() endif() if(NOT KEYMAP_FILE) - foreach(keymap_dir ${KEYMAP_DIRS}) - foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) - if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) - set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) - break() - endif() - endforeach() - endforeach() + foreach(keymap_dir ${KEYMAP_DIRS}) + foreach(keymap_prefix ${shield_candidate_names} ${SHIELD_AS_LIST} ${SHIELD_DIR} ${BOARD} ${BOARD_DIR_NAME}) + if (EXISTS ${keymap_dir}/${keymap_prefix}.keymap) + set(KEYMAP_FILE "${keymap_dir}/${keymap_prefix}.keymap" CACHE STRING "Selected keymap file") + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) + break() + endif() + endforeach() + endforeach() else() - message(STATUS "Using keymap file: ${KEYMAP_FILE}") - set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) + message(STATUS "Using keymap file: ${KEYMAP_FILE}") + set(DTC_OVERLAY_FILE ${KEYMAP_FILE}) endif() if (NOT KEYMAP_FILE) - message(WARNING "Failed to locate keymap file!") + message(WARNING "Failed to locate keymap file!") endif() diff --git a/app/drivers/display/CMakeLists.txt b/app/drivers/display/CMakeLists.txt index 13b97193..d5e83c1d 100644 --- a/app/drivers/display/CMakeLists.txt +++ b/app/drivers/display/CMakeLists.txt @@ -1,4 +1,4 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT -zephyr_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file +zephyr_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file diff --git a/app/drivers/display/Kconfig.il0323 b/app/drivers/display/Kconfig.il0323 index f39015ef..f3308c16 100644 --- a/app/drivers/display/Kconfig.il0323 +++ b/app/drivers/display/Kconfig.il0323 @@ -4,8 +4,8 @@ # IL0323 display controller configuration options config IL0323 - bool "IL0323 compatible display controller driver" - depends on SPI - depends on HEAP_MEM_POOL_SIZE != 0 - help - Enable driver for IL0323 compatible controller. \ No newline at end of file + bool "IL0323 compatible display controller driver" + depends on SPI + depends on HEAP_MEM_POOL_SIZE != 0 + help + Enable driver for IL0323 compatible controller. \ No newline at end of file diff --git a/app/drivers/gpio/Kconfig.595 b/app/drivers/gpio/Kconfig.595 index f43e807b..b4b6bdcc 100644 --- a/app/drivers/gpio/Kconfig.595 +++ b/app/drivers/gpio/Kconfig.595 @@ -6,20 +6,20 @@ DT_COMPAT_ZMK_GPIO_595 := zmk,gpio-595 menuconfig GPIO_595 - bool "595 Shift Register SPI driver" - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) - depends on SPI - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for 595 shift register chip using SPI. + bool "595 Shift Register SPI driver" + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) + depends on SPI + select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO + help + Enable driver for 595 shift register chip using SPI. if GPIO_595 config GPIO_595_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. + int "Init priority" + default 75 + help + Device driver initialization priority. endif #GPIO_595 diff --git a/app/drivers/gpio/Kconfig.max7318 b/app/drivers/gpio/Kconfig.max7318 index ded7f926..d572b970 100644 --- a/app/drivers/gpio/Kconfig.max7318 +++ b/app/drivers/gpio/Kconfig.max7318 @@ -6,20 +6,20 @@ DT_COMPAT_MAXIM_MAX7318 := maxim,max7318 menuconfig GPIO_MAX7318 - bool "MAX7318 I2C-based GPIO chip" - default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) - depends on I2C - select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO - help - Enable driver for MAX7318 I2C-based GPIO chip. + bool "MAX7318 I2C-based GPIO chip" + default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) + depends on I2C + select HAS_DTS_GPIO + select ZMK_DRIVERS_GPIO + help + Enable driver for MAX7318 I2C-based GPIO chip. if GPIO_MAX7318 config GPIO_MAX7318_INIT_PRIORITY - int "Init priority" - default 75 - help - Device driver initialization priority. + int "Init priority" + default 75 + help + Device driver initialization priority. endif #GPIO_MAX7318 diff --git a/app/drivers/kscan/Kconfig b/app/drivers/kscan/Kconfig index 216651a1..1d165669 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/drivers/kscan/Kconfig @@ -8,87 +8,87 @@ DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX := zmk,kscan-gpio-matrix DT_COMPAT_ZMK_KSCAN_MOCK := zmk,kscan-mock config ZMK_KSCAN_COMPOSITE_DRIVER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) config ZMK_KSCAN_GPIO_DRIVER - bool - select GPIO + bool + select GPIO config ZMK_KSCAN_GPIO_DEMUX - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DEMUX)) + select ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_GPIO_DIRECT - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT)) + select ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_GPIO_MATRIX - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) - select ZMK_KSCAN_GPIO_DRIVER + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX)) + select ZMK_KSCAN_GPIO_DRIVER if ZMK_KSCAN_GPIO_MATRIX config ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS - int "Ticks to wait before reading inputs after an output set active" - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for output to propagate to the - inputs. In that scenario, set this value to a positive value to configure - the number of ticks to wait after setting an output active before reading - the inputs for their active state. + int "Ticks to wait before reading inputs after an output set active" + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for output to propagate to the + inputs. In that scenario, set this value to a positive value to configure + the number of ticks to wait after setting an output active before reading + the inputs for their active state. config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS int "Ticks to wait between each output when scanning" - default 1 if SOC_RP2040 - default 0 - help - When iterating over each output to drive it active, read inputs, then set - inactive again, some boards may take time for the previous output to - "settle" before reading inputs for the next active output column. In that - scenario, set this value to a positive value to configure the number of - ticks to wait after reading each column of keys. + default 1 if SOC_RP2040 + default 0 + help + When iterating over each output to drive it active, read inputs, then set + inactive again, some boards may take time for the previous output to + "settle" before reading inputs for the next active output column. In that + scenario, set this value to a positive value to configure the number of + ticks to wait after reading each column of keys. endif # ZMK_KSCAN_GPIO_MATRIX config ZMK_KSCAN_MOCK_DRIVER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_MOCK)) if ZMK_KSCAN_GPIO_DRIVER config ZMK_KSCAN_MATRIX_POLLING - bool "Poll for key event triggers instead of using interrupts on matrix boards." + bool "Poll for key event triggers instead of using interrupts on matrix boards." config ZMK_KSCAN_DIRECT_POLLING - bool "Poll for key event triggers instead of using interrupts on direct wired boards." + bool "Poll for key event triggers instead of using interrupts on direct wired boards." config ZMK_KSCAN_DEBOUNCE_PRESS_MS - int "Debounce time for key press in milliseconds." - default -1 - help - Global debounce time for key press in milliseconds. - If this is -1, the debounce time is controlled by the debounce-press-ms - Devicetree property, which defaults to 5 ms. Otherwise this overrides the - debounce time for all key scan drivers to the chosen value. + int "Debounce time for key press in milliseconds." + default -1 + help + Global debounce time for key press in milliseconds. + If this is -1, the debounce time is controlled by the debounce-press-ms + Devicetree property, which defaults to 5 ms. Otherwise this overrides the + debounce time for all key scan drivers to the chosen value. config ZMK_KSCAN_DEBOUNCE_RELEASE_MS - int "Debounce time for key release in milliseconds." - default -1 - help - Global debounce time for key release in milliseconds. - If this is -1, the debounce time is controlled by the debounce-release-ms - Devicetree property, which defaults to 5 ms. Otherwise this overrides the - debounce time for all key scan drivers to the chosen value. + int "Debounce time for key release in milliseconds." + default -1 + help + Global debounce time for key release in milliseconds. + If this is -1, the debounce time is controlled by the debounce-release-ms + Devicetree property, which defaults to 5 ms. Otherwise this overrides the + debounce time for all key scan drivers to the chosen value. endif config ZMK_KSCAN_INIT_PRIORITY - int "Keyboard scan driver init priority" - default 40 - help - Keyboard scan device driver initialization priority. + int "Keyboard scan driver init priority" + default 40 + help + Keyboard scan device driver initialization priority. diff --git a/app/drivers/sensor/battery/Kconfig b/app/drivers/sensor/battery/Kconfig index d7c82bb0..a9d7189e 100644 --- a/app/drivers/sensor/battery/Kconfig +++ b/app/drivers/sensor/battery/Kconfig @@ -5,22 +5,22 @@ DT_COMPAT_ZMK_BATTERY_NRF_VDDH := zmk,battery-nrf-vddh DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER := zmk,battery-voltage-divider config ZMK_BATTERY - bool "ZMK battery monitoring" - help - Enable battery monitoring + bool "ZMK battery monitoring" + help + Enable battery monitoring config ZMK_BATTERY_NRF_VDDH - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) - select ADC - select ZMK_BATTERY - help - Enable ZMK nRF VDDH voltage driver for battery monitoring. + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) + select ADC + select ZMK_BATTERY + help + Enable ZMK nRF VDDH voltage driver for battery monitoring. config ZMK_BATTERY_VOLTAGE_DIVIDER - bool - default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) - select ADC - select ZMK_BATTERY - help - Enable ZMK battery voltage divider driver for battery monitoring. + bool + default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) + select ADC + select ZMK_BATTERY + help + Enable ZMK battery voltage divider driver for battery monitoring. diff --git a/app/drivers/sensor/ec11/Kconfig b/app/drivers/sensor/ec11/Kconfig index 6854e530..e86d092a 100644 --- a/app/drivers/sensor/ec11/Kconfig +++ b/app/drivers/sensor/ec11/Kconfig @@ -2,49 +2,49 @@ # SPDX-License-Identifier: MIT menuconfig EC11 - bool "EC11 Incremental Encoder Sensor" - depends on GPIO - help - Enable driver for EC11 incremental encoder sensors. + bool "EC11 Incremental Encoder Sensor" + depends on GPIO + help + Enable driver for EC11 incremental encoder sensors. if EC11 choice - prompt "Trigger mode" - default EC11_TRIGGER_NONE - help - Specify the type of triggering to be used by the driver. + prompt "Trigger mode" + default EC11_TRIGGER_NONE + help + Specify the type of triggering to be used by the driver. config EC11_TRIGGER_NONE - bool "No trigger" + bool "No trigger" config EC11_TRIGGER_GLOBAL_THREAD - bool "Use global thread" - depends on GPIO - select EC11_TRIGGER + bool "Use global thread" + depends on GPIO + select EC11_TRIGGER config EC11_TRIGGER_OWN_THREAD - bool "Use own thread" - depends on GPIO - select EC11_TRIGGER + bool "Use own thread" + depends on GPIO + select EC11_TRIGGER endchoice config EC11_TRIGGER - bool + bool config EC11_THREAD_PRIORITY - int "Thread priority" - depends on EC11_TRIGGER_OWN_THREAD - default 10 - help - Priority of thread used by the driver to handle interrupts. + int "Thread priority" + depends on EC11_TRIGGER_OWN_THREAD + default 10 + help + Priority of thread used by the driver to handle interrupts. config EC11_THREAD_STACK_SIZE - int "Thread stack size" - depends on EC11_TRIGGER_OWN_THREAD - default 1024 - help - Stack size of thread used by the driver to handle interrupts. + int "Thread stack size" + depends on EC11_TRIGGER_OWN_THREAD + default 1024 + help + Stack size of thread used by the driver to handle interrupts. endif # EC11 \ No newline at end of file diff --git a/app/dts/behaviors/backlight.dtsi b/app/dts/behaviors/backlight.dtsi index f9bd02b8..bebd6dfb 100644 --- a/app/dts/behaviors/backlight.dtsi +++ b/app/dts/behaviors/backlight.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ bl: behavior_backlight { - compatible = "zmk,behavior-backlight"; - label = "BCKLGHT"; - #binding-cells = <2>; - }; - }; + behaviors { + /omit-if-no-ref/ bl: behavior_backlight { + compatible = "zmk,behavior-backlight"; + label = "BCKLGHT"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/bluetooth.dtsi b/app/dts/behaviors/bluetooth.dtsi index 1e9cf21b..a49ff4d6 100644 --- a/app/dts/behaviors/bluetooth.dtsi +++ b/app/dts/behaviors/bluetooth.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ bt: behavior_bluetooth { - compatible = "zmk,behavior-bluetooth"; - label = "BLUETOOTH"; - #binding-cells = <2>; - }; - }; + behaviors { + /omit-if-no-ref/ bt: behavior_bluetooth { + compatible = "zmk,behavior-bluetooth"; + label = "BLUETOOTH"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/caps_word.dtsi b/app/dts/behaviors/caps_word.dtsi index ac04e26b..219300dc 100644 --- a/app/dts/behaviors/caps_word.dtsi +++ b/app/dts/behaviors/caps_word.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ caps_word: behavior_caps_word { - compatible = "zmk,behavior-caps-word"; - label = "CAPS_WORD"; - #binding-cells = <0>; - continue-list = ; - }; - }; + behaviors { + /omit-if-no-ref/ caps_word: behavior_caps_word { + compatible = "zmk,behavior-caps-word"; + label = "CAPS_WORD"; + #binding-cells = <0>; + continue-list = ; + }; + }; }; diff --git a/app/dts/behaviors/ext_power.dtsi b/app/dts/behaviors/ext_power.dtsi index 18e824e2..f61170dd 100644 --- a/app/dts/behaviors/ext_power.dtsi +++ b/app/dts/behaviors/ext_power.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - ext_power: behavior_ext_power { - compatible = "zmk,behavior-ext-power"; - label = "EXTPOWER"; - #binding-cells = <1>; - }; - }; + behaviors { + ext_power: behavior_ext_power { + compatible = "zmk,behavior-ext-power"; + label = "EXTPOWER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/gresc.dtsi b/app/dts/behaviors/gresc.dtsi index 29593880..fa4c685b 100644 --- a/app/dts/behaviors/gresc.dtsi +++ b/app/dts/behaviors/gresc.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - label = "GRAVE_ESCAPE"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; + behaviors { + /omit-if-no-ref/ gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - }; - }; + }; + }; }; diff --git a/app/dts/behaviors/key_press.dtsi b/app/dts/behaviors/key_press.dtsi index 59a4e12a..b0fc2db1 100644 --- a/app/dts/behaviors/key_press.dtsi +++ b/app/dts/behaviors/key_press.dtsi @@ -5,12 +5,12 @@ */ / { - behaviors { - /* DEPRECATED: `cp` will be removed in the future */ - /omit-if-no-ref/ cp: kp: behavior_key_press { - compatible = "zmk,behavior-key-press"; - label = "KEY_PRESS"; - #binding-cells = <1>; - }; - }; + behaviors { + /* DEPRECATED: `cp` will be removed in the future */ + /omit-if-no-ref/ cp: kp: behavior_key_press { + compatible = "zmk,behavior-key-press"; + label = "KEY_PRESS"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/key_repeat.dtsi b/app/dts/behaviors/key_repeat.dtsi index aa8ffa04..795a77f6 100644 --- a/app/dts/behaviors/key_repeat.dtsi +++ b/app/dts/behaviors/key_repeat.dtsi @@ -7,13 +7,13 @@ #include / { - behaviors { - /omit-if-no-ref/ key_repeat: behavior_key_repeat { - compatible = "zmk,behavior-key-repeat"; - label = "KEY_REPEAT"; - #binding-cells = <0>; - usage-pages = ; - }; - }; + behaviors { + /omit-if-no-ref/ key_repeat: behavior_key_repeat { + compatible = "zmk,behavior-key-repeat"; + label = "KEY_REPEAT"; + #binding-cells = <0>; + usage-pages = ; + }; + }; }; diff --git a/app/dts/behaviors/key_toggle.dtsi b/app/dts/behaviors/key_toggle.dtsi index 98001b79..df581014 100644 --- a/app/dts/behaviors/key_toggle.dtsi +++ b/app/dts/behaviors/key_toggle.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ kt: behavior_key_toggle { - compatible = "zmk,behavior-key-toggle"; - label = "KEY_TOGGLE"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ kt: behavior_key_toggle { + compatible = "zmk,behavior-key-toggle"; + label = "KEY_TOGGLE"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/layer_tap.dtsi b/app/dts/behaviors/layer_tap.dtsi index 21fd9d56..1d92245c 100644 --- a/app/dts/behaviors/layer_tap.dtsi +++ b/app/dts/behaviors/layer_tap.dtsi @@ -5,14 +5,14 @@ */ / { - behaviors { - /omit-if-no-ref/ lt: behavior_layer_tap { - compatible = "zmk,behavior-hold-tap"; - label = "LAYER_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - bindings = <&mo>, <&kp>; - }; - }; + behaviors { + /omit-if-no-ref/ lt: behavior_layer_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LAYER_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + bindings = <&mo>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/macros.dtsi b/app/dts/behaviors/macros.dtsi index 76153291..757c046e 100644 --- a/app/dts/behaviors/macros.dtsi +++ b/app/dts/behaviors/macros.dtsi @@ -6,49 +6,49 @@ #define ZMK_MACRO_STRINGIFY(x) #x #define ZMK_MACRO(name,...) \ - name: name { \ - label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ - compatible = "zmk,behavior-macro"; \ - #binding-cells = <0>; \ - __VA_ARGS__ \ - }; + name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro"; \ + #binding-cells = <0>; \ + __VA_ARGS__ \ + }; / { - behaviors { - macro_tap: macro_control_mode_tap { - compatible = "zmk,macro-control-mode-tap"; - label = "MAC_TAP"; - #binding-cells = <0>; - }; + behaviors { + macro_tap: macro_control_mode_tap { + compatible = "zmk,macro-control-mode-tap"; + label = "MAC_TAP"; + #binding-cells = <0>; + }; - macro_press: macro_control_mode_press { - compatible = "zmk,macro-control-mode-press"; - label = "MAC_PRESS"; - #binding-cells = <0>; - }; + macro_press: macro_control_mode_press { + compatible = "zmk,macro-control-mode-press"; + label = "MAC_PRESS"; + #binding-cells = <0>; + }; - macro_release: macro_control_mode_release { - compatible = "zmk,macro-control-mode-release"; - label = "MAC_REL"; - #binding-cells = <0>; - }; + macro_release: macro_control_mode_release { + compatible = "zmk,macro-control-mode-release"; + label = "MAC_REL"; + #binding-cells = <0>; + }; - macro_tap_time: macro_control_tap_time { - compatible = "zmk,macro-control-tap-time"; - label = "MAC_TAP_TIME"; - #binding-cells = <1>; - }; + macro_tap_time: macro_control_tap_time { + compatible = "zmk,macro-control-tap-time"; + label = "MAC_TAP_TIME"; + #binding-cells = <1>; + }; - macro_wait_time: macro_control_wait_time { - compatible = "zmk,macro-control-wait-time"; - label = "MAC_WAIT_TIME"; - #binding-cells = <1>; - }; + macro_wait_time: macro_control_wait_time { + compatible = "zmk,macro-control-wait-time"; + label = "MAC_WAIT_TIME"; + #binding-cells = <1>; + }; - macro_pause_for_release: macro_pause_for_release { - compatible = "zmk,macro-pause-for-release"; - label = "MAC_WAIT_REL"; - #binding-cells = <0>; - }; - }; + macro_pause_for_release: macro_pause_for_release { + compatible = "zmk,macro-pause-for-release"; + label = "MAC_WAIT_REL"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/mod_tap.dtsi b/app/dts/behaviors/mod_tap.dtsi index 7a98713c..d441a4f1 100644 --- a/app/dts/behaviors/mod_tap.dtsi +++ b/app/dts/behaviors/mod_tap.dtsi @@ -5,14 +5,14 @@ */ / { - behaviors { - /omit-if-no-ref/ mt: behavior_mod_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + /omit-if-no-ref/ mt: behavior_mod_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/momentary_layer.dtsi b/app/dts/behaviors/momentary_layer.dtsi index 2dbd88d9..d1c91232 100644 --- a/app/dts/behaviors/momentary_layer.dtsi +++ b/app/dts/behaviors/momentary_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ mo: behavior_momentary_layer { - compatible = "zmk,behavior-momentary-layer"; - label = "MO"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ mo: behavior_momentary_layer { + compatible = "zmk,behavior-momentary-layer"; + label = "MO"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/none.dtsi b/app/dts/behaviors/none.dtsi index 790f2d61..fc4890c3 100644 --- a/app/dts/behaviors/none.dtsi +++ b/app/dts/behaviors/none.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ none: behavior_none { - compatible = "zmk,behavior-none"; - label = "NONE"; - #binding-cells = <0>; - }; - }; + behaviors { + /omit-if-no-ref/ none: behavior_none { + compatible = "zmk,behavior-none"; + label = "NONE"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/reset.dtsi b/app/dts/behaviors/reset.dtsi index 74a7163b..2e775269 100644 --- a/app/dts/behaviors/reset.dtsi +++ b/app/dts/behaviors/reset.dtsi @@ -7,18 +7,18 @@ #include / { - behaviors { - sys_reset: behavior_reset { - compatible = "zmk,behavior-reset"; - label = "SYSRESET"; - #binding-cells = <0>; - }; + behaviors { + sys_reset: behavior_reset { + compatible = "zmk,behavior-reset"; + label = "SYSRESET"; + #binding-cells = <0>; + }; - bootloader: behavior_reset_dfu { - compatible = "zmk,behavior-reset"; - label = "BOOTLOAD"; - type = ; - #binding-cells = <0>; - }; - }; + bootloader: behavior_reset_dfu { + compatible = "zmk,behavior-reset"; + label = "BOOTLOAD"; + type = ; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/behaviors/rgb_underglow.dtsi b/app/dts/behaviors/rgb_underglow.dtsi index 54fe422e..6ffec2e6 100644 --- a/app/dts/behaviors/rgb_underglow.dtsi +++ b/app/dts/behaviors/rgb_underglow.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - rgb_ug: behavior_rgb_underglow { - compatible = "zmk,behavior-rgb-underglow"; - label = "RGB_UG"; - #binding-cells = <2>; - }; - }; + behaviors { + rgb_ug: behavior_rgb_underglow { + compatible = "zmk,behavior-rgb-underglow"; + label = "RGB_UG"; + #binding-cells = <2>; + }; + }; }; diff --git a/app/dts/behaviors/sensor_rotate_key_press.dtsi b/app/dts/behaviors/sensor_rotate_key_press.dtsi index ed1b4cd0..dc30b798 100644 --- a/app/dts/behaviors/sensor_rotate_key_press.dtsi +++ b/app/dts/behaviors/sensor_rotate_key_press.dtsi @@ -5,13 +5,13 @@ */ / { - behaviors { - /* DEPRECATED: `inc_dec_cp` will be removed in the future */ - /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { - compatible = "zmk,behavior-sensor-rotate-var"; - label = "ENC_KEY_PRESS"; - #sensor-binding-cells = <2>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + /* DEPRECATED: `inc_dec_cp` will be removed in the future */ + /omit-if-no-ref/ inc_dec_cp: inc_dec_kp: behavior_sensor_rotate_key_press { + compatible = "zmk,behavior-sensor-rotate-var"; + label = "ENC_KEY_PRESS"; + #sensor-binding-cells = <2>; + bindings = <&kp>, <&kp>; + }; + }; }; diff --git a/app/dts/behaviors/sticky_key.dtsi b/app/dts/behaviors/sticky_key.dtsi index 886d35b7..72a80a90 100644 --- a/app/dts/behaviors/sticky_key.dtsi +++ b/app/dts/behaviors/sticky_key.dtsi @@ -5,24 +5,24 @@ */ / { - behaviors { - /omit-if-no-ref/ sk: behavior_sticky_key { - compatible = "zmk,behavior-sticky-key"; - label = "STICKY_KEY"; - #binding-cells = <1>; - release-after-ms = <1000>; - bindings = <&kp>; - ignore-modifiers; - }; - /omit-if-no-ref/ sl: behavior_sticky_layer { - compatible = "zmk,behavior-sticky-key"; - label = "STICKY_LAYER"; - #binding-cells = <1>; - release-after-ms = <1000>; - bindings = <&mo>; - quick-release; - }; - }; + behaviors { + /omit-if-no-ref/ sk: behavior_sticky_key { + compatible = "zmk,behavior-sticky-key"; + label = "STICKY_KEY"; + #binding-cells = <1>; + release-after-ms = <1000>; + bindings = <&kp>; + ignore-modifiers; + }; + /omit-if-no-ref/ sl: behavior_sticky_layer { + compatible = "zmk,behavior-sticky-key"; + label = "STICKY_LAYER"; + #binding-cells = <1>; + release-after-ms = <1000>; + bindings = <&mo>; + quick-release; + }; + }; }; diff --git a/app/dts/behaviors/to_layer.dtsi b/app/dts/behaviors/to_layer.dtsi index fa8f98bd..0ea66fa9 100644 --- a/app/dts/behaviors/to_layer.dtsi +++ b/app/dts/behaviors/to_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ to: behavior_to_layer { - compatible = "zmk,behavior-to-layer"; - label = "TO_LAYER"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ to: behavior_to_layer { + compatible = "zmk,behavior-to-layer"; + label = "TO_LAYER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/toggle_layer.dtsi b/app/dts/behaviors/toggle_layer.dtsi index ea0b1c19..75730934 100644 --- a/app/dts/behaviors/toggle_layer.dtsi +++ b/app/dts/behaviors/toggle_layer.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ tog: behavior_toggle_layer { - compatible = "zmk,behavior-toggle-layer"; - label = "TOGGLE_LAYER"; - #binding-cells = <1>; - }; - }; + behaviors { + /omit-if-no-ref/ tog: behavior_toggle_layer { + compatible = "zmk,behavior-toggle-layer"; + label = "TOGGLE_LAYER"; + #binding-cells = <1>; + }; + }; }; diff --git a/app/dts/behaviors/transparent.dtsi b/app/dts/behaviors/transparent.dtsi index 81ebb133..0dfaade2 100644 --- a/app/dts/behaviors/transparent.dtsi +++ b/app/dts/behaviors/transparent.dtsi @@ -5,11 +5,11 @@ */ / { - behaviors { - /omit-if-no-ref/ trans: behavior_transparent { - compatible = "zmk,behavior-transparent"; - label = "TRANS"; - #binding-cells = <0>; - }; - }; + behaviors { + /omit-if-no-ref/ trans: behavior_transparent { + compatible = "zmk,behavior-transparent"; + label = "TRANS"; + #binding-cells = <0>; + }; + }; }; diff --git a/app/dts/common/arduino_uno_pro_micro_map.dtsi b/app/dts/common/arduino_uno_pro_micro_map.dtsi index 3f3d64f0..a6b8d792 100644 --- a/app/dts/common/arduino_uno_pro_micro_map.dtsi +++ b/app/dts/common/arduino_uno_pro_micro_map.dtsi @@ -7,41 +7,41 @@ /* This provies a mapping from Arduino Uno to Arduino Pro Micro pins for development */ / { - pro_micro_d: connector_d { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &arduino_header 6 0> /* D0 */ - , <1 0 &arduino_header 7 0> /* D1 */ - , <2 0 &arduino_header 8 0> /* D2 */ - , <3 0 &arduino_header 9 0> /* D3 */ - , <4 0 &arduino_header 10 0> /* D4/A6 */ - , <5 0 &arduino_header 11 0> /* D5 */ - , <6 0 &arduino_header 12 0> /* D6/A7 */ - , <7 0 &arduino_header 13 0> /* D7 */ - , <8 0 &arduino_header 14 0> /* D8/A8 */ - , <9 0 &arduino_header 15 0> /* D9/A9 */ - , <10 0 &arduino_header 16 0> /* D10/A10 */ - , <16 0 &arduino_header 17 0> /* D16 */ - , <14 0 &arduino_header 18 0> /* D14 */ - , <15 0 &arduino_header 19 0> /* D15 */ - ; - }; + pro_micro_d: connector_d { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &arduino_header 6 0> /* D0 */ + , <1 0 &arduino_header 7 0> /* D1 */ + , <2 0 &arduino_header 8 0> /* D2 */ + , <3 0 &arduino_header 9 0> /* D3 */ + , <4 0 &arduino_header 10 0> /* D4/A6 */ + , <5 0 &arduino_header 11 0> /* D5 */ + , <6 0 &arduino_header 12 0> /* D6/A7 */ + , <7 0 &arduino_header 13 0> /* D7 */ + , <8 0 &arduino_header 14 0> /* D8/A8 */ + , <9 0 &arduino_header 15 0> /* D9/A9 */ + , <10 0 &arduino_header 16 0> /* D10/A10 */ + , <16 0 &arduino_header 17 0> /* D16 */ + , <14 0 &arduino_header 18 0> /* D14 */ + , <15 0 &arduino_header 19 0> /* D15 */ + ; + }; - pro_micro_a: connector_a { - compatible = "arduino-pro-micro"; - #gpio-cells = <2>; - gpio-map-mask = <0xffffffff 0xffffffc0>; - gpio-map-pass-thru = <0 0x3f>; - gpio-map - = <0 0 &arduino_header 0 0> /* A0 */ - , <1 0 &arduino_header 1 0> /* A1 */ - , <2 0 &arduino_header 2 0> /* A2 */ - , <3 0 &arduino_header 3 0> /* A3 */ - ; - }; + pro_micro_a: connector_a { + compatible = "arduino-pro-micro"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map + = <0 0 &arduino_header 0 0> /* A0 */ + , <1 0 &arduino_header 1 0> /* A1 */ + , <2 0 &arduino_header 2 0> /* A2 */ + , <3 0 &arduino_header 3 0> /* A3 */ + ; + }; }; pro_micro_i2c: &arduino_i2c {}; diff --git a/app/include/linker/zmk-events.ld b/app/include/linker/zmk-events.ld index 3e307f85..0c4bb6e4 100644 --- a/app/include/linker/zmk-events.ld +++ b/app/include/linker/zmk-events.ld @@ -6,11 +6,11 @@ #include - __event_type_start = .; \ - KEEP(*(".event_type")); \ - __event_type_end = .; \ + __event_type_start = .; \ + KEEP(*(".event_type")); \ + __event_type_end = .; \ - __event_subscriptions_start = .; \ - KEEP(*(".event_subscription")); \ - __event_subscriptions_end = .; \ + __event_subscriptions_start = .; \ + KEEP(*(".event_subscription")); \ + __event_subscriptions_end = .; \ diff --git a/app/run-test.sh b/app/run-test.sh index 94438f34..6935f2c8 100755 --- a/app/run-test.sh +++ b/app/run-test.sh @@ -4,23 +4,23 @@ # SPDX-License-Identifier: MIT if [ -z "$1" ]; then - echo "Usage: ./run-test.sh " - exit 1 + echo "Usage: ./run-test.sh " + exit 1 fi path="$1" if [ $path = "all" ]; then - path="tests" + path="tests" fi testcases=$(find $path -name native_posix_64.keymap -exec dirname \{\} \;) num_cases=$(echo "$testcases" | wc -l) if [ $num_cases -gt 1 ] || [ "$testcases" != "$path" ]; then - echo "" > ./build/tests/pass-fail.log - echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh - err=$? - sort -k2 ./build/tests/pass-fail.log - exit $err + echo "" > ./build/tests/pass-fail.log + echo "$testcases" | xargs -L 1 -P ${J:-4} ./run-test.sh + err=$? + sort -k2 ./build/tests/pass-fail.log + exit $err fi testcase="$path" @@ -28,19 +28,19 @@ echo "Running $testcase:" west build -d build/$testcase -b native_posix_64 -- -DZMK_CONFIG="$(pwd)/$testcase" > /dev/null 2>&1 if [ $? -gt 0 ]; then - echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log - exit 1 + echo "FAILED: $testcase did not build" | tee -a ./build/tests/pass-fail.log + exit 1 fi ./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log diff -auZ $testcase/keycode_events.snapshot build/$testcase/keycode_events.log if [ $? -gt 0 ]; then - if [ -f $testcase/pending ]; then - echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log - exit 0 - fi - echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log - exit 1 + if [ -f $testcase/pending ]; then + echo "PENDING: $testcase" | tee -a ./build/tests/pass-fail.log + exit 0 + fi + echo "FAILED: $testcase" | tee -a ./build/tests/pass-fail.log + exit 1 fi echo "PASS: $testcase" | tee -a ./build/tests/pass-fail.log diff --git a/app/src/split/Kconfig b/app/src/split/Kconfig index 42cb411c..dbe5f092 100644 --- a/app/src/split/Kconfig +++ b/app/src/split/Kconfig @@ -2,21 +2,21 @@ # SPDX-License-Identifier: MIT menuconfig ZMK_SPLIT - bool "Split keyboard support" + bool "Split keyboard support" if ZMK_SPLIT config ZMK_SPLIT_ROLE_CENTRAL - bool "Split central device" + bool "Split central device" choice ZMK_SPLIT_TRANSPORT - prompt "Split transport" + prompt "Split transport" config ZMK_SPLIT_BLE - bool "BLE" - depends on ZMK_BLE - select BT_USER_PHY_UPDATE - select BT_AUTO_PHY_UPDATE + bool "BLE" + depends on ZMK_BLE + select BT_USER_PHY_UPDATE + select BT_AUTO_PHY_UPDATE endchoice diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index f6976cff..53119d82 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -7,55 +7,55 @@ menu "BLE Transport" # Added for backwards compatibility. New shields/board should set `ZMK_SPLIT_ROLE_CENTRAL` only. config ZMK_SPLIT_BLE_ROLE_CENTRAL - bool - select ZMK_SPLIT_ROLE_CENTRAL + bool + select ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_ROLE_CENTRAL - select BT_CENTRAL - select BT_GATT_CLIENT - select BT_GATT_AUTO_DISCOVER_CCC + select BT_CENTRAL + select BT_GATT_CLIENT + select BT_GATT_AUTO_DISCOVER_CCC if ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE - int "Max number of key position state events to queue when received from peripherals" - default 5 + int "Max number of key position state events to queue when received from peripherals" + default 5 config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE - int "BLE split central write thread stack size" - default 512 + int "BLE split central write thread stack size" + default 512 config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE - int "Max number of behavior run events to queue to send to the peripheral(s)" - default 5 + int "Max number of behavior run events to queue to send to the peripheral(s)" + default 5 endif # ZMK_SPLIT_ROLE_CENTRAL if !ZMK_SPLIT_ROLE_CENTRAL config ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE - int "BLE split peripheral notify thread stack size" - default 650 + int "BLE split peripheral notify thread stack size" + default 650 config ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY - int "BLE split peripheral notify thread priority" - default 5 + int "BLE split peripheral notify thread priority" + default 5 config ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE - int "Max number of key position state events to queue to send to the central" - default 10 + int "Max number of key position state events to queue to send to the central" + default 10 config ZMK_USB - default n + default n config BT_MAX_PAIRED - default 1 + default 1 config BT_MAX_CONN - default 1 + default 1 config BT_PERIPHERAL_PREF_MAX_INT - default 6 + default 6 #!ZMK_SPLIT_ROLE_CENTRAL endif @@ -71,10 +71,10 @@ if ZMK_BLE if ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL config BT_MAX_CONN - default 6 + default 6 config BT_MAX_PAIRED - default 6 + default 6 #ZMK_SPLIT_BLE && ZMK_SPLIT_ROLE_CENTRAL endif @@ -82,10 +82,10 @@ endif if !ZMK_SPLIT_BLE config BT_MAX_CONN - default 5 + default 5 config BT_MAX_PAIRED - default 5 + default 5 #!ZMK_SPLIT_BLE endif diff --git a/app/tests/backlight/basic/native_posix_64.keymap b/app/tests/backlight/basic/native_posix_64.keymap index 185dbf7c..dfb08fef 100644 --- a/app/tests/backlight/basic/native_posix_64.keymap +++ b/app/tests/backlight/basic/native_posix_64.keymap @@ -1,30 +1,30 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/backlight/behavior_keymap.dtsi b/app/tests/backlight/behavior_keymap.dtsi index 26869272..771072ac 100644 --- a/app/tests/backlight/behavior_keymap.dtsi +++ b/app/tests/backlight/behavior_keymap.dtsi @@ -4,31 +4,31 @@ #include / { - chosen { - zmk,backlight = &backlight; - }; + chosen { + zmk,backlight = &backlight; + }; - backlight: leds { - compatible = "gpio-leds"; - led_0 { - gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - led_1 { - gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 1"; - }; - }; + backlight: leds { + compatible = "gpio-leds"; + led_0 { + gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + led_1 { + gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &bl BL_INC &bl BL_DEC - &bl BL_ON &bl BL_OFF - >; - }; - }; + default_layer { + bindings = < + &bl BL_INC &bl BL_DEC + &bl BL_ON &bl BL_OFF + >; + }; + }; }; diff --git a/app/tests/backlight/config-brt/native_posix_64.keymap b/app/tests/backlight/config-brt/native_posix_64.keymap index 6617c9f6..cbb6c93f 100644 --- a/app/tests/backlight/config-brt/native_posix_64.keymap +++ b/app/tests/backlight/config-brt/native_posix_64.keymap @@ -1,12 +1,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/backlight/config-on/native_posix_64.keymap b/app/tests/backlight/config-on/native_posix_64.keymap index a95ccd93..1a8de928 100644 --- a/app/tests/backlight/config-on/native_posix_64.keymap +++ b/app/tests/backlight/config-on/native_posix_64.keymap @@ -1,12 +1,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; diff --git a/app/tests/backlight/config-step/native_posix_64.keymap b/app/tests/backlight/config-step/native_posix_64.keymap index 96fbe96a..70614459 100644 --- a/app/tests/backlight/config-step/native_posix_64.keymap +++ b/app/tests/backlight/config-step/native_posix_64.keymap @@ -1,36 +1,36 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/backlight/cycle/native_posix_64.keymap b/app/tests/backlight/cycle/native_posix_64.keymap index a2f3c830..00615e35 100644 --- a/app/tests/backlight/cycle/native_posix_64.keymap +++ b/app/tests/backlight/cycle/native_posix_64.keymap @@ -4,75 +4,75 @@ #include / { - chosen { - zmk,backlight = &backlight; - }; + chosen { + zmk,backlight = &backlight; + }; - backlight: leds { - compatible = "gpio-leds"; - led_0 { - gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; - }; - led_1 { - gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 1"; - }; - }; + backlight: leds { + compatible = "gpio-leds"; + led_0 { + gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 0"; + }; + led_1 { + gpios = <&gpio0 1 GPIO_ACTIVE_HIGH>; + label = "Backlight LED 1"; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &bl BL_CYCLE &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &bl BL_CYCLE &none + &none &none + >; + }; + }; }; &kscan { - events = < - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_CYCLE */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_CYCLE */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/backlight/low-brightness/native_posix_64.keymap b/app/tests/backlight/low-brightness/native_posix_64.keymap index 3b01f700..a151e0f6 100644 --- a/app/tests/backlight/low-brightness/native_posix_64.keymap +++ b/app/tests/backlight/low-brightness/native_posix_64.keymap @@ -1,39 +1,39 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_ON */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* BL_OFF */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_DEC */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* BL_INC */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_ON */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* BL_OFF */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_DEC */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* BL_INC */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/caps-word/behavior_keymap.dtsi b/app/tests/caps-word/behavior_keymap.dtsi index 04653bec..855406fc 100644 --- a/app/tests/caps-word/behavior_keymap.dtsi +++ b/app/tests/caps-word/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &caps_word &kp A - &kp N6 &kp MINUS - >; - }; - }; + default_layer { + bindings = < + &caps_word &kp A + &kp N6 &kp MINUS + >; + }; + }; }; diff --git a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap index 3053d5df..bbbdac10 100644 --- a/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-modifiers/native_posix_64.keymap @@ -4,30 +4,30 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &caps_word &kp A - &kp LSHFT &kp MINUS - >; - }; - }; + default_layer { + bindings = < + &caps_word &kp A + &kp LSHFT &kp MINUS + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap index 68c3249f..08b173bd 100644 --- a/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-non-alpha-continue-list-item/native_posix_64.keymap @@ -4,18 +4,18 @@ #include "../behavior_keymap.dtsi" &caps_word { - continue-list = ; + continue-list = ; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap index 40a4d4a9..cde97c84 100644 --- a/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap +++ b/app/tests/caps-word/continue-with-non-modified-numeric-usage-id/native_posix_64.keymap @@ -4,18 +4,18 @@ #include "../behavior_keymap.dtsi" &caps_word { - continue-list = ; + continue-list = ; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap index 4219e354..3fbb020b 100644 --- a/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap +++ b/app/tests/caps-word/deactivate-by-non-alpha-non-continuation/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap index 05f13fed..121a827c 100644 --- a/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap index e0695564..b8ae4ee0 100644 --- a/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap +++ b/app/tests/caps-word/deactivate-by-second-press/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10000) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,30) - ZMK_MOCK_RELEASE(0,1,30) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,30) - ZMK_MOCK_PRESS(0,1,30) - ZMK_MOCK_RELEASE(0,1,1000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10000) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,30) + ZMK_MOCK_PRESS(0,1,30) + ZMK_MOCK_RELEASE(0,1,1000) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index a02f6c64..e6754b71 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -3,7 +3,7 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* @@ -12,36 +12,36 @@ and combos is wrong. Hold-taps need to process key position events first so the decision to hold or tap can be made. */ / { - combos { - compatible = "zmk,combos"; + combos { + compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <1 2>; - bindings = <&kp Y>; - }; - }; + combo_two { + timeout-ms = <100>; + key-positions = <1 2>; + bindings = <&kp Y>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index 325da627..95382432 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -3,40 +3,40 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* this test checks if hold-taps can be part of a combo */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap index 7a789808..d6d187e2 100644 --- a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap @@ -3,43 +3,43 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; /* This test verifies that hold-tap keys can observe * events which were released from combos. */ / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <100>; - key-positions = <0 2>; - bindings = <&kp Y>; - }; - combo_two { - timeout-ms = <100>; - key-positions = <1 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <100>; + key-positions = <0 2>; + bindings = <&kp Y>; + }; + combo_two { + timeout-ms = <100>; + key-positions = <1 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &mt LEFT_CONTROL A &mt RIGHT_CONTROL B - &none &none - >; - }; - }; + default_layer { + bindings = < + &mt LEFT_CONTROL A &mt RIGHT_CONTROL B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,0) - ZMK_MOCK_PRESS(0,1,300) - >; + events = < + ZMK_MOCK_PRESS(0,0,0) + ZMK_MOCK_PRESS(0,1,300) + >; }; \ No newline at end of file diff --git a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap index d4053793..f1c7eee7 100644 --- a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap @@ -3,38 +3,38 @@ #include &mt { - flavor = "hold-preferred"; + flavor = "hold-preferred"; }; / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <40>; - key-positions = <0 1>; - bindings = <&kp X>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <40>; + key-positions = <0 1>; + bindings = <&kp X>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &mt RSHFT RET &kp C - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &mt RSHFT RET &kp C + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,1,50) - ZMK_MOCK_RELEASE(1,1,50) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,1,50) + ZMK_MOCK_RELEASE(1,1,50) + >; }; diff --git a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap index ba6cecc6..134b77df 100644 --- a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap @@ -5,14 +5,14 @@ #define ZMK_COMBO(name, combo_bindings, keypos, combo_term) \ / { \ - combos { \ - compatible = "zmk,combos"; \ - combo_ ## name { \ - key-positions = ; \ - bindings = ; \ - timeout-ms = ; \ - }; \ - }; \ + combos { \ + compatible = "zmk,combos"; \ + combo_ ## name { \ + key-positions = ; \ + bindings = ; \ + timeout-ms = ; \ + }; \ + }; \ }; ZMK_COMBO(qmark, &kp QMARK, 0 3, 30) @@ -20,27 +20,27 @@ ZMK_COMBO(dllr, &kp DLLR, 1 3, 50) ZMK_COMBO(tilde, &kp TILDE, 3 4, 50) / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &none &none - &kp A &mt LSHFT T - &none - >; - }; - }; + default_layer { + bindings = < + &none &none + &kp A &mt LSHFT T + &none + >; + }; + }; }; &kscan { - rows = <3>; - columns = <2>; - events = < - ZMK_MOCK_PRESS(1,1,500) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,500) - ZMK_MOCK_RELEASE(1,1,0) - >; + rows = <3>; + columns = <2>; + events = < + ZMK_MOCK_PRESS(1,1,500) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,500) + ZMK_MOCK_RELEASE(1,1,0) + >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap index 33712822..8d94872b 100644 --- a/app/tests/combo/layer-filter-0/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -6,73 +6,73 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp X>; - layers = <0>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp X>; + layers = <0>; + }; - combo_two { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp Y>; - layers = <1>; - }; + combo_two { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp Y>; + layers = <1>; + }; - combo_three { - timeout-ms = ; - key-positions = <0 2>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = ; + key-positions = <0 2>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &tog 1 - >; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &tog 1 + >; + }; - filtered_layer { - bindings = < - &kp A &kp B - &kp C &tog 0 - >; - }; - }; + filtered_layer { + bindings = < + &kp A &kp B + &kp C &tog 0 + >; + }; + }; }; &kscan { - events = < - /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - /* Toggle Layer */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* Combo Two */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - /* Combo Three */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + /* Combo One */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Combo Three */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + /* Toggle Layer */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* Combo Two */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Combo Three */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap index 8eb5e9eb..96eccea4 100644 --- a/app/tests/combo/layer-filter-1/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -6,35 +6,35 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1>; - bindings = <&kp X>; - layers = <1>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1>; + bindings = <&kp X>; + layers = <1>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &tog 1 - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &tog 1 + >; + }; + }; }; &kscan { - events = < - /* Combo One */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* Combo One */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap index 87d21be1..d2176390 100644 --- a/app/tests/combo/multiple-timeouts/native_posix_64.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -3,38 +3,38 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - combo_two { - timeout-ms = <120>; - key-positions = <0 1 2>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + combo_two { + timeout-ms = <120>; + key-positions = <0 1 2>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap index 8b7b4196..e8284665 100644 --- a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -3,7 +3,7 @@ #include /* - combo 0 timeout inf + combo 0 timeout inf combo 01 timeout inf combo 0123 timeout inf press 012 in any combination, release any of those keys @@ -14,104 +14,104 @@ #define TIMEOUT (60*60*1000) / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = ; - key-positions = <0 1 2>; - bindings = <&kp X>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = ; + key-positions = <0 1 2>; + bindings = <&kp X>; + }; - combo_two { - timeout-ms = ; - key-positions = <0 2>; - bindings = <&kp Y>; - }; + combo_two { + timeout-ms = ; + key-positions = <0 2>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = ; - key-positions = <1>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = ; + key-positions = <1>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* all permutations of combo one press, combo triggered by release */ - /* while debugging these, you may want to set the release_timer to a high number */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) + events = < + /* all permutations of combo one press, combo triggered by release */ + /* while debugging these, you may want to set the release_timer to a high number */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - /* all permutations of combo two press and release, combo triggered by release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + /* all permutations of combo two press and release, combo triggered by release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap index 45737882..a695a388 100644 --- a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -9,57 +9,57 @@ expected outcome: AB after 100ms */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = <100>; - key-positions = <0 1 2>; - bindings = <&kp X>; - }; - }; + combo_three { + timeout-ms = <100>; + key-positions = <0 1 2>; + bindings = <&kp X>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - /* all permutations of combo two press and release, combo triggered by timeout */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + /* all permutations of combo two press and release, combo triggered by timeout */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap index ba547dc2..6bf0e710 100644 --- a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -9,44 +9,44 @@ expected: combo 01 after 100ms, immediately followed by key 2. */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <0 1>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <0 1>; + bindings = <&kp Y>; + }; - combo_four { - timeout-ms = <100>; - key-positions = <0 1 2 3>; - bindings = <&kp W>; - }; + combo_four { + timeout-ms = <100>; + key-positions = <0 1 2 3>; + bindings = <&kp W>; + }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,100) - >; + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 0da394b5..0a2f5ee1 100644 --- a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -9,45 +9,45 @@ expected: key pos 0 followed by combo 12 */ / { - combos { - compatible = "zmk,combos"; - combo_two { - timeout-ms = <100>; - key-positions = <1 2>; - bindings = <&kp Y>; - }; + combos { + compatible = "zmk,combos"; + combo_two { + timeout-ms = <100>; + key-positions = <1 2>; + bindings = <&kp Y>; + }; - combo_four { - timeout-ms = <100>; - key-positions = <0 1 2 3>; - bindings = <&kp W>; - }; + combo_four { + timeout-ms = <100>; + key-positions = <0 1 2 3>; + bindings = <&kp W>; + }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* if you're debugging these, remember that the timer can be triggered between - events while stepping through code. */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,2,100) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,2,100) - >; + events = < + /* if you're debugging these, remember that the timer can be triggered between + events while stepping through code. */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,2,100) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,2,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index f9537344..900c4af3 100644 --- a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -3,82 +3,82 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp X>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp X>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <0 2>; - bindings = <&kp Y>; - }; + combo_two { + timeout-ms = <30>; + key-positions = <0 2>; + bindings = <&kp Y>; + }; - combo_three { - timeout-ms = <30>; - key-positions = <3>; - bindings = <&kp Z>; - }; - }; + combo_three { + timeout-ms = <30>; + key-positions = <3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &none + >; + }; + }; }; &kscan { - events = < - /* all permutations of combo one press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* all permutations of combo one press and release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - /* all permutations of combo two press and release */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + /* all permutations of combo two press and release */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,2,10) - ZMK_MOCK_RELEASE(0,2,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,2,10) + ZMK_MOCK_RELEASE(0,2,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap index 2a71ad32..dac0bd5c 100644 --- a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index c6202365..19bad1d0 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -3,33 +3,33 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2 3>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2 3>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap index b8117187..2eb6271e 100644 --- a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap @@ -3,35 +3,35 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <80>; - key-positions = <0 1 2>; - bindings = <&kp Z>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <80>; + key-positions = <0 1 2>; + bindings = <&kp Z>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp C &kp D - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(0,0,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(0,0,100) + >; }; diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_posix_64.keymap index 8d81f35b..6bd432f9 100644 --- a/app/tests/combo/press-release/native_posix_64.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -3,49 +3,49 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - /* all different combinations of press and release order */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* all different combinations of press and release order */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap index 497cf1aa..6ca6487b 100644 --- a/app/tests/combo/press-timeout/native_posix_64.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -3,33 +3,33 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index cf7e79f7..9a395a41 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 0c55eb47..86ca3931 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -3,44 +3,44 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index 248d6e75..65089578 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -3,44 +3,44 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + }; - combo_two { - timeout-ms = <30>; - key-positions = <2 3>; - bindings = <&kp D>; - }; - }; + combo_two { + timeout-ms = <30>; + key-positions = <2 3>; + bindings = <&kp D>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp Z &kp Y - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp Z &kp Y + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap index 5af94d45..832e9705 100644 --- a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -3,36 +3,36 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - /* no slow-release! */ - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + /* no slow-release! */ + }; + }; - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp D &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp D &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* this should release the combo */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap index 88351bea..7fdb012e 100644 --- a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -3,36 +3,36 @@ #include / { - combos { - compatible = "zmk,combos"; - combo_one { - timeout-ms = <30>; - key-positions = <0 1>; - bindings = <&kp C>; - slow-release; - }; - }; + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <30>; + key-positions = <0 1>; + bindings = <&kp C>; + slow-release; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp A &kp B - &kp D &none - >; - }; - }; + default_layer { + bindings = < + &kp A &kp B + &kp D &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* this should not release the combo yet */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap index 4b658a73..5e3fac42 100644 --- a/app/tests/gresc/gresc-press-release/native_posix_64.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -3,47 +3,47 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &gresc &none - &kp LEFT_SHIFT &kp LEFT_GUI - >; - }; - }; + default_layer { + bindings = < + &gresc &none + &kp LEFT_SHIFT &kp LEFT_GUI + >; + }; + }; }; &kscan { - events = < - /* esc */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + /* esc */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) + /* LGUI+` */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - /* LGUI+` */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + /* LGUI+` */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 78b8ebcb..18f94da5 100644 --- a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -11,33 +11,33 @@ The first gresc that is released releases the key. */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &gresc &gresc - &kp LEFT_SHIFT &kp LEFT_GUI - >; - }; - }; + default_layer { + bindings = < + &gresc &gresc + &kp LEFT_SHIFT &kp LEFT_GUI + >; + }; + }; }; &kscan { - events = < - /* esc */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ + events = < + /* esc */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) /* the second gresc is ignored */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) /* the second gresc is ignored */ - /* ~ */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ - >; + /* ~ */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) /* the second gresc is ignored */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) /* the second gresc is ignored */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap index 832ea7ef..51995f8d 100644 --- a/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/6-retro-tap/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - behaviors { - ht_bal: behavior_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "balanced"; - tapping_term_ms = <300>; - bindings = <&kp>, <&kp>; - retro-tap; - }; - }; + behaviors { + ht_bal: behavior_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "balanced"; + tapping_term_ms = <300>; + bindings = <&kp>, <&kp>; + retro-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &none - &kp D &none>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &none + &kp D &none>; + }; + }; }; &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* retro tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* retro tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi index 5657644d..c750f8e3 100644 --- a/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap index 942d5ae4..8c24dc34 100644 --- a/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_bal { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap index 677a2534..1db5f20e 100644 --- a/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_bal { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi index 0966ce0d..ef8efd43 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_bal: behavior_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + ht_bal: behavior_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL C - &kp D &none>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL C + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/behavior_keymap.dtsi index d62be888..9f338ebc 100644 --- a/app/tests/hold-tap/balanced/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap index 6d016501..4bac8b83 100644 --- a/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/many-nested/native_posix_64.keymap @@ -3,39 +3,39 @@ #include / { - behaviors { - ht_bal: behavior_hold_tap_balanced { - compatible = "zmk,behavior-hold-tap"; - label = "HOLD_TAP_BALANCED"; - #binding-cells = <2>; - flavor = "balanced"; - tapping-term-ms = <300>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_bal: behavior_hold_tap_balanced { + compatible = "zmk,behavior-hold-tap"; + label = "HOLD_TAP_BALANCED"; + #binding-cells = <2>; + flavor = "balanced"; + tapping-term-ms = <300>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J - &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L - >; - }; - }; + default_layer { + bindings = < + &ht_bal LEFT_SHIFT F &ht_bal LEFT_CONTROL J + &ht_bal LEFT_GUI H &ht_bal LEFT_ALT L + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(0,1,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_PRESS(1,1,100) - ZMK_MOCK_RELEASE(0,0,100) - ZMK_MOCK_RELEASE(0,1,100) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(0,1,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_PRESS(1,1,100) + ZMK_MOCK_RELEASE(0,0,100) + ZMK_MOCK_RELEASE(0,1,100) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap index dc96ee8b..8dbc7d82 100644 --- a/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/6-retro-tap/native_posix_64.keymap @@ -3,43 +3,43 @@ #include / { - behaviors { - hp: behavior_hold_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping_term_ms = <300>; - bindings = <&kp>, <&kp>; - retro-tap; - }; - }; + behaviors { + hp: behavior_hold_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping_term_ms = <300>; + bindings = <&kp>, <&kp>; + retro-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &hp LEFT_SHIFT F &none - &kp D &none>; - }; - }; + default_layer { + bindings = < + &hp LEFT_SHIFT F &none + &kp D &none>; + }; + }; }; &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* retro tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* retro tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi index bf681004..71f3aba5 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_hold: behavior_hold_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "hold_hold_tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + ht_hold: behavior_hold_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap index b48332ff..f35b73ba 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_hold { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap index 77398582..0b4eb320 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &ht_hold { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 13a58c3e..e28eb4c3 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi index fee3361e..392a5f83 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - hp: behavior_hold_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + hp: behavior_hold_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &hp LEFT_SHIFT F &hp LEFT_CONTROL G - &kp D &none>; - }; - }; + default_layer { + bindings = < + &hp LEFT_SHIFT F &hp LEFT_CONTROL G + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi index 41c84e1e..da6b8362 100644 --- a/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/behavior_keymap.dtsi @@ -5,26 +5,26 @@ / { - behaviors { - ht_hold: behavior_hold_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "hold_hold_tap"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_hold: behavior_hold_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "hold_hold_tap"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_hold LEFT_SHIFT F &ht_hold LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap index b733e3a2..500d2670 100644 --- a/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/6-nested-timeouts/native_posix_64.keymap @@ -9,45 +9,45 @@ */ / { - behaviors { - tp_short: short_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP_SHORT"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <100>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - tp_long: long_tap { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP_LONG"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + tp_short: short_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_SHORT"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <100>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + tp_long: long_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP_LONG"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp_long LEFT_SHIFT F &tp_short LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &tp_long LEFT_SHIFT F &tp_short LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,20) - ZMK_MOCK_PRESS(0,1,20) - ZMK_MOCK_RELEASE(0,1,200) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,20) + ZMK_MOCK_PRESS(0,1,20) + ZMK_MOCK_RELEASE(0,1,200) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap index 7560a05a..9ee237d3 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-ntgdn-timer-ntgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,1,200) // non trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,1,200) // non trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap index b915a6a9..f2f2f8bd 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/4a-dn-tgdn-timer-tgup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) // trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) // trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi index e4be8d15..79a88eb2 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/7-positional/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; hold-trigger-key-positions = <2>; - }; - }; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL J - &kp D &kp E>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL J + &kp D &kp E>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap index 504318f7..179b64ee 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-no-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &tp { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,1,10) // not trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,1,10) // not trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap index 7061eee7..e926b45c 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/on-release-trigger/native_posix_64.keymap @@ -6,12 +6,12 @@ &tp { hold-trigger-on-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) // mod 1 - ZMK_MOCK_PRESS(0,1,10) // mod 2 - ZMK_MOCK_PRESS(1,0,10) // trigger position - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) // mod 1 + ZMK_MOCK_PRESS(0,1,10) // mod 2 + ZMK_MOCK_PRESS(1,0,10) // trigger position + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap index a6ac1507..78404536 100644 --- a/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/7-positional/tgdn-dn-ntgdn-timer-ntgup-tgup-up/native_posix_64.keymap @@ -4,13 +4,13 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) // trigger key - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,1,400) // not trigger key - /* timer fires */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) // trigger key + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,1,400) // not trigger key + /* timer fires */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi index 4771ab75..02362ef2 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL C - &kp D &none>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL C + &kp D &none>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi index cdeb9596..df307740 100644 --- a/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - behaviors { - tp: behavior_tap_preferred { - compatible = "zmk,behavior-hold-tap"; - label = "MOD_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + tp: behavior_tap_preferred { + compatible = "zmk,behavior-hold-tap"; + label = "MOD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &tp LEFT_SHIFT F &tp LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &tp LEFT_SHIFT F &tp LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap index 38c8668c..5b725bb1 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/1-dn-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap index b5834e06..bb20a323 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/2-dn-timer-up/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,500) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,500) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap index a540353b..3a696af7 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3a-moddn-dn-modup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap index 76bb2fa3..5704ca4b 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3b-moddn-dn-modup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ - ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,1,300) - /*timer*/ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,1,10) /*ctrl*/ + ZMK_MOCK_PRESS(0,0,50) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,1,300) + /*timer*/ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap index 882f33aa..df066fb0 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3c-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /*d*/ - ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /*d*/ + ZMK_MOCK_PRESS(0,0,100) /*mt f-shift */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap index 0fc0b848..34645ad4 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/3d-kcdn-dn-kcup-timer-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) /* d */ - ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ - ZMK_MOCK_RELEASE(1,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) /* d */ + ZMK_MOCK_PRESS(0,0,100) /* mt f-shift */ + ZMK_MOCK_RELEASE(1,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap index 5d0fcbfb..9c108d32 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-htdn-timer-htup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(0,1,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(0,1,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap index fca60ba8..9fd7cbf0 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4a-dn-kcdn-timer-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,200) - ZMK_MOCK_PRESS(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,200) + ZMK_MOCK_PRESS(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap index 5d0af9ca..f586b978 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4b-dn-kcdn-kcup-timer-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(1,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(1,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap index 6b138352..3a5eab10 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4c-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* timer */ - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* timer */ + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap index 301ef0ac..cc7412f7 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/4d-dn-kcdn-timer-up-kcup/native_posix_64.keymap @@ -4,11 +4,11 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,100) - ZMK_MOCK_PRESS(1,0,100) - ZMK_MOCK_RELEASE(0,0,200) - /* timer fires */ - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,100) + ZMK_MOCK_PRESS(1,0,100) + ZMK_MOCK_RELEASE(0,0,200) + /* timer fires */ + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap index d895df02..bd431ceb 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/5-quick-tap/native_posix_64.keymap @@ -5,10 +5,10 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap index 9965c9b3..5af001f6 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap @@ -4,22 +4,22 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* tap */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* normal quick tap */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,400) - /* hold */ - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + /* tap */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* normal quick tap */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,400) + /* hold */ + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,400) + /* global quick tap */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap index 37c37f55..69d691ce 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -4,17 +4,17 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) - /* hold the second mod tap */ - ZMK_MOCK_PRESS(0,1,400) - /* press the normal key */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* hold the first mod tap */ + ZMK_MOCK_PRESS(0,0,400) + /* hold the second mod tap */ + ZMK_MOCK_PRESS(0,1,400) + /* press the normal key */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* release the hold taps */ - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + /* release the hold taps */ + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi index 6ca7ac72..029a8128 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi @@ -3,27 +3,27 @@ #include / { - behaviors { - ht_tui: behavior_hold_tap_tap_unless_interrupted { - compatible = "zmk,behavior-hold-tap"; - label = "hold_tap_tap_unless_interrupted"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <300>; - quick-tap-ms = <300>; - bindings = <&kp>, <&kp>; - global-quick-tap; - }; - }; + behaviors { + ht_tui: behavior_hold_tap_tap_unless_interrupted { + compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <300>; + quick-tap-ms = <300>; + bindings = <&kp>, <&kp>; + global-quick-tap; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi index 18f68d63..b24de6dd 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/behavior_keymap.dtsi @@ -5,26 +5,26 @@ / { - behaviors { - ht_tui: behavior_hold_tap_tap_unless_interrupted { - compatible = "zmk,behavior-hold-tap"; - label = "hold_tap_tap_unless_interrupted"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <300>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + ht_tui: behavior_hold_tap_tap_unless_interrupted { + compatible = "zmk,behavior-hold-tap"; + label = "hold_tap_tap_unless_interrupted"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <300>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J - &kp D &kp RIGHT_CONTROL>; - }; - }; + default_layer { + bindings = < + &ht_tui LEFT_SHIFT F &ht_tui LEFT_CONTROL J + &kp D &kp RIGHT_CONTROL>; + }; + }; }; diff --git a/app/tests/key-repeat/behavior_keymap.dtsi b/app/tests/key-repeat/behavior_keymap.dtsi index 24902fc6..c8e2d9c4 100644 --- a/app/tests/key-repeat/behavior_keymap.dtsi +++ b/app/tests/key-repeat/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label = "Default keymap"; + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; - default_layer { - bindings = < - &key_repeat &kp A - &kp LCTRL &kp C_VOL_UP - >; - }; - }; + default_layer { + bindings = < + &key_repeat &kp A + &kp LCTRL &kp C_VOL_UP + >; + }; + }; }; diff --git a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap index b042e8e0..e4687573 100644 --- a/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap +++ b/app/tests/key-repeat/ignore-other-usage-page-events/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap index 98c8f6f8..9078f304 100644 --- a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap index 42f6514b..1d27770b 100644 --- a/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap +++ b/app/tests/key-repeat/press-and-release-after-key-usage/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,9000) - ZMK_MOCK_RELEASE(0,1,30) - ZMK_MOCK_PRESS(0,0,30) - ZMK_MOCK_RELEASE(0,0,3000) - >; + events = < + ZMK_MOCK_PRESS(0,1,9000) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_PRESS(0,0,30) + ZMK_MOCK_RELEASE(0,0,3000) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap index ab9622e4..109aed5a 100644 --- a/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap +++ b/app/tests/key-repeat/press-and-release-with-explicit-modifiers/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap index 9ff64468..0d2d0f6c 100644 --- a/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap +++ b/app/tests/key-repeat/send-nothing-if-no-keys-pressed-yet/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keypress/behavior_keymap.dtsi b/app/tests/keypress/behavior_keymap.dtsi index f0c5d0c2..52f9421c 100644 --- a/app/tests/keypress/behavior_keymap.dtsi +++ b/app/tests/keypress/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp B &none + &none &none + >; + }; + }; }; diff --git a/app/tests/keypress/kp-press-release/native_posix_64.keymap b/app/tests/keypress/kp-press-release/native_posix_64.keymap index c8e744ee..a414f34b 100644 --- a/app/tests/keypress/kp-press-release/native_posix_64.keymap +++ b/app/tests/keypress/kp-press-release/native_posix_64.keymap @@ -1,8 +1,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/behavior_keymap.dtsi b/app/tests/keytoggle/behavior_keymap.dtsi index 32712a8d..45d48164 100644 --- a/app/tests/keytoggle/behavior_keymap.dtsi +++ b/app/tests/keytoggle/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kt B &none + &none &none + >; + }; + }; }; diff --git a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap index f4d03429..4f70b591 100644 --- a/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-alt-tab/native_posix_64.keymap @@ -3,46 +3,46 @@ #include &kscan { - events = < + events = < /* Toggle LALT on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Tap TAB twice */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* Toggle LSHFT on */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* Tap TAB once */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) /* Toggle LALT off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) /* Toggle LSHFT off */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) /* Tap A */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt LALT &kp TAB - &kt LSHFT &kp A - >; - }; - }; + default_layer { + bindings = < + &kt LALT &kp TAB + &kt LSHFT &kp A + >; + }; + }; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap index 0a4ad4ae..b07f297f 100644 --- a/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-modded-alpha/native_posix_64.keymap @@ -3,36 +3,36 @@ #include &kscan { - events = < + events = < /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Press A */ - ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,0,10) /* Toggle LS(A) on */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Toggle LS(A) off */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) /* Release A */ - ZMK_MOCK_RELEASE(1,0,10) - >; + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kt LS(A) &trans - &kp A &trans - >; - }; - }; + default_layer { + bindings = < + &kt LS(A) &trans + &kp A &trans + >; + }; + }; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap index e25d4b18..5c2d2028 100644 --- a/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release-nkro/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap index e25d4b18..5c2d2028 100644 --- a/app/tests/keytoggle/kt-press-release/native_posix_64.keymap +++ b/app/tests/keytoggle/kt-press-release/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/macros/basic/native_posix_64.keymap b/app/tests/macros/basic/native_posix_64.keymap index a2812792..a34ba99f 100644 --- a/app/tests/macros/basic/native_posix_64.keymap +++ b/app/tests/macros/basic/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/behavior_keymap.dtsi b/app/tests/macros/behavior_keymap.dtsi index 7399cd5b..90322e42 100644 --- a/app/tests/macros/behavior_keymap.dtsi +++ b/app/tests/macros/behavior_keymap.dtsi @@ -9,60 +9,60 @@ #include / { - macros { - ZMK_MACRO(abc_macro, - wait-ms = <10>; - tap-ms = <50>; - bindings = <&kp A &kp B &kp C>; - ) + macros { + ZMK_MACRO(abc_macro, + wait-ms = <10>; + tap-ms = <50>; + bindings = <&kp A &kp B &kp C>; + ) - ZMK_MACRO(hold_shift_macro, - bindings - = <¯o_press &kp LSHFT> - , <¯o_tap> - , <&kp D &kp O &kp G> - , <¯o_release &kp LSHFT> - ; - ) + ZMK_MACRO(hold_shift_macro, + bindings + = <¯o_press &kp LSHFT> + , <¯o_tap> + , <&kp D &kp O &kp G> + , <¯o_release &kp LSHFT> + ; + ) - ZMK_MACRO(custom_timing, - bindings - = <¯o_wait_time 50> - , <&kp A> - , <¯o_tap_time 20> - , <&kp B &kp C> - ; - ) + ZMK_MACRO(custom_timing, + bindings + = <¯o_wait_time 50> + , <&kp A> + , <¯o_tap_time 20> + , <&kp B &kp C> + ; + ) - ZMK_MACRO(dual_sequence_macro, - wait-ms = <10>; - tap-ms = <40>; - bindings - = <¯o_press &kp LALT> - , <¯o_tap> - , <&kp TAB> - , <¯o_pause_for_release> - , <¯o_release &kp LALT> - ; - ) - }; + ZMK_MACRO(dual_sequence_macro, + wait-ms = <10>; + tap-ms = <40>; + bindings + = <¯o_press &kp LALT> + , <¯o_tap> + , <&kp TAB> + , <¯o_pause_for_release> + , <¯o_release &kp LALT> + ; + ) + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &abc_macro &mo 1 - &hold_shift_macro &custom_timing>; - }; + default_layer { + bindings = < + &abc_macro &mo 1 + &hold_shift_macro &custom_timing>; + }; - extra_layer { - bindings = < - &dual_sequence_macro &trans - &kp TAB &none>; + extra_layer { + bindings = < + &dual_sequence_macro &trans + &kp TAB &none>; - }; + }; - }; + }; }; diff --git a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap index e6ef4f49..bdf89abf 100644 --- a/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-from-hold-tap/native_posix_64.keymap @@ -9,19 +9,19 @@ #include / { - macros { - ZMK_MACRO( - mo_mod_macro, - wait-ms = <0>; - tap-ms = <20>; - bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; - ) - }; + macros { + ZMK_MACRO( + mo_mod_macro, + wait-ms = <0>; + tap-ms = <20>; + bindings + = <¯o_press &mo 1 &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo 1 &kp LSHFT>; + ) + }; - behaviors { + behaviors { mth: macro_tap_hold { compatible = "zmk,behavior-hold-tap"; label = "MACRO_TAP_HOLD"; @@ -30,28 +30,28 @@ tapping-term-ms = <200>; bindings = <&mo_mod_macro>, <&kp>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mth 0 TAB &kp A - &kp B &kp C>; - }; + default_layer { + bindings = < + &mth 0 TAB &kp A + &kp B &kp C>; + }; - extra_layer { - bindings = < - &kp D &kp E - &kp F &kp G>; + extra_layer { + bindings = < + &kp D &kp E + &kp F &kp G>; - }; + }; - }; + }; }; &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap index c5cde5b4..4cc60bf5 100644 --- a/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap +++ b/app/tests/macros/mo-plus-modifier-macro/native_posix_64.keymap @@ -9,38 +9,38 @@ #include / { - macros { - ZMK_MACRO( - mo_mod_macro, - wait-ms = <0>; - tap-ms = <20>; - bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; - ) - }; + macros { + ZMK_MACRO( + mo_mod_macro, + wait-ms = <0>; + tap-ms = <20>; + bindings + = <¯o_press &mo 1 &kp LSHFT> + , <¯o_pause_for_release> + , <¯o_release &mo 1 &kp LSHFT>; + ) + }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &mo_mod_macro &kp A - &kp B &kp C>; - }; + default_layer { + bindings = < + &mo_mod_macro &kp A + &kp B &kp C>; + }; - extra_layer { - bindings = < - &kp D &kp E - &kp F &kp G>; + extra_layer { + bindings = < + &kp D &kp E + &kp F &kp G>; - }; + }; - }; + }; }; &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/press-mid-macro/native_posix_64.keymap b/app/tests/macros/press-mid-macro/native_posix_64.keymap index b8ae76f1..8010a8e7 100644 --- a/app/tests/macros/press-mid-macro/native_posix_64.keymap +++ b/app/tests/macros/press-mid-macro/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/press-release/native_posix_64.keymap b/app/tests/macros/press-release/native_posix_64.keymap index 25467126..75333333 100644 --- a/app/tests/macros/press-release/native_posix_64.keymap +++ b/app/tests/macros/press-release/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/timing-override/native_posix_64.keymap b/app/tests/macros/timing-override/native_posix_64.keymap index 343926a7..e5d35e88 100644 --- a/app/tests/macros/timing-override/native_posix_64.keymap +++ b/app/tests/macros/timing-override/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/macros/wait-macro-release/native_posix_64.keymap b/app/tests/macros/wait-macro-release/native_posix_64.keymap index 6dabaeca..394e4a88 100644 --- a/app/tests/macros/wait-macro-release/native_posix_64.keymap +++ b/app/tests/macros/wait-macro-release/native_posix_64.keymap @@ -10,5 +10,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap index fb939de5..916aa569 100644 --- a/app/tests/mod-morph/1-no-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/1-no-morph/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap index 9ad50202..ec0591e5 100644 --- a/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/2a-masked-morph/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap index 74de8588..66fb1ed0 100644 --- a/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap +++ b/app/tests/mod-morph/2b-masked-morph-implicit-overwrite/native_posix_64.keymap @@ -13,25 +13,25 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap index d5406e19..de1368bd 100644 --- a/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap +++ b/app/tests/mod-morph/2c-masked-morph-and-explicit-mods/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; diff --git a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap index 7071e8cd..9b7f4fe1 100644 --- a/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap +++ b/app/tests/mod-morph/2d-masked-morph-into-hold-tap-tap/native_posix_64.keymap @@ -3,13 +3,13 @@ #include &kscan { - events = < + events = < /* Shift + tap &mod_morph --> expect B (but get Shift + B) */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { @@ -24,22 +24,22 @@ }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_SHIFT &mod_morph - &kp C &none - >; - }; + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; second_layer { - bindings = < - &trans &trans - &kp D &trans - >; - }; - }; + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; }; diff --git a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap index 96c2f270..e0c1d1e5 100644 --- a/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap +++ b/app/tests/mod-morph/2e-masked-morph-into-hold-tap-hold/native_posix_64.keymap @@ -3,15 +3,15 @@ #include &kscan { - events = < + events = < /* Shift + hold &mod_morph --> expect and get D (no shift) */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,200) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { @@ -26,22 +26,22 @@ }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_SHIFT &mod_morph - &kp C &none - >; - }; + default_layer { + bindings = < + &kp LEFT_SHIFT &mod_morph + &kp C &none + >; + }; second_layer { - bindings = < - &trans &trans - &kp D &trans - >; - }; - }; + bindings = < + &trans &trans + &kp D &trans + >; + }; + }; }; diff --git a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap index a82d3ea7..a20c04d5 100644 --- a/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap +++ b/app/tests/mod-morph/3-unmasked-morph/native_posix_64.keymap @@ -14,24 +14,24 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; diff --git a/app/tests/mod-morph/behavior_keymap.dtsi b/app/tests/mod-morph/behavior_keymap.dtsi index 09720d8d..2f880540 100644 --- a/app/tests/mod-morph/behavior_keymap.dtsi +++ b/app/tests/mod-morph/behavior_keymap.dtsi @@ -9,15 +9,15 @@ }; }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_ALT &mod_morph - &kp LEFT_SHIFT &kp RIGHT_SHIFT - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_ALT &mod_morph + &kp LEFT_SHIFT &kp RIGHT_SHIFT + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index dbb2df5c..621945a8 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -4,25 +4,25 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LS(LA(LG(LEFT_CONTROL))) &kp LEFT_CONTROL - &kp A &none - >; - }; - }; + default_layer { + bindings = < + &kp LS(LA(LG(LEFT_CONTROL))) &kp LEFT_CONTROL + &kp A &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap index b01c6257..d68f8921 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-dn-lctl-up-lctl-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap index 89930328..c2d12eb2 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lctl-up/native_posix_64.keymap @@ -4,22 +4,22 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap index acd55e83..7be62b94 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lctl-up-lsft-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap index 7e1865a0..8d1d773e 100644 --- a/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-lctl-dn-lsft-dn-lsft-up-lctl-up/native_posix_64.keymap @@ -4,25 +4,25 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LEFT_CONTROL &kp LEFT_CONTROL - &kp LEFT_SHIFT &none - >; - }; - }; + default_layer { + bindings = < + &kp LEFT_CONTROL &kp LEFT_CONTROL + &kp LEFT_SHIFT &none + >; + }; + }; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap index e175d60e..87101d83 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod1-up-mod2-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap index 8c4534f4..6b40fef1 100644 --- a/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap +++ b/app/tests/modifiers/implicit/kp-mod1-dn-mod2-dn-mod2-up-mod1-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &none &none + >; + }; + }; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap index e82182c4..4b2ca139 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-lctl-up-mod-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap index a36b85d2..a2564762 100644 --- a/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap +++ b/app/tests/modifiers/mixed/kp-lctl-dn-mod-dn-mod-up-lctl-up/native_posix_64.keymap @@ -4,24 +4,24 @@ &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp LC(A) &kp LS(B) - &kp LEFT_CONTROL &none - >; - }; - }; + default_layer { + bindings = < + &kp LC(A) &kp LS(B) + &kp LEFT_CONTROL &none + >; + }; + }; }; diff --git a/app/tests/momentary-layer/1-normal/native_posix_64.keymap b/app/tests/momentary-layer/1-normal/native_posix_64.keymap index ed0e8ad1..387a1322 100644 --- a/app/tests/momentary-layer/1-normal/native_posix_64.keymap +++ b/app/tests/momentary-layer/1-normal/native_posix_64.keymap @@ -4,29 +4,29 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &kp C &trans - &none &none>; - }; - }; + layer_1 { + bindings = < + &kp C &trans + &none &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap index 9311fdee..776fc761 100644 --- a/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/2-early-key-release/native_posix_64.keymap @@ -4,29 +4,29 @@ #include "../behavior_keymap.dtsi" / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &kp C &none - &none &none>; - }; - }; + layer_1 { + bindings = < + &kp C &none + &none &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/3-covered/native_posix_64.keymap b/app/tests/momentary-layer/3-covered/native_posix_64.keymap index 62ae301d..a7939d9e 100644 --- a/app/tests/momentary-layer/3-covered/native_posix_64.keymap +++ b/app/tests/momentary-layer/3-covered/native_posix_64.keymap @@ -7,27 +7,27 @@ this test verifies that the correct key is released when a layer is enabled "on and the original key is "covered". */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &trans &mo 1 - &trans &trans>; - }; + default_layer { + bindings = < + &trans &mo 1 + &trans &trans>; + }; - layer_1 { - bindings = < - &trans &kp A - &trans &trans>; - }; - }; + layer_1 { + bindings = < + &trans &kp A + &trans &trans>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/momentary-layer/4-nested/native_posix_64.keymap b/app/tests/momentary-layer/4-nested/native_posix_64.keymap index fd376d00..1f4f0aea 100644 --- a/app/tests/momentary-layer/4-nested/native_posix_64.keymap +++ b/app/tests/momentary-layer/4-nested/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &mo 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &mo 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &none - &kp B &none>; - }; - }; + layer_2 { + bindings = < + &none &none + &kp B &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap index c467aea3..4c8f7890 100644 --- a/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap +++ b/app/tests/momentary-layer/5-nested-early-key-release/native_posix_64.keymap @@ -3,37 +3,37 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &none &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &none &none>; + }; - layer_1 { - bindings = < - &mo 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &mo 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &none - &kp B &none>; - }; - }; + layer_2 { + bindings = < + &none &none + &kp B &none>; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/momentary-layer/behavior_keymap.dtsi b/app/tests/momentary-layer/behavior_keymap.dtsi index 40bc31ec..63127a39 100644 --- a/app/tests/momentary-layer/behavior_keymap.dtsi +++ b/app/tests/momentary-layer/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &mo 1 - &trans &trans>; - }; + default_layer { + bindings = < + &kp B &mo 1 + &trans &trans>; + }; - layer_1 { - bindings = < - &kp C_NEXT &trans - &trans &trans>; - }; - }; + layer_1 { + bindings = < + &kp C_NEXT &trans + &trans &trans>; + }; + }; }; diff --git a/app/tests/none/behavior_keymap.dtsi b/app/tests/none/behavior_keymap.dtsi index 40d863c1..7a4c099b 100644 --- a/app/tests/none/behavior_keymap.dtsi +++ b/app/tests/none/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &none &mo 1 - &kp A &none>; - }; + default_layer { + bindings = < + &none &mo 1 + &kp A &none>; + }; - lower_layer { - bindings = < - &none &trans - &none &kp A>; - }; - }; + lower_layer { + bindings = < + &none &trans + &none &kp A>; + }; + }; }; diff --git a/app/tests/none/layered/native_posix_64.keymap b/app/tests/none/layered/native_posix_64.keymap index 597ca2db..b1e84c30 100644 --- a/app/tests/none/layered/native_posix_64.keymap +++ b/app/tests/none/layered/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/none/normal/native_posix.keymap b/app/tests/none/normal/native_posix.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/none/normal/native_posix.keymap +++ b/app/tests/none/normal/native_posix.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/none/normal/native_posix_64.keymap b/app/tests/none/normal/native_posix_64.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/none/normal/native_posix_64.keymap +++ b/app/tests/none/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap index 230e9566..f9612928 100644 --- a/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/1-os-dn-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap index 5c1c2264..bc541824 100644 --- a/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods-quick-release/native_posix_64.keymap @@ -3,38 +3,38 @@ #include &sk { - quick-release; + quick-release; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_CONTROL &kp A - &sk LEFT_SHIFT &sk LEFT_ALT>; - }; - }; + default_layer { + bindings = < + &sk LEFT_CONTROL &kp A + &sk LEFT_SHIFT &sk LEFT_ALT>; + }; + }; }; &kscan { - events = < - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap sk LEFT_ALT */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - /* tap A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap sk LEFT_ALT */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + /* tap A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; diff --git a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap index 79567de9..9121b188 100644 --- a/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-callum-mods/native_posix_64.keymap @@ -3,41 +3,41 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &sk LEFT_SHIFT &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &sk LEFT_SHIFT &kp Z>; + }; + }; }; &kscan { - events = < - /* press sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* release sl lower_layer */ - ZMK_MOCK_RELEASE(0,1,10) - /* tap A (with left control and left shift enabled) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap A (no sticky keys anymore) */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + /* press sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* release sl lower_layer */ + ZMK_MOCK_RELEASE(0,1,10) + /* tap A (with left control and left shift enabled) */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap A (no sticky keys anymore) */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index e89faa93..23ceeeb6 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -8,58 +8,58 @@ */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sl 1 &kp A - &none &none>; - }; + default_layer { + bindings = < + &sl 1 &kp A + &none &none>; + }; - layer_1 { - bindings = < - &sl 2 &none - &none &none>; - }; + layer_1 { + bindings = < + &sl 2 &none + &none &none>; + }; - layer_2 { - bindings = < - &none &kp NUM_1 - &none &none>; - }; - }; + layer_2 { + bindings = < + &none &kp NUM_1 + &none &none>; + }; + }; }; &kscan { - events = < - /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + events = < + /* press sl 1 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press sl 2 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) - /* repeat test to check if cleanup is done correctly */ - /* press sl 1 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press sl 2 */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* press 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) + /* repeat test to check if cleanup is done correctly */ + /* press sl 1 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press sl 2 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* press 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap index f52a6bec..131e7069 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup-quick-release/native_posix_64.keymap @@ -4,23 +4,23 @@ #include "../behavior_keymap.dtsi" &sk { - quick-release; + quick-release; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - /* second key is pressed shortly after the first. It should not be capitalized. */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(1,1,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + /* second key is pressed shortly after the first. It should not be capitalized. */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(1,1,10) - /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap index 63aca99b..4a0c50c8 100644 --- a/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-os-dn-up-kcdn-kcup/native_posix_64.keymap @@ -4,16 +4,16 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat test to check if cleanup is done correctly */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 18d09ebc..39020751 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -8,45 +8,45 @@ */ / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press X */ - ZMK_MOCK_PRESS(0,1,10) - /* press A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* press sl 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press X */ + ZMK_MOCK_PRESS(0,1,10) + /* press A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat test to check if cleanup is done correctly */ - /* press sl 1 */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* press X */ - ZMK_MOCK_PRESS(0,1,10) - /* press Y */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat test to check if cleanup is done correctly */ + /* press sl 1 */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* press X */ + ZMK_MOCK_PRESS(0,1,10) + /* press Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap index 47600269..c635dade 100644 --- a/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/3a-os-dn-kcdn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap index 2fb661a7..e629d270 100644 --- a/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/3b-os-dn-kcdn-up-kcup/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap index 92fd1e0a..2404a582 100644 --- a/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/4-os-dn-up-kcdn-timer-kcup/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,800) - ZMK_MOCK_PRESS(1,0,400) - ZMK_MOCK_RELEASE(1,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,800) + ZMK_MOCK_PRESS(1,0,400) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap index 1daa6c4f..7cf04b7d 100644 --- a/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/5-os-kcdn-dn-kcup-up/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(1,0,10) - ZMK_MOCK_RELEASE(0,0,1100) - >; + events = < + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + ZMK_MOCK_RELEASE(0,0,1100) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap index 1be65a5b..a22d0a5a 100644 --- a/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap +++ b/app/tests/sticky-keys/7-os-dn-up-kc1dn-kc2dn-kc1up-kc2up/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,0,100) - ZMK_MOCK_RELEASE(1,1,100) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,0,100) + ZMK_MOCK_RELEASE(1,1,100) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap index 6d88a9ea..4da4ad98 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination-quick-release/native_posix_64.keymap @@ -3,54 +3,54 @@ #include &sk { - quick-release; + quick-release; }; / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_SHIFT &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk LEFT_SHIFT &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap B */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) - /* tap sk LEFT_SHIFT */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap Y */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - /* tap B */ - ZMK_MOCK_PRESS(1,1,10) - ZMK_MOCK_RELEASE(1,1,10) - >; + /* tap sk LEFT_SHIFT */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap Y */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + /* tap B */ + ZMK_MOCK_PRESS(1,1,10) + ZMK_MOCK_RELEASE(1,1,10) + >; }; diff --git a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap index a90bb32e..d9c49014 100644 --- a/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap +++ b/app/tests/sticky-keys/8-lsk-osk-combination/native_posix_64.keymap @@ -3,45 +3,45 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &sl 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &sl 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; &kscan { - events = < - /* tap sl lower_layer */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk LEFT_CONTROL */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) + events = < + /* tap sl lower_layer */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk LEFT_CONTROL */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) - /* repeat */ - /* tap sl */ - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - /* tap sk */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* tap A */ - ZMK_MOCK_PRESS(1,0,10) - ZMK_MOCK_RELEASE(1,0,10) - >; + /* repeat */ + /* tap sl */ + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + /* tap sk */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* tap A */ + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap index f811f7e9..74678256 100644 --- a/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap +++ b/app/tests/sticky-keys/9-sk-dn-up-dn-up/native_posix_64.keymap @@ -3,25 +3,25 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk LEFT_SHIFT &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &sk LEFT_SHIFT &none + &none &none + >; + }; + }; }; &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* the sticky key is pressed again, so the previous one must be cancelled */ - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,1200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* the sticky key is pressed again, so the previous one must be cancelled */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,1200) + >; }; \ No newline at end of file diff --git a/app/tests/sticky-keys/behavior_keymap.dtsi b/app/tests/sticky-keys/behavior_keymap.dtsi index f1277009..9322cb14 100644 --- a/app/tests/sticky-keys/behavior_keymap.dtsi +++ b/app/tests/sticky-keys/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &sk E &mo 1 - &kp A &kp B>; - }; + default_layer { + bindings = < + &sk E &mo 1 + &kp A &kp B>; + }; - lower_layer { - bindings = < - &sk LEFT_CONTROL &kp X - &kp Y &kp Z>; - }; - }; + lower_layer { + bindings = < + &sk LEFT_CONTROL &kp X + &kp Y &kp Z>; + }; + }; }; diff --git a/app/tests/tap-dance/1a-tap1/native_posix_64.keymap b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap index 1e5dff06..4e65cfa1 100644 --- a/app/tests/tap-dance/1a-tap1/native_posix_64.keymap +++ b/app/tests/tap-dance/1a-tap1/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap index 5674c4ea..47fa8c33 100644 --- a/app/tests/tap-dance/1b-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/1b-tap2/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap index 142b8236..6b01dfff 100644 --- a/app/tests/tap-dance/1c-tap3/native_posix_64.keymap +++ b/app/tests/tap-dance/1c-tap3/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,200) - >; + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,200) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap index bcfc21d2..c16f875b 100644 --- a/app/tests/tap-dance/2a-hold1/native_posix_64.keymap +++ b/app/tests/tap-dance/2a-hold1/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + events = < + ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap index 6691437e..49948886 100644 --- a/app/tests/tap-dance/2b-hold2/native_posix_64.keymap +++ b/app/tests/tap-dance/2b-hold2/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap index 942ecfc0..7bedd650 100644 --- a/app/tests/tap-dance/2c-hold3/native_posix_64.keymap +++ b/app/tests/tap-dance/2c-hold3/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + events = < ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,0,400) - ZMK_MOCK_RELEASE(0,0,10) - >; + ZMK_MOCK_RELEASE(0,0,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap index 8a62430c..903b9a88 100644 --- a/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/3a-tap-int-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(1,0,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap index 4a76bdb0..7d10b715 100644 --- a/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/3b-tap-int-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap index e1b6d979..571a877f 100644 --- a/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap +++ b/app/tests/tap-dance/3c-tap-int-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap index 55a98d36..0220977a 100644 --- a/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/3d-hold-int-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_RELEASE(0,0,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap index b31e92dc..58595291 100644 --- a/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/3e-hold-int-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap index 6397fbb3..78770b13 100644 --- a/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap +++ b/app/tests/tap-dance/3f-hold-int-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,400) + events = < + ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/4a-single/native_posix_64.keymap b/app/tests/tap-dance/4a-single/native_posix_64.keymap index 348a6827..d473a7d2 100644 --- a/app/tests/tap-dance/4a-single/native_posix_64.keymap +++ b/app/tests/tap-dance/4a-single/native_posix_64.keymap @@ -4,8 +4,8 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,1,10) - >; + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,1,10) + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap index 2188fd02..79bdf2f7 100644 --- a/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap +++ b/app/tests/tap-dance/5a-tdint-mid/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_RELEASE(1,0,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap index 320b7199..012d932d 100644 --- a/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap +++ b/app/tests/tap-dance/5b-tdint-seq/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(1,1,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap index 17e538bd..fea96a56 100644 --- a/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap +++ b/app/tests/tap-dance/5c-tdint-after/native_posix_64.keymap @@ -4,10 +4,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap index 150f6d05..f98be05f 100644 --- a/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap +++ b/app/tests/tap-dance/5d-tdint-multiple/native_posix_64.keymap @@ -4,12 +4,12 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(1,0,10) + events = < + ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_PRESS(1,1,10) ZMK_MOCK_RELEASE(1,1,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,200) - >; + >; }; \ No newline at end of file diff --git a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap index 72b6744a..a8a82fd9 100644 --- a/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap +++ b/app/tests/tap-dance/6-combo-tap2/native_posix_64.keymap @@ -4,14 +4,14 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,10) - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_PRESS(0,1,10) - ZMK_MOCK_RELEASE(0,0,10) - ZMK_MOCK_RELEASE(0,1,200) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,200) + >; }; \ No newline at end of file diff --git a/app/tests/to-layer/behavior_keymap.dtsi b/app/tests/to-layer/behavior_keymap.dtsi index 81e7e809..663e897d 100644 --- a/app/tests/to-layer/behavior_keymap.dtsi +++ b/app/tests/to-layer/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &to 0 &to 1 - &kp A &kp S>; - }; + default_layer { + bindings = < + &to 0 &to 1 + &kp A &kp S>; + }; - second_layer { - bindings = < - &to 0 &to 1 - &kp J &kp K>; - }; - }; + second_layer { + bindings = < + &to 0 &to 1 + &kp J &kp K>; + }; + }; }; diff --git a/app/tests/to-layer/normal/native_posix_64.keymap b/app/tests/to-layer/normal/native_posix_64.keymap index 056341f7..4cb23809 100644 --- a/app/tests/to-layer/normal/native_posix_64.keymap +++ b/app/tests/to-layer/normal/native_posix_64.keymap @@ -11,19 +11,19 @@ // To layer 0 -- does nothing &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/toggle-layer/behavior_keymap.dtsi b/app/tests/toggle-layer/behavior_keymap.dtsi index b9c0d4a4..1ecf8599 100644 --- a/app/tests/toggle-layer/behavior_keymap.dtsi +++ b/app/tests/toggle-layer/behavior_keymap.dtsi @@ -3,26 +3,26 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &tog 1 - &kp D &kp G>; - }; + default_layer { + bindings = < + &kp B &tog 1 + &kp D &kp G>; + }; - lower_layer { - bindings = < - &kp C_NEXT &trans - &kp L &kp J>; - }; + lower_layer { + bindings = < + &kp C_NEXT &trans + &kp L &kp J>; + }; - raise_layer { - bindings = < - &kp W &kp U - &kp X &kp M>; - }; - }; + raise_layer { + bindings = < + &kp W &kp U + &kp X &kp M>; + }; + }; }; diff --git a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap index 6c293390..0a0c88ea 100644 --- a/app/tests/toggle-layer/early-key-release/native_posix_64.keymap +++ b/app/tests/toggle-layer/early-key-release/native_posix_64.keymap @@ -4,6 +4,6 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/toggle-layer/normal/native_posix_64.keymap b/app/tests/toggle-layer/normal/native_posix_64.keymap index 9df9d649..97bdd179 100644 --- a/app/tests/toggle-layer/normal/native_posix_64.keymap +++ b/app/tests/toggle-layer/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/transparent/behavior_keymap.dtsi b/app/tests/transparent/behavior_keymap.dtsi index 2a7e783a..dd5ded90 100644 --- a/app/tests/transparent/behavior_keymap.dtsi +++ b/app/tests/transparent/behavior_keymap.dtsi @@ -3,20 +3,20 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &trans &mo 1 - &kp A &none>; - }; + default_layer { + bindings = < + &trans &mo 1 + &kp A &none>; + }; - lower_layer { - bindings = < - &trans &trans - &trans &kp A>; - }; - }; + lower_layer { + bindings = < + &trans &trans + &trans &kp A>; + }; + }; }; diff --git a/app/tests/transparent/layered/native_posix_64.keymap b/app/tests/transparent/layered/native_posix_64.keymap index 597ca2db..b1e84c30 100644 --- a/app/tests/transparent/layered/native_posix_64.keymap +++ b/app/tests/transparent/layered/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/transparent/normal/native_posix_64.keymap b/app/tests/transparent/normal/native_posix_64.keymap index cbeb61dc..502f7ccc 100644 --- a/app/tests/transparent/normal/native_posix_64.keymap +++ b/app/tests/transparent/normal/native_posix_64.keymap @@ -4,5 +4,5 @@ #include "../behavior_keymap.dtsi" &kscan { - events = ; + events = ; }; \ No newline at end of file diff --git a/app/tests/wpm/1-single_keypress/native_posix_64.keymap b/app/tests/wpm/1-single_keypress/native_posix_64.keymap index 2aa52c16..2b113409 100644 --- a/app/tests/wpm/1-single_keypress/native_posix_64.keymap +++ b/app/tests/wpm/1-single_keypress/native_posix_64.keymap @@ -1,10 +1,10 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ - ZMK_MOCK_PRESS(0,0,6000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + /* Wait for the worker to trigger and reset after 5 seconds, followed by a 0 at 6 seconds */ + ZMK_MOCK_PRESS(0,0,6000) + >; }; \ No newline at end of file diff --git a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap index 3cfab946..869a5208 100644 --- a/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap +++ b/app/tests/wpm/2-multiple_keypress/native_posix_64.keymap @@ -1,15 +1,15 @@ #include "../behavior_keymap.dtsi" &kscan { - events = < - ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) - //1st WPM worker call - 12wpm - 1 key press in 1 second - ZMK_MOCK_PRESS(0,0,1000) - ZMK_MOCK_RELEASE(0,0,10) - // 2nd WPM worker call - 12wpm - 2 key press in 2 second - // note there is no event for this as WPM hasn't changed - // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds - ZMK_MOCK_PRESS(0,0,2000) - >; + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,10) + //1st WPM worker call - 12wpm - 1 key press in 1 second + ZMK_MOCK_PRESS(0,0,1000) + ZMK_MOCK_RELEASE(0,0,10) + // 2nd WPM worker call - 12wpm - 2 key press in 2 second + // note there is no event for this as WPM hasn't changed + // 3rd WPM worker call - 8wpm - 2 key press in 3 seconds + ZMK_MOCK_PRESS(0,0,2000) + >; }; \ No newline at end of file diff --git a/app/tests/wpm/behavior_keymap.dtsi b/app/tests/wpm/behavior_keymap.dtsi index f0c5d0c2..52f9421c 100644 --- a/app/tests/wpm/behavior_keymap.dtsi +++ b/app/tests/wpm/behavior_keymap.dtsi @@ -3,15 +3,15 @@ #include / { - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; - default_layer { - bindings = < - &kp B &none - &none &none - >; - }; - }; + default_layer { + bindings = < + &kp B &none + &none &none + >; + }; + }; }; diff --git a/docs/blog/2020-10-03-bootloader-fix.md b/docs/blog/2020-10-03-bootloader-fix.md index 8a9fd7f8..ec1d7b0b 100644 --- a/docs/blog/2020-10-03-bootloader-fix.md +++ b/docs/blog/2020-10-03-bootloader-fix.md @@ -175,19 +175,19 @@ do is shift back the settings area and code space `0xC000` bytes. We'll apply this to all of the `.dts` files for the boards that were affected by this issue. ```diff - code_partition: partition@26000 { - label = "code_partition"; -- reg = <0x00026000 0x000d2000>; -+ reg = <0x00026000 0x000c6000>; - }; + code_partition: partition@26000 { + label = "code_partition"; +- reg = <0x00026000 0x000d2000>; ++ reg = <0x00026000 0x000c6000>; + }; -- storage_partition: partition@f8000 { -+ storage_partition: partition@ec000 { - label = "storage"; -- reg = <0x000f8000 0x00008000>; -+ reg = <0x000ec000 0x00008000>; - }; +- storage_partition: partition@f8000 { ++ storage_partition: partition@ec000 { + label = "storage"; +- reg = <0x000f8000 0x00008000>; ++ reg = <0x000ec000 0x00008000>; + }; ``` And with those changes, we should no longer run into this issue! In the process diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index f267e4a4..f0096606 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -57,14 +57,14 @@ For example, the following hold-tap configuration enables `global-quick-tap` wit ``` gqt: global-quick-tap { - compatible = "zmk,behavior-hold-tap"; - label = "GLOBAL_QUICK_TAP"; - #binding-cells = <2>; - flavor = "tap-preferred"; - tapping-term-ms = <200>; - quick-tap-ms = <125>; - global-quick-tap; - bindings = <&kp>, <&kp>; + compatible = "zmk,behavior-hold-tap"; + label = "GLOBAL_QUICK_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + quick-tap-ms = <125>; + global-quick-tap; + bindings = <&kp>, <&kp>; }; ``` @@ -80,7 +80,7 @@ For example, if you press `&mt LEFT_SHIFT A` and then release it without pressin ``` &mt { - retro-tap; + retro-tap; }; ``` @@ -101,28 +101,28 @@ See the following example, which uses a hold-tap behavior definition, configured #include / { - behaviors { - pht: positional_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "POSITIONAL_HOLD_TAP"; - #binding-cells = <2>; - flavor = "hold-preferred"; - tapping-term-ms = <400>; - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = <1>; // <---[[the W key]] - }; - }; - keymap { - compatible = "zmk,keymap"; - label ="Default keymap"; - default_layer { - bindings = < - // position 0 position 1 position 2 - &pht LEFT_SHIFT Q &kp W &kp E - >; - }; - }; + behaviors { + pht: positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "hold-preferred"; + tapping-term-ms = <400>; + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <1>; // <---[[the W key]] + }; + }; + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + default_layer { + bindings = < + // position 0 position 1 position 2 + &pht LEFT_SHIFT Q &kp W &kp E + >; + }; + }; }; ``` @@ -154,28 +154,28 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - lh_pht: left_hand_positional_hold_tap { - compatible = "zmk,behavior-hold-tap"; - label = "LEFT_POSITIONAL_HOLD_TAP"; - #binding-cells = <2>; - flavor = "tap-unless-interrupted"; - tapping-term-ms = <100>; // <---[[produces tap if held longer than tapping-term-ms]] - quick-tap-ms = <200>; - bindings = <&kp>, <&kp>; - hold-trigger-key-positions = <5 6 7 8 9 10>; // <---[[right-hand keys]] - }; - }; + behaviors { + lh_pht: left_hand_positional_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "LEFT_POSITIONAL_HOLD_TAP"; + #binding-cells = <2>; + flavor = "tap-unless-interrupted"; + tapping-term-ms = <100>; // <---[[produces tap if held longer than tapping-term-ms]] + quick-tap-ms = <200>; + bindings = <&kp>, <&kp>; + hold-trigger-key-positions = <5 6 7 8 9 10>; // <---[[right-hand keys]] + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - // position 0 pos 1 pos 2 pos 3 pos 4 pos 5 pos 6 pos 7 pos 8 pos 9 pos 10 - &lh_pht LSFT A &lh_pht LGUI S &lh_pht LALT D &lh_pht LCTL F &kp G &kp H &kp I &kp J &kp K &kp L &kp SEMI - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + // position 0 pos 1 pos 2 pos 3 pos 4 pos 5 pos 6 pos 7 pos 8 pos 9 pos 10 + &lh_pht LSFT A &lh_pht LGUI S &lh_pht LALT D &lh_pht LCTL F &kp G &kp H &kp I &kp J &kp K &kp L &kp SEMI + >; + }; + }; }; ``` @@ -186,26 +186,26 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - hm: homerow_mods { - compatible = "zmk,behavior-hold-tap"; - label = "HOMEROW_MODS"; - #binding-cells = <2>; - tapping-term-ms = <150>; - quick-tap-ms = <0>; - flavor = "tap-preferred"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + hm: homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <150>; + quick-tap-ms = <0>; + flavor = "tap-preferred"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &hm LCTRL A &hm LGUI S &hm LALT D &hm LSHIFT F - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &hm LCTRL A &hm LGUI S &hm LALT D &hm LSHIFT F + >; + }; + }; }; ``` @@ -216,26 +216,26 @@ The following are suggested hold-tap configurations that work well with home row #include / { - behaviors { - bhm: balanced_homerow_mods { - compatible = "zmk,behavior-hold-tap"; - label = "HOMEROW_MODS"; - #binding-cells = <2>; - tapping-term-ms = <200>; // <---[[moderate duration]] - quick-tap-ms = <0>; - flavor = "balanced"; - bindings = <&kp>, <&kp>; - }; - }; + behaviors { + bhm: balanced_homerow_mods { + compatible = "zmk,behavior-hold-tap"; + label = "HOMEROW_MODS"; + #binding-cells = <2>; + tapping-term-ms = <200>; // <---[[moderate duration]] + quick-tap-ms = <0>; + flavor = "balanced"; + bindings = <&kp>, <&kp>; + }; + }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &bhm LCTRL A &bhm LGUI S &bhm LALT D &bhm LSHIFT F - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &bhm LCTRL A &bhm LGUI S &bhm LALT D &bhm LSHIFT F + >; + }; + }; }; ``` @@ -264,14 +264,14 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr }; }; - keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys - >; - }; - }; + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + AS(Q) AS(W) AS(E) AS(R) AS(T) AS(Y) // Autoshift applied for QWERTY keys + >; + }; + }; }; ``` @@ -300,14 +300,14 @@ This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) }; keymap { - compatible = "zmk,keymap"; - default_layer { - bindings = < - &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap - MO_TOG(3) // &mo 3 on hold, &tog 3 on tap - >; - }; - }; + compatible = "zmk,keymap"; + default_layer { + bindings = < + &mo_tog 2 1 // &mo 2 on hold, &tog 1 on tap + MO_TOG(3) // &mo 3 on hold, &tog 3 on tap + >; + }; + }; }; ``` diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md index 0818aaae..cf793089 100644 --- a/docs/docs/behaviors/layers.md +++ b/docs/docs/behaviors/layers.md @@ -105,29 +105,29 @@ Example: #define NONE 0 / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < + default_layer { + bindings = < &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS &kp NUMBER_7 &kp NUMBER_8 &kp NUMBER_9 &kp KP_PLUS &kp NUMBER_4 &kp NUMBER_5 &kp NUMBER_6 &kp KP_PLUS &kp NUMBER_1 &kp NUMBER_2 &kp NUMBER_3 &kp RETURN &kp NUMBER_0 &kp NUMBER_0 &kp DOT &kp RETURN - >; - }; + >; + }; - nav_layer { - bindings = < + nav_layer { + bindings = < &tog NAVI &kp KP_DIVIDE &kp KP_MULTIPLY &kp KP_MINUS &kp HOME &kp UP &kp PAGE_UP &kp KP_PLUS &kp LEFT &none &kp RIGHT &kp KP_PLUS &kp END &kp DOWN &kp PAGE_DOWN &kp RETURN &kp INSERT &kp INSERT &kp DEL &kp RETURN >; - }; - }; + }; + }; }; ``` diff --git a/docs/docs/behaviors/tap-dance.md b/docs/docs/behaviors/tap-dance.md index 65d5e765..c68b51dc 100644 --- a/docs/docs/behaviors/tap-dance.md +++ b/docs/docs/behaviors/tap-dance.md @@ -42,25 +42,25 @@ This example configures a tap-dance named `td0` that outputs the number of times #include / { - behaviors { - td0: tap_dance_0 { + behaviors { + td0: tap_dance_0 { compatible = "zmk,behavior-tap-dance"; label = "TAP_DANCE_0"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&kp N1>, <&kp N2>, <&kp N3>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &td0 - >; - }; - }; + default_layer { + bindings = < + &td0 + >; + }; + }; }; ``` @@ -83,25 +83,25 @@ This example configures a mod-tap inside a tap-dance named `td_mt` that outputs #include / { - behaviors { - td_mt: tap_dance_mod_tap { + behaviors { + td_mt: tap_dance_mod_tap { compatible = "zmk,behavior-tap-dance"; label = "TAP_DANCE_MOD_TAP"; #binding-cells = <0>; tapping-term-ms = <200>; bindings = <&mt LSHIFT CAPSLOCK>, <&kp LCTRL>; }; - }; + }; - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - bindings = < - &td_mt - >; - }; - }; + default_layer { + bindings = < + &td_mt + >; + }; + }; }; ``` diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 51fd45b7..1ff1bfa0 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -116,14 +116,14 @@ Devicetree files look like this: ```devicetree / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - }; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + }; }; ``` @@ -167,9 +167,9 @@ If the node you want to edit doesn't have a label, you can also write a new tree ```devicetree / { - kscan { - debounce-press-ms = <0>; - }; + kscan { + debounce-press-ms = <0>; + }; }; ``` @@ -244,7 +244,7 @@ Example: some-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>, <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + ; ``` #### path diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index 6d026f2b..0d70aa3b 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -367,15 +367,15 @@ For the purpose of this section, we will discuss the structure of `app/dts/behav #include / { - behaviors { - /omit-if-no-ref/ gresc: grave_escape { - compatible = "zmk,behavior-mod-morph"; - label = "GRAVE_ESCAPE"; - #binding-cells = <0>; - bindings = <&kp ESC>, <&kp GRAVE>; + behaviors { + /omit-if-no-ref/ gresc: grave_escape { + compatible = "zmk,behavior-mod-morph"; + label = "GRAVE_ESCAPE"; + #binding-cells = <0>; + bindings = <&kp ESC>, <&kp GRAVE>; mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; - }; - }; + }; + }; }; ``` diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 62d71f03..18616923 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -55,7 +55,7 @@ The `Kconfig.shield` file defines any additional Kconfig settings that may be re ``` config SHIELD_MY_BOARD - def_bool $(shields_list_contains,my_board) + def_bool $(shields_list_contains,my_board) ``` This will make sure that a new configuration value named `SHIELD_MY_BOARD` is set to true whenever `my_board` is used as the shield name, either as the `SHIELD` variable [in a local build](build-flash.md) or in your `build.yaml` file [when using Github Actions](../customization). Note that this configuration value will be used in `Kconfig.defconfig` to set other properties about your shield, so make sure that they match. @@ -64,10 +64,10 @@ This will make sure that a new configuration value named `SHIELD_MY_BOARD` is se ``` config SHIELD_MY_BOARD_LEFT - def_bool $(shields_list_contains,my_board_left) + def_bool $(shields_list_contains,my_board_left) config SHIELD_MY_BOARD_RIGHT - def_bool $(shields_list_contains,my_board_right) + def_bool $(shields_list_contains,my_board_right) ``` ### Kconfig.defconfig @@ -87,7 +87,7 @@ The keyboard name must be less than or equal to 16 characters in length, otherwi if SHIELD_MY_BOARD config ZMK_KEYBOARD_NAME - default "My Board" + default "My Board" endif ``` @@ -101,17 +101,17 @@ Finally, you'll want to turn on the split option for both sides. This can all be if SHIELD_MY_BOARD_LEFT config ZMK_KEYBOARD_NAME - default "My Board" + default "My Board" config ZMK_SPLIT_ROLE_CENTRAL - default y + default y endif if SHIELD_MY_BOARD_LEFT || SHIELD_MY_BOARD_RIGHT config ZMK_SPLIT - default y + default y endif ``` @@ -134,13 +134,13 @@ this might look something like: ``` / { - chosen { - zmk,kscan = &kscan0; - }; + chosen { + zmk,kscan = &kscan0; + }; - kscan0: kscan_0 { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; diode-direction = "col2row"; col-gpios @@ -149,12 +149,12 @@ this might look something like: , <&pro_micro 16 GPIO_ACTIVE_HIGH> ; - row-gpios - = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + row-gpios + = <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; + ; + }; }; ``` @@ -174,43 +174,43 @@ For `col2row` directed boards like the iris, the shared .dtsi file may look like #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <16>; - rows = <4>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <4>; // | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | // | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | // | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | // | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | // | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | - map = < + map = < RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,2) RC(4,9) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) - >; - }; + RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) + >; + }; - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; - diode-direction = "col2row"; - row-gpios - = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A from the schematic file - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B from the schematic file - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C from the schematic file - , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D from the schematic file - , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row E from the schematic file - ; + diode-direction = "col2row"; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row A from the schematic file + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row B from the schematic file + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row C from the schematic file + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row D from the schematic file + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // Row E from the schematic file + ; - }; + }; }; ``` @@ -230,14 +230,14 @@ This is exemplified with the iris .overlay files. #include "iris.dtsi" // Notice that the main dtsi files are included in the overlay. &kscan0 { - col-gpios - = <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic - , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic - , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic - , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic - , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic - , <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic - ; + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + ; }; ``` @@ -247,18 +247,18 @@ This is exemplified with the iris .overlay files. #include "iris.dtsi" &default_transform { // The matrix transform for this board is 6 columns over because the left half is 6 columns wide according to the matrix. - col-offset = <6>; + col-offset = <6>; }; &kscan0 { - col-gpios - = <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic - , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic - , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic - , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic - , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic - , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic - ; + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> // col6 in the schematic + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col5 in the schematic + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col4 in the schematic + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col3 in the schematic + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col2 in the schematic + , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col1 in the schematic + ; }; ``` @@ -316,28 +316,28 @@ Here is an example for the [nice60](https://github.com/Nicell/nice60), which use #include / { - chosen { - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <8>; - rows = <8>; + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <8>; // | MX1 | MX2 | MX3 | MX4 | MX5 | MX6 | MX7 | MX8 | MX9 | MX10 | MX11 | MX12 | MX13 | MX14 | // | MX15 | MX16 | MX17 | MX18 | MX19 | MX20 | MX21 | MX22 | MX23 | MX34 | MX25 | MX26 | MX27 | MX28 | // | MX29 | MX30 | MX31 | MX32 | MX33 | MX34 | MX35 | MX36 | MX37 | MX38 | MX39 | MX40 | MX41 | // | MX42 | MX43 | MX44 | MX45 | MX46 | MX47 | MX48 | MX49 | MX50 | MX51 | MX52 | MX53 | // | MX54 | MX55 | MX56 | MX57 | MX58 | MX59 | MX60 | MX61 | - map = < + map = < RC(3,0) RC(2,0) RC(1,0) RC(0,0) RC(1,1) RC(0,1) RC(0,2) RC(1,3) RC(0,3) RC(1,4) RC(0,4) RC(0,5) RC(1,6) RC(1,7) RC(4,0) RC(4,1) RC(3,1) RC(2,1) RC(2,2) RC(1,2) RC(2,3) RC(3,4) RC(2,4) RC(2,5) RC(1,5) RC(2,6) RC(2,7) RC(3,7) RC(5,0) RC(5,1) RC(5,2) RC(4,2) RC(3,2) RC(4,3) RC(3,3) RC(4,4) RC(4,5) RC(3,5) RC(4,6) RC(3,6) RC(4,7) RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(5,3) RC(6,4) RC(5,4) RC(6,5) RC(5,5) RC(6,6) RC(5,6) RC(5,7) RC(7,0) RC(7,1) RC(7,2) RC(7,3) RC(7,5) RC(7,6) RC(6,7) RC(7,7) - >; - }; + >; + }; ``` Some important things to note: @@ -433,13 +433,13 @@ In your device tree file you will need to add the following lines to define the ``` left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = ; - b-gpios = ; - resolution = <4>; - status = "disabled"; - }; + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = ; + b-gpios = ; + resolution = <4>; + status = "disabled"; + }; ``` Here you will have to replace PIN_A and PIN_B with the appropriate pins that your PCB utilizes for the encoder(s). For keyboards that use the Pro Micro or any of the Pro Micro replacements, Sparkfun's [Pro Micro Hookup Guide](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro) has a pinout diagram that can be useful to determine the right pins. Reference either the blue numbers labeled "Arduino" (digital pins) or the green numbers labeled "Analog" (analog pins). For pins that are labeled as both digital and analog, refer to your specific board's .dtsi file to determine how you should refer to that pin. @@ -450,9 +450,9 @@ Once you have defined the encoder sensors, you will have to add them to the list ``` sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; ``` In this example, a left_encoder and right_encoder are both added. Additional encoders can be added with spaces separating each, and the order they are added here determines the order in which you define their behavior in your keymap. @@ -463,7 +463,7 @@ Add the following lines to your overlay file(s) to enable the encoder: ``` &left_encoder { - status = "okay"; + status = "okay"; }; ``` diff --git a/docs/docs/features/backlight.md b/docs/docs/features/backlight.md index 03d206f1..717361a2 100644 --- a/docs/docs/features/backlight.md +++ b/docs/docs/features/backlight.md @@ -62,9 +62,9 @@ Then you have to add the following lines to your `.dts` file: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; - /* ch0-inverted; */ + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ }; ``` @@ -84,7 +84,7 @@ Then you have to add the following lines inside the root devicetree node on the label = "Backlight LEDs"; pwm_led_0 { pwms = <&pwm0 45>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -129,9 +129,9 @@ Then add the following lines to your `.overlay` file: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; - /* ch0-inverted; */ + status = "okay"; + ch0-pin = <45>; + /* ch0-inverted; */ }; ``` @@ -151,7 +151,7 @@ Then you have to add the following lines inside the root devicetree node on the label = "Backlight LEDs"; pwm_led_0 { pwms = <&pwm0 45>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -182,7 +182,7 @@ Optionally, on Pro Micro compatible shields you can add a LED GPIO node to your label = "Backlight LEDs"; gpio_led_0 { gpios = <&pro_micro 20 GPIO_ACTIVE_HIGH>; - label = "Backlight LED 0"; + label = "Backlight LED 0"; }; }; }; @@ -201,10 +201,10 @@ In order to do that, first you need to enable PWM for each pin: ``` &pwm0 { - status = "okay"; - ch0-pin = <45>; /* LED 0 */ - ch1-pin = <46>; /* LED 1 */ - ch2-pin = <47>; /* LED 2 */ + status = "okay"; + ch0-pin = <45>; /* LED 0 */ + ch1-pin = <46>; /* LED 1 */ + ch2-pin = <47>; /* LED 2 */ ... }; ``` diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 09191896..44313cc1 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -12,14 +12,14 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod ``` / { - combos { - compatible = "zmk,combos"; - combo_esc { - timeout-ms = <50>; - key-positions = <0 1>; - bindings = <&kp ESC>; - }; - }; + combos { + compatible = "zmk,combos"; + combo_esc { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp ESC>; + }; + }; }; ``` diff --git a/docs/docs/features/keymaps.md b/docs/docs/features/keymaps.md index 6d4e5f2c..93c2c825 100644 --- a/docs/docs/features/keymaps.md +++ b/docs/docs/features/keymaps.md @@ -113,10 +113,10 @@ Nested under the devicetree root, is the keymap node. The node _name_ itself is ``` keymap { - compatible = "zmk,keymap"; + compatible = "zmk,keymap"; // Layer nodes go here! - }; + }; ``` ### Layers diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index c1dc68d3..00d3aa0a 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -60,18 +60,18 @@ Here's an example on a definition that uses P0.06: #include &pinctrl { - spi3_default: spi3_default { - group1 { - psels = ; - }; - }; + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; - spi3_sleep: spi3_sleep { - group1 { - psels = ; - low-power-enable; - }; - }; + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; }; &spi3 { @@ -149,9 +149,9 @@ Once you have your `led_strip` properly defined you need to add it to the root d ``` / { - chosen { - zmk,underglow = &led_strip; - }; + chosen { + zmk,underglow = &led_strip; + }; }; ``` diff --git a/docs/docs/keymap-example-file.md b/docs/docs/keymap-example-file.md index cb20cb6d..d8d201af 100644 --- a/docs/docs/keymap-example-file.md +++ b/docs/docs/keymap-example-file.md @@ -3,24 +3,24 @@ #include / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | // | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | - bindings = < + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; }; ``` diff --git a/docs/docs/keymap-example.md b/docs/docs/keymap-example.md index 9d751f59..47d1c06b 100644 --- a/docs/docs/keymap-example.md +++ b/docs/docs/keymap-example.md @@ -1,21 +1,21 @@ ``` - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { + default_layer { // -------------------------------------------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | CTRL+A | CTRL+C | | CTRL+V | CTRL+X | N | M | , | . | / | R CTRL | // | GUI | DEL | RETURN | SPACE | ESCAPE | | RETURN | SPACE | TAB | BSPC | R ALT | - bindings = < + bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHIFT &kp Z &kp X &kp C &kp V &kp B &kp LC(A) &kp LC(C) &kp LC(V) &kp LC(X) &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT - >; + >; - sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; - }; - }; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; ``` From 5b07c86d05a81a82d4fd72ad29d3daa846a2b458 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:00:12 -0500 Subject: [PATCH 335/494] chore: Update Prettier Added a workaround to select the latest version of Prettier with pre-commit, since the pre-commit mirror repo started tracking alpha releases and doesn't have anything beyond 2.7.1. --- .pre-commit-config.yaml | 3 +++ app/package-lock.json | 14 +++++++------- app/package.json | 2 +- docs/package-lock.json | 14 +++++++------- docs/package.json | 2 +- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1375a6ae..e0666ea8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,6 +15,9 @@ repos: rev: v2.7.1 hooks: - id: prettier + # Workaround for https://github.com/pre-commit/mirrors-prettier/issues/29 + additional_dependencies: + - prettier@2.8.7 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: diff --git a/app/package-lock.json b/app/package-lock.json index ed8765f3..060fcba0 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -9,13 +9,13 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "prettier": "^2.7.1" + "prettier": "^2.8.7" } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -30,9 +30,9 @@ }, "dependencies": { "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true } } diff --git a/app/package.json b/app/package.json index 9ad28788..e1a7957f 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,6 @@ }, "homepage": "https://zmk.dev/", "devDependencies": { - "prettier": "^2.7.1" + "prettier": "^2.8.7" } } diff --git a/docs/package-lock.json b/docs/package-lock.json index c7333cb3..2c8a7fba 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -39,7 +39,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^2.7.1", + "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" @@ -12201,9 +12201,9 @@ } }, "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -24678,9 +24678,9 @@ "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "dev": true }, "pretty-error": { diff --git a/docs/package.json b/docs/package.json index 95d47b9f..70105b54 100644 --- a/docs/package.json +++ b/docs/package.json @@ -58,7 +58,7 @@ "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", - "prettier": "^2.7.1", + "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^4.6.3", "webpack": "^5.72.1" From 7a352908eebdc84aca905a83a22e27748154ad0d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 11:37:42 -0500 Subject: [PATCH 336/494] docs: Add pre-commit documentation --- docs/docs/development/pre-commit.md | 37 +++++++++++++++++++++++++++++ docs/sidebars.js | 1 + 2 files changed, 38 insertions(+) create mode 100644 docs/docs/development/pre-commit.md diff --git a/docs/docs/development/pre-commit.md b/docs/docs/development/pre-commit.md new file mode 100644 index 00000000..b4306fc9 --- /dev/null +++ b/docs/docs/development/pre-commit.md @@ -0,0 +1,37 @@ +--- +title: Pre-commit +--- + +ZMK uses [pre-commit](https://pre-commit.com/) to check for common errors and make sure the codebase is formatted consistently. + +Pre-commit is run on every pull request. You can also install it locally to get the same checks run on every commit you make _before_ you submit a pull request. + +## Installing pre-commit + +Open a terminal and run: + +```bash +pip3 install pre-commit +``` + +If this doesn't work, make sure [Python](https://www.python.org/) is installed and try again. + +## Enabling Commit Hooks + +Now that pre-commit is installed on your PC, you need to install it into the ZMK repo to enable it. Open a terminal to the ZMK repo directory and run: + +```bash +pre-commit install +``` + +This should print a message such as + +``` +pre-commit installed at .git\hooks\pre-commit +``` + +Pre-commit will now automatically check your changes whenever you run `git commit`. If it detects a problem, it will describe the problem and cancel the commit. For simple problems such as incorrect formatting, it will also automatically fix the files so you can just `git add` them and try again. + +## Automatically Enabling pre-commit + +Pre-commit can be configured to automatically install itself into any newly cloned repository, so you don't have to remember to run `pre-commit install`. See the [pre-commit documentation](https://pre-commit.com/#automatically-enabling-pre-commit-on-repositories) for instructions. diff --git a/docs/sidebars.js b/docs/sidebars.js index 21585747..43f17b41 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -71,6 +71,7 @@ module.exports = { ], Development: [ "development/clean-room", + "development/pre-commit", "development/documentation", "development/setup", "development/build-flash", From de152fe7419b8a02ca8a1723c3487dba69da3969 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Apr 2023 23:51:40 -0700 Subject: [PATCH 337/494] fix(bluetooth): Revert to Legacy LLCP * Reports of constant/frequent disconnects, with HCI err 0x28, "instant passed", seem linked to newer LLCP that became default in Zephyr 3.2, so revert to the Legacy LLCP for now until a proper fix for new LLCP can be found. --- app/Kconfig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 25a99b55..32b708e8 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -120,6 +120,11 @@ menuconfig ZMK_BLE if ZMK_BLE +choice BT_LL_SW_LLCP_IMPL + default BT_LL_SW_LLCP_LEGACY + +endchoice + config SYSTEM_WORKQUEUE_STACK_SIZE default 4096 if SOC_RP2040 default 2048 From e52e734480816d269ecedb5bac6a3703577e6c02 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 25 Apr 2023 05:51:04 +0000 Subject: [PATCH 338/494] chore: Fix formatting of Kconfig setting. --- app/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 32b708e8..d1b6682f 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -121,7 +121,7 @@ menuconfig ZMK_BLE if ZMK_BLE choice BT_LL_SW_LLCP_IMPL - default BT_LL_SW_LLCP_LEGACY + default BT_LL_SW_LLCP_LEGACY endchoice From db08e041c64d1a2b232bca9f728c02cde3907860 Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Tue, 25 Apr 2023 18:37:33 +0100 Subject: [PATCH 339/494] feat(boards): Polarity works CKP Series Adds support for the CKP family of boards BT60V2 ANSIHotswap, ISO Hotswap, ANSI Lowpro and soldered BT65 ANSI Hotswap, ISO Hotswap and soldered BT75 ANSI Hotswap and soldered The BT65 and BT75 are stylised as btXX_v1 in order to maintain compatibility with customers existing zmk-config setups in the same way the BT60 V1 was handled when merged into main. CKP boards have identical pinmapping between hotswap and soldered so there's only one set of defconfig, dts, keymap, yaml and yml files per size --- app/boards/arm/ckp/Kconfig | 8 + app/boards/arm/ckp/Kconfig.board | 16 ++ app/boards/arm/ckp/Kconfig.defconfig | 34 +++++ app/boards/arm/ckp/board.cmake | 4 + app/boards/arm/ckp/bt60_v2.dts | 71 +++++++++ app/boards/arm/ckp/bt60_v2.keymap | 177 ++++++++++++++++++++++ app/boards/arm/ckp/bt60_v2.yaml | 15 ++ app/boards/arm/ckp/bt60_v2.zmk.yml | 14 ++ app/boards/arm/ckp/bt60_v2_defconfig | 38 +++++ app/boards/arm/ckp/bt65_v1.dts | 71 +++++++++ app/boards/arm/ckp/bt65_v1.keymap | 177 ++++++++++++++++++++++ app/boards/arm/ckp/bt65_v1.yaml | 15 ++ app/boards/arm/ckp/bt65_v1.zmk.yml | 14 ++ app/boards/arm/ckp/bt65_v1_defconfig | 38 +++++ app/boards/arm/ckp/bt75_v1.dts | 61 ++++++++ app/boards/arm/ckp/bt75_v1.keymap | 148 ++++++++++++++++++ app/boards/arm/ckp/bt75_v1.yaml | 15 ++ app/boards/arm/ckp/bt75_v1.zmk.yml | 14 ++ app/boards/arm/ckp/bt75_v1_defconfig | 38 +++++ app/boards/arm/ckp/ckp-pinctrl.dtsi | 31 ++++ app/boards/arm/ckp/ckp.dtsi | 217 +++++++++++++++++++++++++++ 21 files changed, 1216 insertions(+) create mode 100644 app/boards/arm/ckp/Kconfig create mode 100644 app/boards/arm/ckp/Kconfig.board create mode 100644 app/boards/arm/ckp/Kconfig.defconfig create mode 100644 app/boards/arm/ckp/board.cmake create mode 100644 app/boards/arm/ckp/bt60_v2.dts create mode 100644 app/boards/arm/ckp/bt60_v2.keymap create mode 100644 app/boards/arm/ckp/bt60_v2.yaml create mode 100644 app/boards/arm/ckp/bt60_v2.zmk.yml create mode 100644 app/boards/arm/ckp/bt60_v2_defconfig create mode 100644 app/boards/arm/ckp/bt65_v1.dts create mode 100644 app/boards/arm/ckp/bt65_v1.keymap create mode 100644 app/boards/arm/ckp/bt65_v1.yaml create mode 100644 app/boards/arm/ckp/bt65_v1.zmk.yml create mode 100644 app/boards/arm/ckp/bt65_v1_defconfig create mode 100644 app/boards/arm/ckp/bt75_v1.dts create mode 100644 app/boards/arm/ckp/bt75_v1.keymap create mode 100644 app/boards/arm/ckp/bt75_v1.yaml create mode 100644 app/boards/arm/ckp/bt75_v1.zmk.yml create mode 100644 app/boards/arm/ckp/bt75_v1_defconfig create mode 100644 app/boards/arm/ckp/ckp-pinctrl.dtsi create mode 100644 app/boards/arm/ckp/ckp.dtsi diff --git a/app/boards/arm/ckp/Kconfig b/app/boards/arm/ckp/Kconfig new file mode 100644 index 00000000..7baf1486 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/Kconfig.board b/app/boards/arm/ckp/Kconfig.board new file mode 100644 index 00000000..a98a3167 --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.board @@ -0,0 +1,16 @@ +# CKP boards configuration + +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_BT60_V2 + bool "bt60_v2" + depends on SOC_NRF52840_QIAA + +config BOARD_BT65_V1 + bool "bt65_v1" + depends on SOC_NRF52840_QIAA + +config BOARD_BT75_V1 + bool "bt75_v1" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/ckp/Kconfig.defconfig b/app/boards/arm/ckp/Kconfig.defconfig new file mode 100644 index 00000000..d5bf4ded --- /dev/null +++ b/app/boards/arm/ckp/Kconfig.defconfig @@ -0,0 +1,34 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD + default "bt60_v2" if BOARD_BT60_V2 + default "bt65_v1" if BOARD_BT65_V1 + default "bt75_v1" if BOARD_BT75_V1 +config ZMK_KEYBOARD_NAME + default "BT60 V2" if BOARD_BT60_V2 + default "BT65" if BOARD_BT65_V1 + default "BT75" if BOARD_BT75_V1 + +if BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +endif # BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/board.cmake b/app/boards/arm/ckp/board.cmake new file mode 100644 index 00000000..b7feee2e --- /dev/null +++ b/app/boards/arm/ckp/board.cmake @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/ckp/bt60_v2.dts b/app/boards/arm/ckp/bt60_v2.dts new file mode 100644 index 00000000..19f92287 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.dts @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT60_V2"; + compatible = "polarityworks,bt60_v2"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) + >; + }; + + hhkb_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,11) RC(5,12) RC(5,13) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt60_v2.keymap b/app/boards/arm/ckp/bt60_v2.keymap new file mode 100644 index 00000000..eeb5c96e --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.keymap @@ -0,0 +1,177 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U +//#define HHKB + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | + // | SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | | + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP|RGB_TOG| BOOT | + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| B | N | M | , | END | PGDN | BL_TOG | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET |BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &rgb_ug RGB_TOG &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHFT |NONE| Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | + // | CTL | WIN | ALT | SPACE | RALT| CTRL | LEFT | DOWN | RIGHT | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1 + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BKSP | DEL | + // | TAB | Q | W | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG | + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHFT |NONE|VOLDN|VOLUP|MUTE|BLINC|BLDEC| N | M | , | END | PGDN | SHFT|BL_TOG| 1 | + // | BT_PRV| BT_NXT| ALT | SPACE | RALT| CTRL | LEFT |RESET| BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &none &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &trans &bl BL_TOG &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &sys_reset &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | + // ------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // ------------------------------------------------------------------------------------------ + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | + // | SHFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG | + // | BT_PRV | BT_NXT | ALT | SPACE | RESET | 1 | BT_CLR | + // ------------------------------------------------------------------------------------------ + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG + &bt BT_PRV &bt BT_NXT &trans &trans &sys_reset &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt60_v2.yaml b/app/boards/arm/ckp/bt60_v2.yaml new file mode 100644 index 00000000..2a3f3b47 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.yaml @@ -0,0 +1,15 @@ +identifier: bt60_v2 +name: BT60 V2 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt60_v2.zmk.yml b/app/boards/arm/ckp/bt60_v2.zmk.yml new file mode 100644 index 00000000..faf64205 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt60_v2 +name: BT60 V2 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt60_v2_defconfig b/app/boards/arm/ckp/bt60_v2_defconfig new file mode 100644 index 00000000..f6dc7e09 --- /dev/null +++ b/app/boards/arm/ckp/bt60_v2_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT60_V2=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/bt65_v1.dts b/app/boards/arm/ckp/bt65_v1.dts new file mode 100644 index 00000000..97d80da2 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.dts @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT65_V1"; + compatible = "polarityworks,bt65_v1"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + hhkb_transform: keymap_transform_3 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <5>; + map = < + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,11) RC(5,12) RC(5,13) RC(5,15) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt65_v1.keymap b/app/boards/arm/ckp/bt65_v1.keymap new file mode 100644 index 00000000..27411a71 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.keymap @@ -0,0 +1,177 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U +//#define HHKB + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #elif defined(HHKB) + zmk,matrix_transform = &hhkb_transform; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | HOME | END | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &kp HOME &kp END + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| + // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' |RESET| BOOT | P_BRK| + // |SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| B | N | M | , | . | / | SHIFT | HOME | END | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &kp HOME &kp END + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------------- + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------- + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &none &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp LALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BL_TOG|RGB_TOG|HOME| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // |SHIFT| NONE|VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / |SHIFT| NONE| UP | INS | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL| LEFT| DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &none &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans &kp INS + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(HHKB) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | HOME| + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | END | + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | PGUP| + // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL | PGDN| + // ------------------------------------------------------------------------------------------------ + bindings = < + + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp END + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp PG_UP + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp PG_DN + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | BL_TOG |RGB_TOG| + // | TAB | Q | UP | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | PSCRN| + // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | ; | ' | BOOT | P_BRK| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | INS | + // | BT_PRV | BT_NXT | ALT | SPACE | ALT | 1 | CTRL |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PSCRN + &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &kp PAUSE_BREAK + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &kp INS + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt65_v1.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt65_v1.yaml b/app/boards/arm/ckp/bt65_v1.yaml new file mode 100644 index 00000000..61edacce --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.yaml @@ -0,0 +1,15 @@ +identifier: bt65_v1 +name: BT65_V1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt65_v1.zmk.yml b/app/boards/arm/ckp/bt65_v1.zmk.yml new file mode 100644 index 00000000..f82253b0 --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt65_v1 +name: BT65 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt65_v1_defconfig b/app/boards/arm/ckp/bt65_v1_defconfig new file mode 100644 index 00000000..e40ae2db --- /dev/null +++ b/app/boards/arm/ckp/bt65_v1_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT65_V1=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/bt75_v1.dts b/app/boards/arm/ckp/bt75_v1.dts new file mode 100644 index 00000000..42aaf351 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.dts @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include "ckp.dtsi" + + +/ { + model = "BT75_V1"; + compatible = "polarityworks,bt75_v1"; + + chosen { + zmk,matrix_transform = &ansi_transform; + }; + + + ansi_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + iso_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; + + all_1u_transform: keymap_transform_2 { + compatible = "zmk,matrix-transform"; + columns = <16>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) RC(0,15) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) RC(1,15) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) RC(2,15) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,15) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) RC(4,14) RC(4,15) + RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13) RC(5,14) RC(5,15) + >; + }; +}; diff --git a/app/boards/arm/ckp/bt75_v1.keymap b/app/boards/arm/ckp/bt75_v1.keymap new file mode 100644 index 00000000..5c95387a --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.keymap @@ -0,0 +1,148 @@ +#include +#include +#include +#include +#include + +#define ANSI +//#define ISO +//#define ALL_1U + +/ { + chosen { + #ifdef ANSI + zmk,matrix_transform = &ansi_transform; + #elif defined(ISO) + zmk,matrix_transform = &iso_transform; + #elif defined(ALL_1U) + zmk,matrix_transform = &all_1u_transform; + #else + #error "Layout not defined, please define a layout using by uncommenting the appropriate line in bt75_v1.keymap" + #endif + }; + + keymap { + compatible = "zmk,keymap"; + #ifdef ANSI + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | P_BRK| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | PG_UP| + // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | UP | PG_DN| + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &kp PAUSE_BREAK + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &trans + &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ISO) + default_layer { + // ------------------------------------------------------------------------------------------------ + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| + // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------ + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP + &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BL_TOG |RGB_TOG| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | | P_BRK| + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' |RESET| BOOT | PG_UP| + // |SHIFT | \ |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / | SHIFT | UP | PG_DN| + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL | LEFT | DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bl BL_TOG &rgb_ug RGB_TOG + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &kp PAUSE_BREAK + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans + &trans &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #elif defined(ALL_1U) + default_layer { + // ------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| + // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | + // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| + // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| + // | CTL | WIN | ALT | SPACE | ALT | 1 |RCTRL| LEFT| DOWN|RIGHT| + // ------------------------------------------------------------------------------------------------- + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp PAUSE_BREAK &kp INS + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL &kp HOME + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp END + &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP + &kp LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &none &kp UP &kp PG_DN + &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp LALT &mo 1 &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + raise { + // -------------------------------------------------------------------------------------------------- + // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | + // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BL_TOG|RGB_TOG|HOME| + // | TAB | Q | W | E | HUI | HUD | Y | U | I | O | P | SLCK| ] | RESET | END | + // | CAPS | A | S | D | BRI | BRD | H | J | K | L | ; | ' | BOOT | PGUP | + // |SHIFT| NONE|VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | . | / |SHIFT| NONE| UP | PGDN | + // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | CTRL| LEFT| DOWN |BT_CLR| + // -------------------------------------------------------------------------------------------------- + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bl BL_TOG &rgb_ug RGB_TOG &trans + &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &trans &trans &trans &kp SLCK &trans &sys_reset &trans + &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &trans &trans &bootloader &trans + &trans &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &trans &trans &trans &trans &trans + &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + #else + #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt75.keymap" + #endif + + }; +}; diff --git a/app/boards/arm/ckp/bt75_v1.yaml b/app/boards/arm/ckp/bt75_v1.yaml new file mode 100644 index 00000000..e4faa09f --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.yaml @@ -0,0 +1,15 @@ +identifier: bt75_v1 +name: BT75_V1 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/ckp/bt75_v1.zmk.yml b/app/boards/arm/ckp/bt75_v1.zmk.yml new file mode 100644 index 00000000..76e30047 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: bt75_v1 +name: BT75_V1 +type: board +arch: arm +features: + - keys + - encoder + - underglow + - backlight +outputs: + - usb + - ble +url: https://polarityworks.com/btckp diff --git a/app/boards/arm/ckp/bt75_v1_defconfig b/app/boards/arm/ckp/bt75_v1_defconfig new file mode 100644 index 00000000..510d6994 --- /dev/null +++ b/app/boards/arm/ckp/bt75_v1_defconfig @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_BT75_V1=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y +CONFIG_PINCTRL=y + +# encoder +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_PWM=y +CONFIG_LED_PWM=y +CONFIG_ZMK_BACKLIGHT=y +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262 +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y diff --git a/app/boards/arm/ckp/ckp-pinctrl.dtsi b/app/boards/arm/ckp/ckp-pinctrl.dtsi new file mode 100644 index 00000000..87a8edc5 --- /dev/null +++ b/app/boards/arm/ckp/ckp-pinctrl.dtsi @@ -0,0 +1,31 @@ + +/* + * Copyright (c) 2022 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + pwm0_default: pwm0_default { + group1 { + psels = ; + }; + }; + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/ckp/ckp.dtsi b/app/boards/arm/ckp/ckp.dtsi new file mode 100644 index 00000000..6c52d620 --- /dev/null +++ b/app/boards/arm/ckp/ckp.dtsi @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2022 The ZMK Contributors +* +* SPDX-License-Identifier: MIT +*/ + +/dts-v1/; +#include + +#include +#include + +#include "ckp-pinctrl.dtsi" + +/ { + model = "CKP"; + compatible = "polarityworks,ckp"; + + chosen { + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zmk,kscan = &kscan0; + zmk,underglow = &led_strip; + zmk,backlight = &backlight; + zmk,battery = &vbatt; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&encoder_1>; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&gpio1 11 GPIO_ACTIVE_HIGH> + , <&gpio1 10 GPIO_ACTIVE_HIGH> + , <&gpio1 13 GPIO_ACTIVE_HIGH> + , <&gpio1 15 GPIO_ACTIVE_HIGH> + , <&gpio0 3 GPIO_ACTIVE_HIGH> + , <&gpio0 2 GPIO_ACTIVE_HIGH> + , <&gpio0 28 GPIO_ACTIVE_HIGH> + , <&gpio0 29 GPIO_ACTIVE_HIGH> + , <&gpio0 30 GPIO_ACTIVE_HIGH> + , <&gpio0 31 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio1 6 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>; + }; + + encoder_1: encoder_1 { + compatible = "alps,ec11"; + label = "ENCODER_ONE"; + a-gpios = <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + encoder_2: encoder_2 { + compatible = "alps,ec11"; + label = "ENCODER_TWO"; + a-gpios = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + encoder_3: encoder_3 { + compatible = "alps,ec11"; + label = "encoder_3"; + a-gpios = <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "okay"; + }; + + backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 0 10000 PWM_POLARITY_NORMAL>; + }; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; + + vbatt: vbatt { + compatible = "zmk,battery-voltage-divider"; + label = "VBATT"; + io-channels = <&adc 2>; + output-ohms = <100000>; + full-ohms = <(100000 + 100000)>; + }; +}; + +&adc { + status = "okay"; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; +}; + + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <12>; /* number of LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; From 9bd171ede44c6178068d1b3970474783fddc799f Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Mon, 24 Apr 2023 12:16:09 -0500 Subject: [PATCH 340/494] fix(docs): Add key to interconnect tabs Added a key property to interconnect tabs list items to fix a React warning. --- docs/src/components/interconnect-tabs.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/components/interconnect-tabs.tsx b/docs/src/components/interconnect-tabs.tsx index c7912793..3ef69ebf 100644 --- a/docs/src/components/interconnect-tabs.tsx +++ b/docs/src/components/interconnect-tabs.tsx @@ -15,7 +15,7 @@ function mapInterconnect(interconnect: Interconnect) { let imageUrl = require(`@site/docs/assets/interconnects/${interconnect.id}/pinout.png`); return ( - + From a6787b08c762c8bbb5966464e944a09b50595774 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 8 Apr 2023 20:21:40 +0000 Subject: [PATCH 341/494] refactor(underglow): Tad more logging. --- app/src/rgb_underglow.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 048b58b4..7b649174 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -190,7 +190,10 @@ static void zmk_rgb_underglow_tick(struct k_work *work) { break; } - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + int err = led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + if (err < 0) { + LOG_ERR("Failed to update the RGB strip (%d)", err); + } } K_WORK_DEFINE(underglow_work, zmk_rgb_underglow_tick); From ab65ffc11406cd693172d48d790ec5a43a9fc040 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 4 Nov 2022 15:50:41 -0700 Subject: [PATCH 342/494] refactor(boards): Fix Zen v2 DTS spacing inconsistencies --- app/boards/arm/corneish_zen/CMakeLists.txt | 4 +- app/boards/arm/corneish_zen/corneish_zen.dtsi | 5 +- .../arm/corneish_zen/corneish_zen.keymap | 71 ++++++++++--------- .../arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- .../corneish_zen/corneish_zen_v2_right.dts | 13 ++-- 5 files changed, 47 insertions(+), 48 deletions(-) diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt index 09820577..aedf38a7 100644 --- a/app/boards/arm/corneish_zen/CMakeLists.txt +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -4,7 +4,7 @@ if(CONFIG_ZMK_DISPLAY) target_sources_ifdef(CONFIG_CUSTOM_WIDGET_LAYER_STATUS app PRIVATE widgets/layer_status.c) target_sources_ifdef(CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS app PRIVATE widgets/peripheral_status.c) - add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) + add_subdirectory_ifdef(CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM widgets/icons) endif() zephyr_library() @@ -57,4 +57,4 @@ zephyr_library_include_directories(${ZEPHYR_BASE}/lib/gui/lvgl/) zephyr_library_sources_ifdef(CONFIG_ZMK_DISPLAY custom_status_screen.c) zephyr_library_sources(${ZEPHYR_BASE}/misc/empty_file.c) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) -zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index 10be54cc..fe2bfa92 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -50,7 +50,7 @@ // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | - map = < + map = < RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) @@ -60,7 +60,6 @@ }; - &adc { status = "okay"; }; @@ -123,4 +122,4 @@ reg = <0x000f4000 0x0000c000>; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen.keymap b/app/boards/arm/corneish_zen/corneish_zen.keymap index 2b9eeb14..24c925e8 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.keymap +++ b/app/boards/arm/corneish_zen/corneish_zen.keymap @@ -10,58 +10,59 @@ #include / { - chosen { - zmk,matrix_transform = &default_transform; - //zmk,matrix_transform = &five_column_transform; - }; + chosen { + zmk,matrix_transform = &default_transform; + // zmk,matrix_transform = &five_column_transform; + }; }; / { - keymap { - compatible = "zmk,keymap"; + keymap { + compatible = "zmk,keymap"; - default_layer { - label = "QWERTY"; -// ----------------------------------------------------------------------------------------- + default_layer { + label = "QWERTY"; +// -------------------------------------------------------------------------------- // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | GUI | LWR | SPC | | ENT | RSE | ALT | - bindings = < - &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC - &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC - &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT - >; - }; - lower_layer { - label = "NUMBER"; + bindings = < +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp ESC + &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp RALT + >; + }; + + lower_layer { + label = "NUMBER"; // ----------------------------------------------------------------------------------------- // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | SHFT | | | | | | | | | | | | | // | GUI | | SPC | | ENT | | ALT | - bindings = < - &kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC - &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans - &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT - >; - }; + bindings = < +&kp TAB &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans +&kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; + }; - raise_layer { - label = "SYMBOL"; + raise_layer { + label = "SYMBOL"; // ----------------------------------------------------------------------------------------- // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | GUI | | SPC | | ENT | | ALT | - bindings = < - &kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC - &kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE - &kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE - &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT - >; - }; + bindings = < +&kp TAB &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp BSPC +&kp LCTRL &trans &trans &trans &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp GRAVE +&kp LSHFT &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE &kp TILDE + &kp LGUI &trans &kp SPACE &kp RET &trans &kp RALT + >; }; -}; \ No newline at end of file + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index 9f3dd73a..d7b66ab7 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -72,7 +72,7 @@ }; }; -&spi0 { +&spi0 { status = "okay"; compatible = "nordic,nrf-spim"; pinctrl-0 = <&spi0_default>; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts index 3cb7556f..4d444cae 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right.dts @@ -33,16 +33,15 @@ , <&gpio1 9 GPIO_ACTIVE_HIGH> , <&gpio0 7 GPIO_ACTIVE_HIGH> ; - }; leds { - compatible = "gpio-leds"; - blue_led: led_0 { - gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - label = "Blue LED"; - }; + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; }; + }; vbatt: vbatt { compatible = "zmk,battery-voltage-divider"; @@ -56,6 +55,7 @@ &default_transform { col-offset = <6>; }; + &five_column_transform { col-offset = <6>; }; @@ -98,7 +98,6 @@ busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; pwr = [03 00 26 26]; - //softstart = [17 17 17 17]; cdi = <0xd2>; tcon = <0x22>; }; From 2c70048beeec6da864836f4981a6a8f954be95af Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 6 Nov 2022 14:19:27 -0800 Subject: [PATCH 343/494] refactor(boards): Remove duplicated Zen v2 Kconfigs and unused font size --- app/boards/arm/corneish_zen/Kconfig.defconfig | 1 - app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig | 4 ---- app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig | 4 ---- 3 files changed, 9 deletions(-) diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index a161230c..28177f53 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -44,7 +44,6 @@ endif # USB config ZMK_DISPLAY select LV_USE_CONT select LV_FONT_MONTSERRAT_26 - select LV_FONT_MONTSERRAT_20 select LV_FONT_MONTSERRAT_16 select LV_USE_LABEL select LV_USE_IMG diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 305ce72e..3b7b4d9e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -6,7 +6,6 @@ CONFIG_SOC_SERIES_NRF52X=y CONFIG_SOC_NRF52840_QIAA=y CONFIG_BOARD_CORNEISH_ZEN_V2_LEFT=y -CONFIG_ZMK_SPLIT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -20,7 +19,6 @@ CONFIG_PINCTRL=y CONFIG_GPIO=y # Enable SPI -CONFIG_SPI=y CONFIG_SPI_NRFX=y # Enable writing to flash @@ -40,8 +38,6 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 -CONFIG_SSD1306=n -CONFIG_IL0323=y CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index 0fd0fd6c..b361b08d 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -6,7 +6,6 @@ CONFIG_SOC_SERIES_NRF52X=y CONFIG_SOC_NRF52840_QIAA=y CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT=y -CONFIG_ZMK_SPLIT=y CONFIG_ZMK_SLEEP=y CONFIG_ZMK_DISPLAY=y @@ -20,7 +19,6 @@ CONFIG_PINCTRL=y CONFIG_GPIO=y # Enable SPI -CONFIG_SPI=y CONFIG_SPI_NRFX=y # Enable writing to flash @@ -40,8 +38,6 @@ CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 -CONFIG_SSD1306=n -CONFIG_IL0323=y CONFIG_LV_Z_BITS_PER_PIXEL=1 CONFIG_LV_COLOR_DEPTH_1=y CONFIG_LV_DPI_DEF=145 From 4a9c59317f33a1c29bce2f2d34eb3e653e43eb10 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 13 Nov 2022 21:47:13 -0800 Subject: [PATCH 344/494] refactor(boards): Add back default matrix transform to Zen v2 chosen node --- app/boards/arm/corneish_zen/corneish_zen.dtsi | 1 + 1 file changed, 1 insertion(+) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index fe2bfa92..daf58b31 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -22,6 +22,7 @@ zmk,display = &epd; zmk,battery = &vbatt; zephyr,console = &cdc_acm_uart; + zmk,matrix_transform = &default_transform; }; default_transform: keymap_transform_0 { From 39d7f86f7019b861fc6e84084a8ffd88ff63b064 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 17:48:39 -0800 Subject: [PATCH 345/494] refactor(boards): Make Zen dtsi non-v2 specific --- app/boards/arm/corneish_zen/corneish_zen.dtsi | 5 ++--- app/boards/arm/corneish_zen/corneish_zen_v2_left.dts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/boards/arm/corneish_zen/corneish_zen.dtsi b/app/boards/arm/corneish_zen/corneish_zen.dtsi index daf58b31..289c5e73 100644 --- a/app/boards/arm/corneish_zen/corneish_zen.dtsi +++ b/app/boards/arm/corneish_zen/corneish_zen.dtsi @@ -11,8 +11,8 @@ #include / { - model = "corneish_zen_v2"; - compatible = "corneish_zen_v2"; + model = "Corne-ish Zen"; + compatible = "corneish_zen"; chosen { zephyr,code-partition = &code_partition; @@ -20,7 +20,6 @@ zephyr,flash = &flash0; zmk,kscan = &kscan0; zmk,display = &epd; - zmk,battery = &vbatt; zephyr,console = &cdc_acm_uart; zmk,matrix_transform = &default_transform; }; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts index d7b66ab7..14d82e87 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left.dts @@ -20,7 +20,7 @@ diode-direction = "col2row"; row-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; From 0239f18b6180bc604b432f3b48a0d29961dc0111 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 16 Dec 2022 17:39:24 -0800 Subject: [PATCH 346/494] feat(boards): Add Corne-ish Zen v1 --- app/boards/arm/corneish_zen/CMakeLists.txt | 2 +- app/boards/arm/corneish_zen/Kconfig | 10 ++ app/boards/arm/corneish_zen/Kconfig.board | 14 +- app/boards/arm/corneish_zen/Kconfig.defconfig | 15 +- .../arm/corneish_zen/corneish_zen_v1.zmk.yml | 15 ++ .../arm/corneish_zen/corneish_zen_v1_left.dts | 123 ++++++++++++++++ .../corneish_zen_v1_left_defconfig | 76 ++++++++++ .../corneish_zen/corneish_zen_v1_right.dts | 131 ++++++++++++++++++ .../corneish_zen_v1_right_defconfig | 75 ++++++++++ 9 files changed, 455 insertions(+), 6 deletions(-) create mode 100644 app/boards/arm/corneish_zen/Kconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_left.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_right.dts create mode 100644 app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig diff --git a/app/boards/arm/corneish_zen/CMakeLists.txt b/app/boards/arm/corneish_zen/CMakeLists.txt index aedf38a7..afaaf6bf 100644 --- a/app/boards/arm/corneish_zen/CMakeLists.txt +++ b/app/boards/arm/corneish_zen/CMakeLists.txt @@ -47,7 +47,7 @@ if(CONFIG_ZMK_DISPLAY) zephyr_library_sources(widgets/icons/layers.c) zephyr_library_sources(widgets/icons/layers2.c) endif() - if(CONFIG_BOARD_CORNEISH_ZEN_V2_RIGHT) + if(NOT CONFIG_ZMK_SPLIT_ROLE_CENTRAL) zephyr_library_sources(widgets/icons/zenlogo.c) endif() endif() diff --git a/app/boards/arm/corneish_zen/Kconfig b/app/boards/arm/corneish_zen/Kconfig new file mode 100644 index 00000000..33d92609 --- /dev/null +++ b/app/boards/arm/corneish_zen/Kconfig @@ -0,0 +1,10 @@ +# +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT +# + +config BOARD_CORNEISH_ZEN_LEFT + bool + +config BOARD_CORNEISH_ZEN_RIGHT + bool diff --git a/app/boards/arm/corneish_zen/Kconfig.board b/app/boards/arm/corneish_zen/Kconfig.board index ca82e330..ffb3ab1f 100644 --- a/app/boards/arm/corneish_zen/Kconfig.board +++ b/app/boards/arm/corneish_zen/Kconfig.board @@ -3,10 +3,22 @@ # SPDX-License-Identifier: MIT # +config BOARD_CORNEISH_ZEN_V1_LEFT + bool "corneish zen left v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT + +config BOARD_CORNEISH_ZEN_V1_RIGHT + bool "corneish zen right v1" + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT + config BOARD_CORNEISH_ZEN_V2_LEFT bool "corneish zen left v2" depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_LEFT config BOARD_CORNEISH_ZEN_V2_RIGHT bool "corneish zen right v2" - depends on SOC_NRF52840_QIAA \ No newline at end of file + depends on SOC_NRF52840_QIAA + select BOARD_CORNEISH_ZEN_RIGHT diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index 28177f53..feab3eca 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -3,7 +3,7 @@ # SPDX-License-Identifier: MIT # -if BOARD_CORNEISH_ZEN_V2_LEFT +if BOARD_CORNEISH_ZEN_LEFT config ZMK_KEYBOARD_NAME default "Corne-ish Zen" @@ -11,10 +11,10 @@ config ZMK_KEYBOARD_NAME config ZMK_SPLIT_ROLE_CENTRAL default y -endif # BOARD_CORNEISH_ZEN_V2_LEFT +endif # BOARD_CORNEISH_ZEN_LEFT -if BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT +if BOARD_CORNEISH_ZEN_LEFT || BOARD_CORNEISH_ZEN_RIGHT config BOARD default "corneish_zen" @@ -77,4 +77,11 @@ menuconfig CUSTOM_WIDGET_LAYER_STATUS menuconfig CUSTOM_WIDGET_PERIPHERAL_STATUS bool "custom peripheral status widget" -endif # BOARD_CORNEISH_ZEN_V2_LEFT || BOARD_CORNEISH_ZEN_V2_RIGHT +endif # BOARD_CORNEISH_ZEN_LEFT || BOARD_CORNEISH_ZEN_RIGHT + +if BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT + +config BQ274XX + default y + +endif # BOARD_CORNEISH_ZEN_V1_LEFT || BOARD_CORNEISH_ZEN_V1_RIGHT diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml new file mode 100644 index 00000000..1f6be20d --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: corneish_zen_v1 +name: Corneish Zen v1 +url: https://lowprokb.ca/collections/keyboards/products/corne-ish-zen +type: board +arch: arm +features: + - keys + - display +outputs: + - usb + - ble +siblings: + - corneish_zen_v1_left + - corneish_zen_v1_right diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts new file mode 100644 index 00000000..399a564f --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left.dts @@ -0,0 +1,123 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &fuelgauge; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 31 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 30 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 5 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; +}; + +&pinctrl { + spi2_default: spi2_default { + group1 { + psels = , + , + ; + }; + }; + + spi2_sleep: spi2_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; + +&i2c0 { + status = "okay"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + clock-frequency = <100000>; + + fuelgauge: bq274xx@55 { + compatible = "ti,bq274xx"; + label = "BATTERY"; + reg = <0x55>; + design-voltage = <3700>; //Battery Design Volatge in mV + design-capacity = <180>; //Battery Design Capacity in mAh + taper-current = <2>; //Battery Taper current in mAh + terminate-voltage = <2750>; //Battery Terminate Voltage in mV + int-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; + }; +}; + +&spi2 { + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi2_default>; + pinctrl-1 = <&spi2_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio1 8 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig new file mode 100644 index 00000000..a71ac680 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig @@ -0,0 +1,76 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_LEFT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable I2C +CONFIG_I2C=y +CONFIG_I2C_NRFX=y + +# Enable SPI +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_OUTPUT_STATUS=y +CONFIG_ZMK_WIDGET_OUTPUT_STATUS=n +CONFIG_CUSTOM_WIDGET_LAYER_STATUS=y +CONFIG_ZMK_WIDGET_LAYER_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=65536 +#CONFIG_LOG_STRDUP_BUF_COUNT=160 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts new file mode 100644 index 00000000..d5f6e588 --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right.dts @@ -0,0 +1,131 @@ +/* +* +* Copyright (c) 2021 Darryl deHaan +* SPDX-License-Identifier: MIT +* +*/ + +#include "corneish_zen.dtsi" + +/{ + chosen { + zephyr,display = &epd; + zmk,battery = &fuelgauge; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + col-gpios + = <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + , <&gpio1 9 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + ; + }; + + leds { + compatible = "gpio-leds"; + blue_led: led_0 { + gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; + label = "Blue LED"; + }; + }; +}; + +&default_transform { + col-offset = <6>; +}; + +&five_column_transform { + col-offset = <6>; +}; + +&pinctrl { + spi2_default: spi2_default { + group1 { + psels = , + , + ; + }; + }; + + spi2_sleep: spi2_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; + +&i2c0 { + status = "okay"; + compatible = "nordic,nrf-twim"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + clock-frequency = <100000>; + + fuelgauge: bq274xx@55 { + compatible = "ti,bq274xx"; + label = "BATTERY"; + reg = <0x55>; + design-voltage = <3700>; //Battery Design Volatge in mV + design-capacity = <180>; //Battery Design Capacity in mAh + taper-current = <2>; //Battery Taper current in mAh 2.1 + terminate-voltage = <2750>; //Battery Terminate Voltage in mV + int-gpios = <&gpio1 5 GPIO_ACTIVE_LOW>; + }; +}; + +&spi2 { + status = "okay"; + compatible = "nordic,nrf-spim"; + pinctrl-0 = <&spi2_default>; + pinctrl-1 = <&spi2_sleep>; + pinctrl-names = "default", "sleep"; + cs-gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + + epd: il0323@0 { + compatible = "gooddisplay,il0323"; + reg = <0>; + label = "DISPLAY"; + width = <80>; + height = <128>; + spi-max-frequency = <4000000>; + dc-gpios = <&gpio0 15 GPIO_ACTIVE_LOW>; + busy-gpios = <&gpio0 14 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio0 25 GPIO_ACTIVE_LOW>; + pwr = [03 00 26 26]; + cdi = <0xd2>; + tcon = <0x22>; + }; +}; diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig new file mode 100644 index 00000000..f099392f --- /dev/null +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig @@ -0,0 +1,75 @@ +# +# Copyright (c) 2022 Darryl deHaan +# SPDX-License-Identifier: MIT +# + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_CORNEISH_ZEN_V1_RIGHT=y +CONFIG_ZMK_SLEEP=y +CONFIG_ZMK_DISPLAY=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable pinctrl +CONFIG_PINCTRL=y + +# enable GPIO +CONFIG_GPIO=y + +# Enable I2C +CONFIG_I2C=y +CONFIG_I2C_NRFX=y + +# Enable SPI +CONFIG_SPI_NRFX=y + +# Enable writing to flash +CONFIG_USE_DT_CODE_PARTITION=y +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y + +# enable display drivers +CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y +CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 +CONFIG_LV_Z_BITS_PER_PIXEL=1 +CONFIG_LV_COLOR_DEPTH_1=y +CONFIG_LV_DPI_DEF=145 +CONFIG_LV_Z_VDB_SIZE=100 +CONFIG_LV_USE_THEME_MONO=y +CONFIG_LV_COLOR_CHROMA_KEY_HEX=0x00FF00 +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_16=y +CONFIG_LV_FONT_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y + +# custom status screens +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_CUSTOM=y +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=n +CONFIG_CUSTOM_WIDGET_BATTERY_STATUS=y +CONFIG_ZMK_WIDGET_BATTERY_STATUS=n +CONFIG_CUSTOM_WIDGET_PERIPHERAL_STATUS=y +CONFIG_ZMK_WIDGET_PERIPHERAL_STATUS=n + +# Turn on logging, and set ZMK logging to debug output +#CONFIG_LOG=y +#CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS=8000 +#CONFIG_ZMK_USB_LOGGING=y +#CONFIG_ZMK_LOG_LEVEL_DBG=y +#CONFIG_LOG_BUFFER_SIZE=20000 +#CONFIG_LOG_STRDUP_BUF_COUNT=60 +#CONFIG_I2C_LOG_LEVEL_DBG=y +#CONFIG_SPI_LOG_LEVEL_DBG=y +#CONFIG_DISPLAY_LOG_LEVEL_DBG=y +#CONFIG_LVGL_LOG_LEVEL_DBG=y +#CONFIG_LVGL_USE_DEBUG=y +#CONFIG_SENSOR_LOG_LEVEL_DBG=y From 94789a092c6d8ddf5ab5ad88eb011a4ece6b5cee Mon Sep 17 00:00:00 2001 From: Alexander Krikun Date: Wed, 3 May 2023 23:16:33 +0400 Subject: [PATCH 347/494] fix(boards): unify board I2C configuration, use TWI driver --- app/boards/arm/bluemicro840/bluemicro840_v1.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_11.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_13.dts | 3 ++- app/boards/arm/nrfmicro/nrfmicro_13_52833.dts | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1.dts b/app/boards/arm/bluemicro840/bluemicro840_v1.dts index f1952601..05849001 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1.dts +++ b/app/boards/arm/bluemicro840/bluemicro840_v1.dts @@ -63,7 +63,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -71,6 +71,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11.dts b/app/boards/arm/nrfmicro/nrfmicro_11.dts index 68331edc..14b9adb9 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11.dts @@ -48,7 +48,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -56,6 +56,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts index 9977617c..874b67e2 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped.dts @@ -48,7 +48,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -56,6 +56,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13.dts b/app/boards/arm/nrfmicro/nrfmicro_13.dts index 300838ff..65674132 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13.dts @@ -61,7 +61,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -69,6 +69,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts index 86bcb5e5..cfe77e37 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833.dts @@ -61,7 +61,7 @@ }; &i2c0 { - compatible = "nordic,nrf-twim"; + compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; @@ -69,6 +69,7 @@ &uart0 { compatible = "nordic,nrf-uarte"; + current-speed = <115200>; pinctrl-0 = <&uart0_default>; pinctrl-1 = <&uart0_sleep>; pinctrl-names = "default", "sleep"; From 48be2eedd09d4918d25d8bcb8bcb58e51eff6060 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Wed, 10 May 2023 12:21:24 +0800 Subject: [PATCH 348/494] fix(docs): Update QMK debounce references --- docs/docs/features/debouncing.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/docs/features/debouncing.md b/docs/docs/features/debouncing.md index 9629131d..40170739 100644 --- a/docs/docs/features/debouncing.md +++ b/docs/docs/features/debouncing.md @@ -99,8 +99,6 @@ one millisecond of latency but protects against short noise spikes. ZMK's default debouncing is similar to QMK's `sym_defer_pk` algorithm. -Setting `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=0` for eager debouncing would be similar -to QMK's (unimplemented as of this writing) `asym_eager_defer_pk`. +Setting `CONFIG_ZMK_KSCAN_DEBOUNCE_PRESS_MS=0` for eager debouncing would be similar to QMK's `asym_eager_defer_pk`. -See [QMK's Debounce API documentation](https://beta.docs.qmk.fm/using-qmk/software-features/feature_debounce_type) -for more information. +See [QMK's Debounce API documentation](https://docs.qmk.fm/#/feature_debounce_type) for more information. From d53cd1992936dd5604b84cd4c02cfdfad4d9944a Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sat, 22 Apr 2023 23:47:42 -0500 Subject: [PATCH 349/494] refactor: Add format on save for VS Code Added settings to format various file types on save in VS Code. Added some recommended VS Code extensions: - Prettier for formatting various file types - Python for formatting Python files - C/C++ for formatting C files - Devicetree for syntax highlighting - CMake for syntax highlighting --- .vscode/extensions.json | 9 +++++++++ .vscode/settings.json | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..0819f71e --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "ms-python.python", + "ms-vscode.cpptools", + "plorefice.devicetree", + "twxs.cmake" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index aea29cf0..8bbff533 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,21 @@ "*.overlay": "dts", "*.keymap": "dts" }, - "python.formatting.provider": "black" + "python.formatting.provider": "black", + "[c]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-vscode.cpptools" + }, + "[javascript][javascriptreact][typescript][typescriptreact]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[python]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "ms-python.python" + }, + "[css][json][jsonc][html][markdown][yaml]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } From a1e0607a22deb72ce4ac64e442f0baa721e32b0b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 12:20:40 -0500 Subject: [PATCH 350/494] fix: Don't specify default C formatter Microsoft's C/C++ extension performs poorly on some systems, so this gives the option to use any other extension that supports formatting with clang-format. --- .vscode/settings.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8bbff533..924d83b1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,8 +5,7 @@ }, "python.formatting.provider": "black", "[c]": { - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-vscode.cpptools" + "editor.formatOnSave": true }, "[javascript][javascriptreact][typescript][typescriptreact]": { "editor.formatOnSave": true, From b1ca9199de02dcb45d055a71807ff3894290fda7 Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Wed, 17 May 2023 12:42:57 +0800 Subject: [PATCH 351/494] fix(ci): Refactor prepare variable step * Refactor workflow variables * Use quotes to avoid word splitting --- .github/workflows/build-user-config.yml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index b1e0602d..5891ddc1 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -39,8 +39,8 @@ jobs: - name: Fetch Build Matrix run: | - echo "build_matrix=$(yaml2json ${{ inputs.build_matrix_path }} | jq -c .)" >> $GITHUB_ENV - yaml2json ${{ inputs.build_matrix_path }} | jq + echo "build_matrix=$(yaml2json '${{ inputs.build_matrix_path }}' | jq -c .)" >> $GITHUB_ENV + yaml2json "${{ inputs.build_matrix_path }}" | jq build: runs-on: ubuntu-latest @@ -54,18 +54,13 @@ jobs: steps: - name: Prepare variables shell: sh -x {0} + env: + shield: ${{ matrix.shield }} run: | - if [ -n "${{ matrix.shield }}" ] - then - echo "extra_cmake_args=-DSHIELD=\"${{ matrix.shield }}\"" >> $GITHUB_ENV - echo "artifact_name=${{ matrix.shield }}-${{ matrix.board }}-zmk" >> $GITHUB_ENV - echo "display_name=${{ matrix.shield }} - ${{ matrix.board }}" >> $GITHUB_ENV - else - echo "extra_cmake_args=" >> $GITHUB_ENV - echo "artifact_name=${{ matrix.board }}-zmk" >> $GITHUB_ENV - echo "display_name=${{ matrix.board }}" >> $GITHUB_ENV - fi echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV + echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}" >> $GITHUB_ENV + echo "display_name=${shield:+$shield - }${{ matrix.board }}" >> $GITHUB_ENV + echo "artifact_name=${shield:+$shield-}${{ matrix.board }}-zmk" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v3 @@ -89,7 +84,7 @@ jobs: ${{ runner.os }}- - name: West Init - run: west init -l ${{ inputs.config_path }} + run: west init -l "${{ inputs.config_path }}" - name: West Update run: west update @@ -99,7 +94,7 @@ jobs: - name: West Build (${{ env.display_name }}) shell: sh -x {0} - run: west build -s zmk/app -b ${{ matrix.board }} -- -DZMK_CONFIG=${GITHUB_WORKSPACE}/${{ inputs.config_path }} ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} + run: west build -s zmk/app -b "${{ matrix.board }}" -- -DZMK_CONFIG="${GITHUB_WORKSPACE}/${{ inputs.config_path }}" ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - name: ${{ env.display_name }} Kconfig file run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort @@ -113,7 +108,7 @@ jobs: cp build/zephyr/zmk.uf2 "build/artifacts/${{ env.artifact_name }}.uf2" elif [ -f build/zephyr/zmk.${{ inputs.fallback_binary }} ] then - cp build/zephyr/zmk.${{ inputs.fallback_binary }} "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" + cp "build/zephyr/zmk.${{ inputs.fallback_binary }}" "build/artifacts/${{ env.artifact_name }}.${{ inputs.fallback_binary }}" fi - name: Archive (${{ env.display_name }}) From 89d71ed2c2c1af78c166a96dc65658e4f39743ab Mon Sep 17 00:00:00 2001 From: digger vermont Date: Thu, 18 May 2023 19:47:36 -0400 Subject: [PATCH 352/494] feat(boards): Add KBDfans Tofu65 2.0 board * Initial commit of Tofu65 2.0 board --------- Co-authored-by: Pete Johanson --- app/boards/arm/kbdfans_tofu65/Kconfig.board | 6 + .../arm/kbdfans_tofu65/Kconfig.defconfig | 15 +++ .../arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts | 125 ++++++++++++++++++ .../kbdfans_tofu65/kbdfans_tofu65_v2.keymap | 97 ++++++++++++++ .../arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml | 15 +++ .../kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml | 10 ++ .../kbdfans_tofu65_v2_defconfig | 20 +++ 7 files changed, 288 insertions(+) create mode 100644 app/boards/arm/kbdfans_tofu65/Kconfig.board create mode 100644 app/boards/arm/kbdfans_tofu65/Kconfig.defconfig create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml create mode 100644 app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.board b/app/boards/arm/kbdfans_tofu65/Kconfig.board new file mode 100644 index 00000000..954166b7 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.board @@ -0,0 +1,6 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_KBDFANS_TOFU65_V2 + bool "KBDfans Tofu65 2.0" + depends on SOC_RP2040 diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig new file mode 100644 index 00000000..993d5142 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig @@ -0,0 +1,15 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_KBDFANS_TOFU65_V2 + +config ZMK_KEYBOARD_NAME + default "kbdfans tofu65" + +config RP2_FLASH_W25Q080 + default y + +config ZMK_USB + default y + +endif # BOARD_KBDFANS_TOFU65_V2 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts new file mode 100644 index 00000000..261ffbf4 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.dts @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; + +#include +#include + +/ { + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + zephyr,shell-uart = &cdc_acm_uart; + zephyr,code-partition = &code_partition; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + xtal_clk: xtal-clk { + compatible = "fixed-clock"; + clock-frequency = <12000000>; + #clock-cells = <0>; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <15>; + rows = <5>; + +// ------- Switch Matrix ---------- +// +// Column 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | +// ========================================================================================== +// Row 0 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | S13 | S14 | +// Row 1 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | S13 | S14 | +// Row 2 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | S12 | | S13 | +// Row 3 || S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | S10 | S11 | | S12 | S13 | +// Row 4 || S0 | S1 | S2 | | | | S3 | | S4 | S5 | S6 | | S7 | S8 | S9 | +// ----------------------------------------------------------------------------------- +// + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) RC(0,14) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) RC(1,14) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,14) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,13) RC(3,14) +RC(4,0) RC(4,1) RC(4,2) RC(4,6) RC(4,8) RC(4,9) RC(4,10) RC(4,12) RC(4,13) RC(4,14) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 28 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 27 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + col-gpios + = <&gpio0 25 GPIO_ACTIVE_HIGH> + , <&gpio0 24 GPIO_ACTIVE_HIGH> + , <&gpio0 23 GPIO_ACTIVE_HIGH> + , <&gpio0 1 GPIO_ACTIVE_HIGH> + , <&gpio0 7 GPIO_ACTIVE_HIGH> + , <&gpio0 21 GPIO_ACTIVE_HIGH> + , <&gpio0 20 GPIO_ACTIVE_HIGH> + , <&gpio0 19 GPIO_ACTIVE_HIGH> + , <&gpio0 18 GPIO_ACTIVE_HIGH> + , <&gpio0 17 GPIO_ACTIVE_HIGH> + , <&gpio0 16 GPIO_ACTIVE_HIGH> + , <&gpio0 15 GPIO_ACTIVE_HIGH> + , <&gpio0 14 GPIO_ACTIVE_HIGH> + , <&gpio0 13 GPIO_ACTIVE_HIGH> + , <&gpio0 12 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(16)>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserved memory for the second stage bootloader */ + second_stage_bootloader: partition@0 { + label = "second_stage_bootloader"; + reg = <0x00000000 0x100>; + read-only; + }; + + /* + * Usable flash. Starts at 0x100, after the bootloader. The partition + * size is 16MB minus the 0x100 bytes taken by the bootloader. + */ + code_partition: partition@100 { + label = "code"; + reg = <0x100 (DT_SIZE_M(16) - 0x100)>; + read-only; + }; + }; +}; + + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + }; +}; + + +&gpio0 { + status = "okay"; +}; + diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap new file mode 100644 index 00000000..7eca7919 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.keymap @@ -0,0 +1,97 @@ +// Copyright (c) 2023 The ZMK Contributors +// SPDX-License-Identifier: MIT + +#include +#include + +#define BASE 0 +#define FUNC 1 + +// +// ---------- Tofu65 2.0 key switch positions ---------- +// +// ------------------------------------------------------------------------------------------------- +// | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | +// ------------------------------------------------------------------------------------------------- +// | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 24 | 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 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | +// ------------------------------------------------------------------------------------------------- +// | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | +// ------------------------------------------------------------------------------------------------- +// + + +/ { + combos { + compatible = "zmk,combos"; + + // BACKSPACE + LCTRL + LALT = &sys_reset + combo_bootloader { + timeout-ms = <100>; + key-positions = <13 58 60>; + bindings = <&sys_reset>; + }; + + // RETURN + LCTRL + LALT = &bootloader + combo_sys_reset { + timeout-ms = <100>; + key-positions = <42 58 60>; + bindings = <&bootloader>; + }; + }; + + + keymap { + compatible = "zmk,keymap"; + + base { + +// --------- Default QWERTY Layout --------- +// Layer 0 BASE +// ------------------------------------------------------------------------------------------------- +// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | HME | +// ------------------------------------------------------------------------------------------------- +// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | PGU | +// ------------------------------------------------------------------------------------------------- +// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGD | +// ------------------------------------------------------------------------------------------------- +// | LSHIFT | Z | X | C | V | B | N | M | , | . | / | RSHFT | ↑ | END | +// ------------------------------------------------------------------------------------------------- +// | LCTL | LGUI | LALT | SPACE | RALT | RGUI | RCTL | <- | ↓ | -> | +// ------------------------------------------------------------------------------------------------- + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp HOME +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp PG_UP +&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ENTER &kp PG_DN +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp END +&kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT < FUNC K_APP &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT + >; + }; + + func { +// --------- Default QWERTY Layout --------- +// Layer 1 FUNC +// --------------------------------------------------------------------------------------------------- +// | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | HME | +// --------------------------------------------------------------------------------------------------- +// | --- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | scroll lock | pause | --- | PGU | +// --------------------------------------------------------------------------------------------------- +// | CAPS | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --- | PGD | +// --------------------------------------------------------------------------------------------------- +// | LSHIFT | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | ----- | VOL UP | MUTE | +// --------------------------------------------------------------------------------------------------- +// | ---- | ---- | ---- | ---- | -- | MO 1 | -- | PREV | VOL DN | NEXT | +// --------------------------------------------------------------------------------------------------- + bindings = < +&kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp SLCK &kp PAUSE_BREAK &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_VOL_UP &kp C_MUTE +&trans &trans &trans &trans &trans &trans &trans &kp C_PREV &kp C_VOL_DN &kp C_NEXT + >; + }; + }; +}; diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml new file mode 100644 index 00000000..e1089766 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.yaml @@ -0,0 +1,15 @@ +identifier: kbdfans_tofu65_v2 +name: KBDfans Tofu65 2.0 +type: mcu +arch: arm +flash: 16384 +ram: 264 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - gpio + - usb_device + - hwinfo + - pwm diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml new file mode 100644 index 00000000..382e7dd3 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2.zmk.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: kbdfans_tofu65_v2 +name: KBDfans Tofu65 2.0 +type: board +arch: arm +features: + - keys +outputs: + - usb +url: https://kbdfans.com/collections/tofu65-2-0/products/tofu65-2-0 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig new file mode 100644 index 00000000..cf546683 --- /dev/null +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig @@ -0,0 +1,20 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_RP2XXX=y +CONFIG_SOC_RP2040=y +CONFIG_BOARD_KBDFANS_TOFU65_V2=y + +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000 + +# Enable USB CDC ACM logging for debugging +# CONFIG_ZMK_USB_LOGGING=y + +# Enable reset by default +CONFIG_RESET=y + +# Code partition needed to target the correct flash range +CONFIG_USE_DT_CODE_PARTITION=y + +# Output UF2 by default, native bootloader supports it. +CONFIG_BUILD_OUTPUT_UF2=y From d799560985b40a7f9526cfdedd88546b60cf3182 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:10:58 -0500 Subject: [PATCH 353/494] chore: Update typescript, eslint, webpack --- docs/package-lock.json | 978 +++++++++++++++++++++-------------------- docs/package.json | 10 +- 2 files changed, 503 insertions(+), 485 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 2c8a7fba..2d1e7a57 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -31,18 +31,18 @@ "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^8.0.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.32.2", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", - "typescript": "^4.6.3", - "webpack": "^5.72.1" + "typescript": "^5.0.4", + "webpack": "^5.80.0" } }, "node_modules/@algolia/autocomplete-core": { @@ -2583,16 +2583,40 @@ "node": ">=16.14" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "devOptional": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2607,9 +2631,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -2633,6 +2657,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", @@ -2692,14 +2725,14 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "devOptional": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -3706,133 +3739,133 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.5", "@xtuc/long": "4.2.2" } }, @@ -4117,15 +4150,15 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "engines": { @@ -4144,14 +4177,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4161,6 +4194,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -5991,9 +6037,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6060,9 +6106,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, "node_modules/es-shim-unscopables": { "version": "1.0.0", @@ -6171,13 +6217,16 @@ } }, "node_modules/eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "devOptional": true, "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -6186,17 +6235,16 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -6211,7 +6259,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -6227,9 +6274,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -6675,25 +6722,26 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" @@ -6741,9 +6789,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "devOptional": true, "dependencies": { "esrecurse": "^4.3.0", @@ -6751,42 +6799,21 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true, - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "devOptional": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/glob-parent": { @@ -6802,9 +6829,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "dependencies": { "type-fest": "^0.20.2" @@ -6829,14 +6856,14 @@ } }, "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "devOptional": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6858,9 +6885,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "devOptional": true, "dependencies": { "estraverse": "^5.1.0" @@ -11077,28 +11104,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -11108,27 +11135,27 @@ } }, "node_modules/object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "dependencies": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" @@ -12796,18 +12823,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -13572,9 +13587,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dependencies": { "randombytes": "^2.1.0" } @@ -14024,18 +14039,18 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, "funding": { @@ -14311,9 +14326,9 @@ } }, "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -14328,15 +14343,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "engines": { "node": ">= 10.13.0" @@ -14620,15 +14635,15 @@ } }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/ua-parser-js": { @@ -15360,21 +15375,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", + "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -15383,9 +15398,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -15676,11 +15691,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -15721,9 +15731,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -17793,16 +17803,31 @@ "tslib": "^2.4.0" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "devOptional": true + }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "devOptional": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.5.1", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -17811,9 +17836,9 @@ }, "dependencies": { "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -17827,6 +17852,12 @@ } } }, + "@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "devOptional": true + }, "@fortawesome/fontawesome-common-types": { "version": "0.2.36", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", @@ -17870,14 +17901,14 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "devOptional": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { @@ -18668,133 +18699,133 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.5.tgz", + "integrity": "sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.5.tgz", + "integrity": "sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.5.tgz", + "integrity": "sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.5.tgz", + "integrity": "sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.5.tgz", + "integrity": "sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.5.tgz", + "integrity": "sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.5.tgz", + "integrity": "sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.5.tgz", + "integrity": "sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.5.tgz", + "integrity": "sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.5.tgz", + "integrity": "sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.5.tgz", + "integrity": "sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/helper-wasm-section": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-opt": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5", + "@webassemblyjs/wast-printer": "1.11.5" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.5.tgz", + "integrity": "sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.5.tgz", + "integrity": "sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-buffer": "1.11.5", + "@webassemblyjs/wasm-gen": "1.11.5", + "@webassemblyjs/wasm-parser": "1.11.5" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.5.tgz", + "integrity": "sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.5", + "@webassemblyjs/helper-api-error": "1.11.5", + "@webassemblyjs/helper-wasm-bytecode": "1.11.5", + "@webassemblyjs/ieee754": "1.11.5", + "@webassemblyjs/leb128": "1.11.5", + "@webassemblyjs/utf8": "1.11.5" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.5.tgz", + "integrity": "sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.5", "@xtuc/long": "4.2.2" } }, @@ -19015,15 +19046,15 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" } }, @@ -19033,17 +19064,30 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" } }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -20352,9 +20396,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -20406,9 +20450,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, "es-shim-unscopables": { "version": "1.0.0", @@ -20495,13 +20539,16 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "devOptional": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -20510,17 +20557,16 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -20535,7 +20581,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -20551,9 +20596,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "devOptional": true, "requires": { "type-fest": "^0.20.2" @@ -20568,9 +20613,9 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", "dev": true, "requires": {} }, @@ -20881,25 +20926,26 @@ } }, "eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "dependencies": { "doctrine": { @@ -20931,47 +20977,30 @@ } }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "devOptional": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "devOptional": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "devOptional": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "devOptional": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "devOptional": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esprima": { @@ -20980,9 +21009,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "devOptional": true, "requires": { "estraverse": "^5.1.0" @@ -23944,46 +23973,46 @@ } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "obuf": { @@ -25136,12 +25165,6 @@ "functions-have-names": "^1.2.2" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "devOptional": true - }, "regexpu-core": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", @@ -25709,9 +25732,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "requires": { "randombytes": "^2.1.0" } @@ -26067,18 +26090,18 @@ } }, "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" } }, @@ -26272,9 +26295,9 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.1.tgz", + "integrity": "sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==", "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -26290,15 +26313,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "dependencies": { "jest-worker": { @@ -26500,9 +26523,9 @@ } }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" }, "ua-parser-js": { "version": "0.7.32", @@ -26996,21 +27019,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.80.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", + "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -27019,18 +27042,13 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -27059,9 +27077,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", diff --git a/docs/package.json b/docs/package.json index 70105b54..dd4b3ff7 100644 --- a/docs/package.json +++ b/docs/package.json @@ -50,17 +50,17 @@ "@types/react": "^17.0.3", "@types/react-helmet": "^6.1.5", "@types/react-router-dom": "^5.1.7", - "eslint": "^8.0.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.39.0", + "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.30.0", + "eslint-plugin-react": "^7.32.2", "json-schema-to-typescript": "^10.1.5", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", - "typescript": "^4.6.3", - "webpack": "^5.72.1" + "typescript": "^5.0.4", + "webpack": "^5.80.0" } } From 4674215551b8c9bb0706e825742ba82b9d46ed3b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:14:00 -0500 Subject: [PATCH 354/494] chore: Update json-schema-to-typescript --- docs/package-lock.json | 193 ++++++++++++++++++----------------------- docs/package.json | 2 +- 2 files changed, 85 insertions(+), 110 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 2d1e7a57..ba968736 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -35,7 +35,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^10.1.5", + "json-schema-to-typescript": "^12.0.0", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", @@ -202,18 +202,6 @@ "node": ">=6.0.0" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -1984,6 +1972,24 @@ "node": ">=6.9.0" } }, + "node_modules/@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3487,9 +3493,9 @@ } }, "node_modules/@types/glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", - "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -4609,9 +4615,9 @@ } }, "node_modules/call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, "node_modules/callsites": { @@ -7711,18 +7717,22 @@ } }, "node_modules/glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", "dev": true, "dependencies": { - "@types/glob": "*" + "@types/glob": "^7.1.3" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" }, "peerDependencies": { - "glob": "*" + "glob": "^7.1.6" } }, "node_modules/glob-to-regexp": { @@ -9126,45 +9136,32 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "dev": true, - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-to-typescript": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", - "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", + "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.6", - "@types/lodash": "^4.14.168", - "@types/prettier": "^2.1.5", - "cli-color": "^2.0.0", + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", "get-stdin": "^8.0.0", "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", "mkdirp": "^1.0.4", "mz": "^2.7.0", - "prettier": "^2.2.0" + "prettier": "^2.6.2" }, "bin": { "json2ts": "dist/src/cli.js" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" } }, "node_modules/json-schema-traverse": { @@ -9178,12 +9175,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -16152,18 +16143,6 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, - "@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "requires": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", @@ -17362,6 +17341,18 @@ "to-fast-properties": "^2.0.0" } }, + "@bcherny/json-schema-ref-parser": { + "version": "10.0.5-fork", + "resolved": "https://registry.npmjs.org/@bcherny/json-schema-ref-parser/-/json-schema-ref-parser-10.0.5-fork.tgz", + "integrity": "sha512-E/jKbPoca1tfUPj3iSbitDZTGnq6FUFjkH6L8U2oDwSuwK1WhnnVtCG7oFOTg/DDnyoXbQYUiUiGOibHqaGVnw==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, "@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -18447,9 +18438,9 @@ } }, "@types/glob": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.0.0.tgz", - "integrity": "sha512-l6NQsDDyQUVeoTynNpC9uRvCUint/gSUXQA2euwmTuWGvPY5LSDUu6tkCtJB2SvGQlJQzLaKqcGZP4//7EDveA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -19385,9 +19376,9 @@ } }, "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true }, "callsites": { @@ -21622,12 +21613,12 @@ } }, "glob-promise": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", - "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-4.2.2.tgz", + "integrity": "sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==", "dev": true, "requires": { - "@types/glob": "*" + "@types/glob": "^7.1.3" } }, "glob-to-regexp": { @@ -22632,36 +22623,26 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "dev": true, - "requires": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - } - }, "json-schema-to-typescript": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-10.1.5.tgz", - "integrity": "sha512-X8bNNksfCQo6LhEuqNxmZr4eZpPjXZajmimciuk8eWXzZlif9Brq7WuMGD/SOhBKcRKP2SGVDNZbC28WQqx9Rg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", + "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "@types/lodash": "^4.14.168", - "@types/prettier": "^2.1.5", - "cli-color": "^2.0.0", + "@bcherny/json-schema-ref-parser": "10.0.5-fork", + "@types/json-schema": "^7.0.11", + "@types/lodash": "^4.14.182", + "@types/prettier": "^2.6.1", + "cli-color": "^2.0.2", "get-stdin": "^8.0.0", "glob": "^7.1.6", - "glob-promise": "^3.4.0", - "is-glob": "^4.0.1", - "json-schema-ref-parser": "^9.0.6", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.20", - "minimist": "^1.2.5", + "glob-promise": "^4.2.2", + "is-glob": "^4.0.3", + "lodash": "^4.17.21", + "minimist": "^1.2.6", "mkdirp": "^1.0.4", "mz": "^2.7.0", - "prettier": "^2.2.0" + "prettier": "^2.6.2" } }, "json-schema-traverse": { @@ -22675,12 +22656,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "devOptional": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", diff --git a/docs/package.json b/docs/package.json index dd4b3ff7..918fd173 100644 --- a/docs/package.json +++ b/docs/package.json @@ -54,7 +54,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^10.1.5", + "json-schema-to-typescript": "^12.0.0", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", From da2599aa75875a67ea923b93d58b6591e0747a06 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:26:28 -0500 Subject: [PATCH 355/494] chore: Update docusaurus, react types --- docs/package-lock.json | 1536 +++++++++++++++++++++------------------- docs/package.json | 14 +- 2 files changed, 803 insertions(+), 747 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ba968736..ac8c947e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,8 +8,8 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^2.1.0", - "@docusaurus/preset-classic": "^2.1.0", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -24,12 +24,12 @@ "web-tree-sitter": "^0.19.4" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.1.0", - "@docusaurus/types": "^2.1.0", - "@tsconfig/docusaurus": "^1.0.5", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^17.0.3", - "@types/react-helmet": "^6.1.5", + "@types/react": "^17.0.58", + "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", @@ -46,19 +46,19 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", - "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", - "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -66,79 +66,79 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", - "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "node_modules/@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "node_modules/@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", "dependencies": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/@algolia/events": { @@ -147,47 +147,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" }, "node_modules/@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", "dependencies": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.17.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "node_modules/@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "node_modules/@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", "dependencies": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" } }, "node_modules/@ampproject/remapping": { @@ -1904,11 +1904,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -2000,18 +2000,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", - "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" }, "node_modules/@docsearch/react": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", - "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", "dependencies": { - "@algolia/autocomplete-core": "1.7.2", - "@algolia/autocomplete-preset-algolia": "1.7.2", - "@docsearch/css": "3.3.0", + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", "algoliasearch": "^4.0.0" }, "peerDependencies": { @@ -2032,9 +2032,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", "dependencies": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -2046,13 +2046,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -2073,7 +2073,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -2120,9 +2120,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", "dependencies": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -2134,9 +2134,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.4.0" @@ -2146,14 +2146,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", "dependencies": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2177,12 +2177,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2196,17 +2196,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -2226,17 +2226,17 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -2256,15 +2256,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" @@ -2278,13 +2278,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2298,13 +2298,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" }, "engines": { @@ -2316,13 +2316,31 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "dependencies": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" }, "engines": { @@ -2334,16 +2352,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2357,22 +2375,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" }, "engines": { "node": ">=16.14" @@ -2395,26 +2414,26 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -2434,16 +2453,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", "dependencies": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2451,6 +2471,7 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" }, "engines": { @@ -2462,22 +2483,22 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", "dependencies": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -2492,9 +2513,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", "dependencies": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" @@ -2504,9 +2525,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -2523,12 +2544,13 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", "dependencies": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.0", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -2556,9 +2578,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", "dependencies": { "tslib": "^2.4.0" }, @@ -2575,12 +2597,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", "dependencies": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -3382,9 +3404,9 @@ } }, "node_modules/@tsconfig/docusaurus": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", - "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", "dev": true }, "node_modules/@types/acorn": { @@ -3628,9 +3650,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "17.0.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", - "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3638,9 +3660,9 @@ } }, "node_modules/@types/react-helmet": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz", - "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", "dev": true, "dependencies": { "@types/react": "*" @@ -4032,30 +4054,30 @@ } }, "node_modules/algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4227,9 +4249,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "funding": [ { "type": "opencollective", @@ -4241,8 +4263,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4516,9 +4538,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "funding": [ { "type": "opencollective", @@ -4530,10 +4552,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" @@ -4668,9 +4690,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001425", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", - "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "funding": [ { "type": "opencollective", @@ -4679,6 +4701,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -5121,9 +5147,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", "engines": { "node": ">=12" }, @@ -5530,12 +5556,12 @@ } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "dependencies": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -5549,24 +5575,24 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dependencies": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -5574,11 +5600,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -6954,9 +6980,9 @@ } }, "node_modules/eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==", "engines": { "node": ">=6.0.0" }, @@ -7398,9 +7424,9 @@ "devOptional": true }, "node_modules/flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -8300,9 +8326,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -8312,9 +8338,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { @@ -8495,9 +8521,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "engines": { "node": ">=12" } @@ -10957,9 +10983,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -11394,9 +11420,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, @@ -11661,11 +11687,11 @@ } }, "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -11678,11 +11704,11 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dependencies": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -11787,12 +11813,12 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -11802,11 +11828,11 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -11849,11 +11875,11 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, @@ -12015,11 +12041,11 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -12088,11 +12114,11 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { @@ -12129,9 +12155,9 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "dependencies": { "sort-css-media-queries": "2.1.0" }, @@ -12690,11 +12716,11 @@ } }, "node_modules/react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", "dependencies": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, @@ -12785,9 +12811,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -14160,11 +14186,11 @@ } }, "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -14532,7 +14558,8 @@ "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" }, "node_modules/trim-trailing-lines": { "version": "1.1.4", @@ -14638,9 +14665,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==", + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", "funding": [ { "type": "opencollective", @@ -15169,6 +15196,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15994,95 +16029,95 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz", - "integrity": "sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", + "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", "requires": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz", - "integrity": "sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", + "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", "requires": { - "@algolia/autocomplete-shared": "1.7.2" + "@algolia/autocomplete-shared": "1.7.4" } }, "@algolia/autocomplete-shared": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz", - "integrity": "sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==" + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", + "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" }, "@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", + "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", + "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==" }, "@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", + "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.17.0" } }, "@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", + "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", + "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", + "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", "requires": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", + "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", + "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "@algolia/events": { @@ -16091,47 +16126,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", + "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==" }, "@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", + "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", "requires": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.17.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", + "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", + "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==" }, "@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", + "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.17.0" } }, "@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", + "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", "requires": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/requester-common": "4.17.0" } }, "@ampproject/remapping": { @@ -17288,11 +17323,11 @@ } }, "@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/runtime-corejs3": { @@ -17360,25 +17395,25 @@ "optional": true }, "@docsearch/css": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.0.tgz", - "integrity": "sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", + "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" }, "@docsearch/react": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.0.tgz", - "integrity": "sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", + "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", "requires": { - "@algolia/autocomplete-core": "1.7.2", - "@algolia/autocomplete-preset-algolia": "1.7.2", - "@docsearch/css": "3.3.0", + "@algolia/autocomplete-core": "1.7.4", + "@algolia/autocomplete-preset-algolia": "1.7.4", + "@docsearch/css": "3.3.3", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", + "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", "requires": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -17390,13 +17425,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -17417,7 +17452,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -17454,9 +17489,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", + "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", "requires": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -17465,23 +17500,23 @@ } }, "@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", + "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", "requires": { "chalk": "^4.1.2", "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", + "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", "requires": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -17498,12 +17533,12 @@ } }, "@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", + "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", "requires": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -17513,17 +17548,17 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", + "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -17536,17 +17571,17 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", + "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -17559,88 +17594,100 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", + "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", + "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", + "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", + "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-tag-manager": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", + "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "requires": { + "@docusaurus/core": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", + "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", + "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "@docusaurus/core": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/plugin-debug": "2.4.0", + "@docusaurus/plugin-google-analytics": "2.4.0", + "@docusaurus/plugin-google-gtag": "2.4.0", + "@docusaurus/plugin-google-tag-manager": "2.4.0", + "@docusaurus/plugin-sitemap": "2.4.0", + "@docusaurus/theme-classic": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-search-algolia": "2.4.0", + "@docusaurus/types": "2.4.0" } }, "@docusaurus/react-loadable": { @@ -17653,26 +17700,26 @@ } }, "@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", + "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/types": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -17685,16 +17732,17 @@ } }, "@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", + "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", "requires": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/mdx-loader": "2.4.0", + "@docusaurus/module-type-aliases": "2.4.0", + "@docusaurus/plugin-content-blog": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/plugin-content-pages": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-common": "2.4.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -17702,26 +17750,27 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" } }, "@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", + "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", "requires": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/plugin-content-docs": "2.4.0", + "@docusaurus/theme-common": "2.4.0", + "@docusaurus/theme-translations": "2.4.0", + "@docusaurus/utils": "2.4.0", + "@docusaurus/utils-validation": "2.4.0", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -17729,18 +17778,18 @@ } }, "@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", + "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", "requires": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", + "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", "requires": { "@types/history": "^4.7.11", "@types/react": "*", @@ -17753,12 +17802,13 @@ } }, "@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", "requires": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.0", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -17775,20 +17825,20 @@ } }, "@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", + "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", + "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", "requires": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.0", + "@docusaurus/utils": "2.4.0", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -18327,9 +18377,9 @@ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@tsconfig/docusaurus": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.6.tgz", - "integrity": "sha512-1QxDaP54hpzM6bq9E+yFEo4F9WbWHhsDe4vktZXF/iDlc9FqGr9qlg+3X/nuKQXx8QxHV7ue8NXFazzajsxFBA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", + "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", "dev": true }, "@types/acorn": { @@ -18573,9 +18623,9 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "17.0.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", - "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -18583,9 +18633,9 @@ } }, "@types/react-helmet": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.5.tgz", - "integrity": "sha512-/ICuy7OHZxR0YCAZLNg9r7I9aijWUWvxaPR6uTuyxe8tAj5RL4Sw1+R6NhXUtOsarkGYPmaHdBDvuXh2DIN/uA==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.6.tgz", + "integrity": "sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==", "dev": true, "requires": { "@types/react": "*" @@ -18935,30 +18985,30 @@ "requires": {} }, "algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", + "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", "requires": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/cache-browser-local-storage": "4.17.0", + "@algolia/cache-common": "4.17.0", + "@algolia/cache-in-memory": "4.17.0", + "@algolia/client-account": "4.17.0", + "@algolia/client-analytics": "4.17.0", + "@algolia/client-common": "4.17.0", + "@algolia/client-personalization": "4.17.0", + "@algolia/client-search": "4.17.0", + "@algolia/logger-common": "4.17.0", + "@algolia/logger-console": "4.17.0", + "@algolia/requester-browser-xhr": "4.17.0", + "@algolia/requester-common": "4.17.0", + "@algolia/requester-node-http": "4.17.0", + "@algolia/transporter": "4.17.0" } }, "algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", + "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", "requires": { "@algolia/events": "^4.0.1" } @@ -19090,12 +19140,12 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -19312,14 +19362,14 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "buffer-from": { @@ -19417,9 +19467,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001425", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", - "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==" + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==" }, "ccount": { "version": "1.1.0", @@ -19744,9 +19794,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", + "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==" }, "copy-to-clipboard": { "version": "3.3.2", @@ -20002,12 +20052,12 @@ } }, "cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "requires": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -20015,24 +20065,24 @@ } }, "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "requires": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -20040,11 +20090,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -21043,9 +21093,9 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", + "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==" }, "etag": { "version": "1.8.1", @@ -21405,9 +21455,9 @@ "devOptional": true }, "flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "requires": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -22059,14 +22109,14 @@ } }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cache-semantics": { @@ -22187,9 +22237,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==" }, "inflight": { "version": "1.0.6", @@ -23858,9 +23908,9 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "normalize-path": { "version": "3.0.0", @@ -24161,9 +24211,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "requires": { "entities": "^4.4.0" } @@ -24350,22 +24400,22 @@ } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -24421,20 +24471,20 @@ } }, "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -24459,11 +24509,11 @@ } }, "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } @@ -24555,11 +24605,11 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -24598,11 +24648,11 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -24624,9 +24674,9 @@ } }, "postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "requires": { "sort-css-media-queries": "2.1.0" } @@ -25047,11 +25097,11 @@ } }, "react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", + "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" } @@ -25117,9 +25167,9 @@ } }, "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.0", @@ -26162,11 +26212,11 @@ } }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -26503,9 +26553,9 @@ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==" }, "ua-parser-js": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.32.tgz", - "integrity": "sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw==" + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" }, "unbox-primitive": { "version": "1.0.2", @@ -26845,6 +26895,12 @@ "use-isomorphic-layout-effect": "^1.1.1" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/docs/package.json b/docs/package.json index 918fd173..33742311 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^2.1.0", - "@docusaurus/preset-classic": "^2.1.0", + "@docusaurus/core": "^2.4.0", + "@docusaurus/preset-classic": "^2.4.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-solid-svg-icons": "^5.15.3", "@fortawesome/react-fontawesome": "^0.1.18", @@ -43,12 +43,12 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.1.0", - "@docusaurus/types": "^2.1.0", - "@tsconfig/docusaurus": "^1.0.5", + "@docusaurus/module-type-aliases": "^2.4.0", + "@docusaurus/types": "^2.4.0", + "@tsconfig/docusaurus": "^1.0.7", "@types/js-yaml": "^4.0.5", - "@types/react": "^17.0.3", - "@types/react-helmet": "^6.1.5", + "@types/react": "^17.0.58", + "@types/react-helmet": "^6.1.6", "@types/react-router-dom": "^5.1.7", "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", From c6bf95a901164e57d87d76cc65962434bba7b25d Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 00:41:08 -0500 Subject: [PATCH 356/494] chore: Update fontawesome --- docs/package-lock.json | 64 +++++++++++++++++++++--------------------- docs/package.json | 6 ++-- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ac8c947e..6f2ab304 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -10,9 +10,9 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.18", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", "js-yaml": "^4.1.0", @@ -2695,48 +2695,48 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.x" + "react": ">=16.3" } }, "node_modules/@hapi/hoek": { @@ -17900,30 +17900,30 @@ "devOptional": true }, "@fortawesome/fontawesome-common-types": { - "version": "0.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", - "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" }, "@fortawesome/fontawesome-svg-core": { - "version": "1.2.36", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", - "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, "@fortawesome/free-solid-svg-icons": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", - "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", "requires": { - "@fortawesome/fontawesome-common-types": "^0.2.36" + "@fortawesome/fontawesome-common-types": "6.4.0" } }, "@fortawesome/react-fontawesome": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.19.tgz", - "integrity": "sha512-Hyb+lB8T18cvLNX0S3llz7PcSOAJMLwiVKBuuzwM/nI5uoBw+gQjnf9il0fR1C3DKOI5Kc79pkJ4/xB0Uw9aFQ==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", "requires": { "prop-types": "^15.8.1" } diff --git a/docs/package.json b/docs/package.json index 33742311..44274bec 100644 --- a/docs/package.json +++ b/docs/package.json @@ -17,9 +17,9 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.3", - "@fortawesome/react-fontawesome": "^0.1.18", + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", "classnames": "^2.2.6", "js-yaml": "^4.1.0", From dae020787e5b29290e5cbd564fb5cdc4d29a0324 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 23 Apr 2023 16:55:01 -0500 Subject: [PATCH 357/494] docs: Update tree-sitter Updated web-tree-sitter and the devicetree grammar. web-tree-sitter now supports a custom function to locate its .wasm file, so performing a string replace is no longer necessary to get it to work with Docusaurus' Webpack configuration. We now check when tree-sitter is locating its .wasm file and provide the Webpack-adjusted URL. --- docs/package-lock.json | 14 ++++---- docs/package.json | 2 +- .../docusaurus-tree-sitter-plugin/index.js | 30 ------------------ docs/src/keymap-upgrade.js | 15 ++++++++- docs/static/tree-sitter-devicetree.wasm | Bin 34601 -> 40229 bytes 5 files changed, 22 insertions(+), 39 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 6f2ab304..3183a51c 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -21,7 +21,7 @@ "react-copy-to-clipboard": "^5.0.3", "react-dom": "^17.0.2", "react-toastify": "^7.0.4", - "web-tree-sitter": "^0.19.4" + "web-tree-sitter": "^0.20.8" }, "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.0", @@ -15391,9 +15391,9 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -27040,9 +27040,9 @@ "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" }, "web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" }, "webidl-conversions": { "version": "3.0.1", diff --git a/docs/package.json b/docs/package.json index 44274bec..15d5aa38 100644 --- a/docs/package.json +++ b/docs/package.json @@ -28,7 +28,7 @@ "react-copy-to-clipboard": "^5.0.3", "react-dom": "^17.0.2", "react-toastify": "^7.0.4", - "web-tree-sitter": "^0.19.4" + "web-tree-sitter": "^0.20.8" }, "browserslist": { "production": [ diff --git a/docs/src/docusaurus-tree-sitter-plugin/index.js b/docs/src/docusaurus-tree-sitter-plugin/index.js index e782aea8..a6952ce7 100644 --- a/docs/src/docusaurus-tree-sitter-plugin/index.js +++ b/docs/src/docusaurus-tree-sitter-plugin/index.js @@ -16,36 +16,6 @@ module.exports = function () { test: /web-tree-sitter/, loader: "null-loader", }); - } else { - // The way web-tree-sitter loads tree-sitter.wasm isn't something that - // Docusaurus/Webpack identify as an asset. There is currently no way to - // set location of the file other than patching web-tree-sitter. - // (see https://github.com/tree-sitter/tree-sitter/issues/559) - rules.push({ - test: /tree-sitter\.js$/, - loader: "string-replace-loader", - options: { - multiple: [ - // Replace the path to tree-sitter.wasm with a "new URL()" to clue - // Webpack in that it is an asset. - { - search: '"tree-sitter.wasm"', - replace: '(new URL("tree-sitter.wasm", import.meta.url)).href', - strict: true, - }, - // Webpack replaces "new URL()" with the full URL to the asset, but - // web-tree-sitter will still add a prefix to it unless there is a - // Module.locateFile() function. - { - search: "var Module=void 0!==Module?Module:{};", - replace: `var Module = { - locateFile: (path, prefix) => path.startsWith('http') ? path : prefix + path, - };`, - strict: true, - }, - ], - }, - }); } return { diff --git a/docs/src/keymap-upgrade.js b/docs/src/keymap-upgrade.js index 19a5d8e3..788ab31a 100644 --- a/docs/src/keymap-upgrade.js +++ b/docs/src/keymap-upgrade.js @@ -2,10 +2,23 @@ import Parser from "web-tree-sitter"; import { Codes, Behaviors } from "./data/keymap-upgrade"; +const TREE_SITTER_WASM_URL = new URL( + "/node_modules/web-tree-sitter/tree-sitter.wasm", + import.meta.url +); + let Devicetree; export async function initParser() { - await Parser.init(); + await Parser.init({ + locateFile: (path, prefix) => { + // When locating tree-sitter.wasm, use a path that Webpack can map to the correct URL. + if (path == "tree-sitter.wasm") { + return TREE_SITTER_WASM_URL.href; + } + return prefix + path; + }, + }); Devicetree = await Parser.Language.load("/tree-sitter-devicetree.wasm"); } diff --git a/docs/static/tree-sitter-devicetree.wasm b/docs/static/tree-sitter-devicetree.wasm index fbcb0f18a70a75cc57c24aa7ae0a4b00aad5a95b..cce5ac9656c93720f1840dd7d89cb23b19d6e66b 100644 GIT binary patch literal 40229 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 J66B|X{s#)Tb{_x$ literal 34601 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 VuYJt0y Date: Mon, 24 Apr 2023 20:22:42 -0500 Subject: [PATCH 358/494] fix(docs): Fix typescript error See https://github.com/facebook/docusaurus/issues/8226#issuecomment-1420620198 --- docs/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 589217e2..a9844e97 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -3,7 +3,7 @@ "include": ["src/"], "compilerOptions": { "types": ["node", "@docusaurus/theme-classic"], - "moduleResolution": "Node", + "moduleResolution": "Node16", "esModuleInterop": true, "resolveJsonModule": true, "strict": true, From b021d19255122883c4ccd1887ffa0bba5df076b0 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:12:59 -0700 Subject: [PATCH 359/494] fix(display): Imply LVGL mono theme when display is enabled All displays currently used with ZMK are monochrome so it makes sense to enable the mono theme by default, which can be disabled by the user since we use the "imply" statement. Without this theme setting, the small font size selection for widgets at the bottom of the stock status screen does not work. --- app/src/display/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 32be2a27..cb086b4c 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -9,6 +9,7 @@ menuconfig ZMK_DISPLAY select LV_THEMES select LV_THEME_MONO select LV_CONF_MINIMAL + imply LV_USE_THEME_MONO if ZMK_DISPLAY From 7e29166c6ce4987de58de2e8a5545dca68312dfd Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:40:11 -0700 Subject: [PATCH 360/494] refactor(display): Clean up unused theme Kconfig --- app/src/display/Kconfig | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index cb086b4c..5f67bf11 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -6,8 +6,6 @@ menuconfig ZMK_DISPLAY default n select DISPLAY select LVGL - select LV_THEMES - select LV_THEME_MONO select LV_CONF_MINIMAL imply LV_USE_THEME_MONO From 864394b40a7599a1560782226168cd6e40244c5a Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sun, 14 May 2023 12:20:24 -0700 Subject: [PATCH 361/494] feat(display): Add setting to invert display colors Add CONFIG_ZMK_DISPLAY_INVERT Kconfig to invert colors (black-on-white to white-on-black) on monochrome screens. Currently applies only if CONFIG_LV_USE_THEME_MONO is selected, which is the default unless user overrides it. --- app/src/display/Kconfig | 7 +++++++ app/src/display/main.c | 3 ++- docs/docs/config/displays.md | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 5f67bf11..63ba968b 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -15,6 +15,13 @@ config ZMK_DISPLAY_BLANK_ON_IDLE bool "Blank display on idle" default y if SSD1306 +if LV_USE_THEME_MONO + +config ZMK_DISPLAY_INVERT + bool "Invert display colors" + +endif + choice LV_TXT_ENC default LV_TXT_ENC_UTF8 diff --git a/app/src/display/main.c b/app/src/display/main.c index e34f8a53..e15e2de0 100644 --- a/app/src/display/main.c +++ b/app/src/display/main.c @@ -91,7 +91,8 @@ int zmk_display_is_initialized() { return initialized; } static void initialize_theme() { #if IS_ENABLED(CONFIG_LV_USE_THEME_MONO) lv_disp_t *disp = lv_disp_get_default(); - lv_theme_t *theme = lv_theme_mono_init(disp, false, CONFIG_LV_FONT_DEFAULT); + lv_theme_t *theme = + lv_theme_mono_init(disp, IS_ENABLED(CONFIG_ZMK_DISPLAY_INVERT), CONFIG_LV_FONT_DEFAULT); theme->font_small = CONFIG_ZMK_LV_FONT_DEFAULT_SMALL; disp->theme = theme; diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index d126e38a..a68bf26a 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -17,12 +17,15 @@ Definition files: | Config | Type | Description | Default | | -------------------------------------------------- | ---- | -------------------------------------------------------------- | ------- | | `CONFIG_ZMK_DISPLAY` | bool | Enable support for displays | n | +| `CONFIG_ZMK_DISPLAY_INVERT` | bool | Invert display colors from black-on-white to white-on-black | n | | `CONFIG_ZMK_WIDGET_LAYER_STATUS` | bool | Enable a widget to show the highest, active layer | y | | `CONFIG_ZMK_WIDGET_BATTERY_STATUS` | bool | Enable a widget to show battery charge information | y | | `CONFIG_ZMK_WIDGET_BATTERY_STATUS_SHOW_PERCENTAGE` | bool | If battery widget is enabled, show percentage instead of icons | n | | `CONFIG_ZMK_WIDGET_OUTPUT_STATUS` | bool | Enable a widget to show the current output (USB/BLE) | y | | `CONFIG_ZMK_WIDGET_WPM_STATUS` | bool | Enable a widget to show words per minute | n | +Note that `CONFIG_ZMK_DISPLAY_INVERT` setting might not work as expected with custom status screens that utilize images. + If `CONFIG_ZMK_DISPLAY` is enabled, exactly zero or one of the following options must be set to `y`. The first option is used if none are set. | Config | Description | From 5aac2743b10c69be000038cd03e51f5a284fa6cc Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 5 May 2023 22:56:58 -0700 Subject: [PATCH 362/494] fix(bluetooth): Improved checking for conn status. * Check the actual connection status before considering a discovered connection as connected. --- app/src/ble.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/ble.c b/app/src/ble.c index a7037d0c..c7bdc401 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -118,6 +118,7 @@ void set_profile_address(uint8_t index, const bt_addr_le_t *addr) { bool zmk_ble_active_profile_is_connected() { struct bt_conn *conn; + struct bt_conn_info info; bt_addr_le_t *addr = zmk_ble_active_profile_addr(); if (!bt_addr_le_cmp(addr, BT_ADDR_LE_ANY)) { return false; @@ -125,9 +126,11 @@ bool zmk_ble_active_profile_is_connected() { return false; } + bt_conn_get_info(conn, &info); + bt_conn_unref(conn); - return true; + return info.state == BT_CONN_STATE_CONNECTED; } #define CHECKED_ADV_STOP() \ From 1adfcf92bf96cd6453e6bb3ae8cc3b2d1fa8caa4 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Mon, 29 May 2023 00:28:45 -0400 Subject: [PATCH 363/494] refactor(split): fix inconsistency in Kconfig names --- app/include/zmk/ble.h | 2 +- app/src/keymap.c | 2 +- app/src/split/bluetooth/Kconfig | 4 ++-- app/src/split/bluetooth/central.c | 12 ++++++------ docs/docs/config/system.md | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 4380a33a..1c84777d 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -15,7 +15,7 @@ #if ZMK_BLE_IS_CENTRAL #define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#define ZMK_BLE_SPLIT_PERIPHERAL_COUNT 1 +#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT 1 #else #define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED #endif diff --git a/app/src/keymap.c b/app/src/keymap.c index 909fd20d..da25fc09 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -218,7 +218,7 @@ int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position #endif case BEHAVIOR_LOCALITY_GLOBAL: #if ZMK_BLE_IS_CENTRAL - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { zmk_split_bt_invoke_behavior(i, &binding, event, pressed); } #endif diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 53119d82..005d75fd 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -21,11 +21,11 @@ config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue when received from peripherals" default 5 -config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE +config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE int "BLE split central write thread stack size" default 512 -config ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE +config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE int "Max number of behavior run events to queue to send to the peripheral(s)" default 5 diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index ac073c59..a7c0d8a9 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -47,7 +47,7 @@ struct peripheral_slot { uint8_t changed_positions[POSITION_STATE_DATA_LEN]; }; -static struct peripheral_slot peripherals[ZMK_BLE_SPLIT_PERIPHERAL_COUNT]; +static struct peripheral_slot peripherals[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_BT_SERVICE_UUID); @@ -65,7 +65,7 @@ void peripheral_event_work_callback(struct k_work *work) { K_WORK_DEFINE(peripheral_event_work, peripheral_event_work_callback); int peripheral_slot_index_for_conn(struct bt_conn *conn) { - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { if (peripherals[i].conn == conn) { return i; } @@ -84,7 +84,7 @@ struct peripheral_slot *peripheral_slot_for_conn(struct bt_conn *conn) { } int release_peripheral_slot(int index) { - if (index < 0 || index >= ZMK_BLE_SPLIT_PERIPHERAL_COUNT) { + if (index < 0 || index >= ZMK_SPLIT_BLE_PERIPHERAL_COUNT) { return -EINVAL; } @@ -131,7 +131,7 @@ int release_peripheral_slot(int index) { } int reserve_peripheral_slot() { - for (int i = 0; i < ZMK_BLE_SPLIT_PERIPHERAL_COUNT; i++) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { if (peripherals[i].state == PERIPHERAL_SLOT_STATE_OPEN) { // Be sure the slot is fully reinitialized. release_peripheral_slot(i); @@ -504,7 +504,7 @@ static struct bt_conn_cb conn_callbacks = { }; K_THREAD_STACK_DEFINE(split_central_split_run_q_stack, - CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE); + CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE); struct k_work_q split_central_split_run_q; @@ -515,7 +515,7 @@ struct zmk_split_run_behavior_payload_wrapper { K_MSGQ_DEFINE(zmk_split_central_split_run_msgq, sizeof(struct zmk_split_run_behavior_payload_wrapper), - CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE, 4); + CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE, 4); void split_central_split_run_callback(struct k_work *work) { struct zmk_split_run_behavior_payload_wrapper payload_wrapper; diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index a5347b96..5a5ae5a5 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -97,8 +97,8 @@ Following split keyboard settings are defined in [zmk/app/src/split/Kconfig](htt | `CONFIG_ZMK_SPLIT_BLE` | bool | Use BLE to communicate between split keyboard halves | y | | `CONFIG_ZMK_SPLIT_ROLE_CENTRAL` | bool | `y` for central device, `n` for peripheral | | | `CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue when received from peripherals | 5 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | -| `CONFIG_ZMK_BLE_SPLIT_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_STACK_SIZE` | int | Stack size of the BLE split central write thread | 512 | +| `CONFIG_ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE` | int | Max number of behavior run events to queue to send to the peripheral(s) | 5 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE` | int | Stack size of the BLE split peripheral notify thread | 650 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_PRIORITY` | int | Priority of the BLE split peripheral notify thread | 5 | | `CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE` | int | Max number of key state events to queue to send to the central | 10 | From b276a3bfb074a869ca101bdaba924c936eeb04ec Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Tue, 6 Dec 2022 00:13:01 -0600 Subject: [PATCH 364/494] refactor(kscan): batch GPIO reads by port Changed the GPIO matrix and direct GPIO key scan drivers to do a single read per port instead of one read per pin. This is much more efficient for some types of GPIO drivers, such as I2C GPIO expanders. To accomplish this with minimal overhead, we now sort input pins by port at driver init. if we iterate through the pins in the sorted order, all pins on the same port are consecutive, so we only need to read each port once the first time we see it. --- app/drivers/kscan/CMakeLists.txt | 1 + app/drivers/kscan/kscan_gpio.c | 33 ++++++++ app/drivers/kscan/kscan_gpio.h | 61 ++++++++++++++ app/drivers/kscan/kscan_gpio_direct.c | 72 +++++++++-------- app/drivers/kscan/kscan_gpio_matrix.c | 110 +++++++++++++------------- 5 files changed, 188 insertions(+), 89 deletions(-) create mode 100644 app/drivers/kscan/kscan_gpio.c create mode 100644 app/drivers/kscan/kscan_gpio.h diff --git a/app/drivers/kscan/CMakeLists.txt b/app/drivers/kscan/CMakeLists.txt index ced31e6f..8fc7ed58 100644 --- a/app/drivers/kscan/CMakeLists.txt +++ b/app/drivers/kscan/CMakeLists.txt @@ -5,6 +5,7 @@ zephyr_library_named(zmk__drivers__kscan) zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER debounce.c) +zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_MATRIX kscan_gpio_matrix.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DIRECT kscan_gpio_direct.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DEMUX kscan_gpio_demux.c) diff --git a/app/drivers/kscan/kscan_gpio.c b/app/drivers/kscan/kscan_gpio.c new file mode 100644 index 00000000..4963f678 --- /dev/null +++ b/app/drivers/kscan/kscan_gpio.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "kscan_gpio.h" + +#include + +static int compare_ports(const void *a, const void *b) { + const struct kscan_gpio *gpio_a = a; + const struct kscan_gpio *gpio_b = b; + + return gpio_a->spec.port - gpio_b->spec.port; +} + +void kscan_gpio_list_sort_by_port(struct kscan_gpio_list *list) { + qsort(list->gpios, list->len, sizeof(list->gpios[0]), compare_ports); +} + +int kscan_gpio_pin_get(const struct kscan_gpio *gpio, struct kscan_gpio_port_state *state) { + if (gpio->spec.port != state->port) { + state->port = gpio->spec.port; + + const int err = gpio_port_get(state->port, &state->value); + if (err) { + return err; + } + } + + return (state->value & BIT(gpio->spec.pin)) != 0; +} diff --git a/app/drivers/kscan/kscan_gpio.h b/app/drivers/kscan/kscan_gpio.h new file mode 100644 index 00000000..39343136 --- /dev/null +++ b/app/drivers/kscan/kscan_gpio.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +struct kscan_gpio { + struct gpio_dt_spec spec; + /** The index of the GPIO in the devicetree *-gpios array. */ + size_t index; +}; + +/** GPIO_DT_SPEC_GET_BY_IDX(), but for a struct kscan_gpio. */ +#define KSCAN_GPIO_GET_BY_IDX(node_id, prop, idx) \ + ((struct kscan_gpio){.spec = GPIO_DT_SPEC_GET_BY_IDX(node_id, prop, idx), .index = idx}) + +struct kscan_gpio_list { + struct kscan_gpio *gpios; + size_t len; +}; + +/** Define a kscan_gpio_list from a compile-time GPIO array. */ +#define KSCAN_GPIO_LIST(gpio_array) \ + ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) + +struct kscan_gpio_port_state { + const struct device *port; + gpio_port_value_t value; +}; + +/** + * Sorts a GPIO list by port so it can be used with kscan_gpio_pin_get(). + */ +void kscan_gpio_list_sort_by_port(struct kscan_gpio_list *list); + +/** + * Get logical level of an input pin. + * + * This is equivalent to gpio_pin_get() except that, when iterating through the + * pins in a list which is sorted by kscan_gpio_list_sort_by_port(), it only + * performs one read per port instead of one read per pin. + * + * @param gpio The input pin to read. + * @param state An object to track state between reads. Must be zero-initialized before the first + * use. + * + * @retval 1 If pin logical value is 1 / active. + * @retval 0 If pin logical value is 0 / inactive. + * @retval -EIO I/O error when accessing an external GPIO chip. + * @retval -EWOULDBLOCK if operation would block. + */ +int kscan_gpio_pin_get(const struct kscan_gpio *gpio, struct kscan_gpio_port_state *state); diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/drivers/kscan/kscan_gpio_direct.c index 586e0d95..d43d716b 100644 --- a/app/drivers/kscan/kscan_gpio_direct.c +++ b/app/drivers/kscan/kscan_gpio_direct.c @@ -5,6 +5,7 @@ */ #include "debounce.h" +#include "kscan_gpio.h" #include #include @@ -41,7 +42,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define INST_INPUTS_LEN(n) DT_INST_PROP_LEN(n, input_gpios) #define KSCAN_DIRECT_INPUT_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), input_gpios, idx) struct kscan_direct_irq_callback { const struct device *dev; @@ -50,6 +51,7 @@ struct kscan_direct_irq_callback { struct kscan_direct_data { const struct device *dev; + struct kscan_gpio_list inputs; kscan_callback_t callback; struct k_work_delayable work; #if USE_INTERRUPTS @@ -62,17 +64,7 @@ struct kscan_direct_data { struct debounce_state *pin_state; }; -struct kscan_gpio_list { - const struct gpio_dt_spec *gpios; - size_t len; -}; - -/** Define a kscan_gpio_list from a compile-time GPIO array. */ -#define KSCAN_GPIO_LIST(gpio_array) \ - ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) - struct kscan_direct_config { - struct kscan_gpio_list inputs; struct debounce_config debounce_config; int32_t debounce_scan_period_ms; int32_t poll_period_ms; @@ -81,10 +73,10 @@ struct kscan_direct_config { #if USE_INTERRUPTS static int kscan_direct_interrupt_configure(const struct device *dev, const gpio_flags_t flags) { - const struct kscan_direct_config *config = dev->config; + const struct kscan_direct_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = gpio_pin_interrupt_configure_dt(gpio, flags); if (err) { @@ -134,16 +126,16 @@ static gpio_flags_t kscan_gpio_get_extra_flags(const struct gpio_dt_spec *gpio, static int kscan_inputs_set_flags(const struct kscan_gpio_list *inputs, const struct gpio_dt_spec *active_gpio) { - gpio_flags_t extra_flags; for (int i = 0; i < inputs->len; i++) { - extra_flags = GPIO_INPUT | kscan_gpio_get_extra_flags(&inputs->gpios[i], - &inputs->gpios[i] == active_gpio); + const bool active = &inputs->gpios[i].spec == active_gpio; + const gpio_flags_t extra_flags = + GPIO_INPUT | kscan_gpio_get_extra_flags(&inputs->gpios[i].spec, active); LOG_DBG("Extra flags equal to: %d", extra_flags); - int err = gpio_pin_configure_dt(&inputs->gpios[i], extra_flags); + int err = gpio_pin_configure_dt(&inputs->gpios[i].spec, extra_flags); if (err) { - LOG_ERR("Unable to configure flags on pin %d on %s", inputs->gpios[i].pin, - inputs->gpios[i].port->name); + LOG_ERR("Unable to configure flags on pin %d on %s", inputs->gpios[i].spec.pin, + inputs->gpios[i].spec.port->name); return err; } } @@ -179,28 +171,35 @@ static int kscan_direct_read(const struct device *dev) { const struct kscan_direct_config *config = dev->config; // Read the inputs. - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + struct kscan_gpio_port_state state = {0}; - const bool active = gpio_pin_get_dt(gpio); + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; - debounce_update(&data->pin_state[i], active, config->debounce_scan_period_ms, + const int active = kscan_gpio_pin_get(gpio, &state); + if (active < 0) { + LOG_ERR("Failed to read port %s: %i", gpio->spec.port->name, active); + return active; + } + + debounce_update(&data->pin_state[gpio->index], active, config->debounce_scan_period_ms, &config->debounce_config); } // Process the new state. bool continue_scan = false; - for (int i = 0; i < config->inputs.len; i++) { - struct debounce_state *state = &data->pin_state[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; + struct debounce_state *state = &data->pin_state[gpio->index]; if (debounce_get_changed(state)) { const bool pressed = debounce_is_pressed(state); - LOG_DBG("Sending event at 0,%i state %s", i, pressed ? "on" : "off"); - data->callback(dev, 0, i, pressed); + LOG_DBG("Sending event at 0,%i state %s", gpio->index, pressed ? "on" : "off"); + data->callback(dev, 0, gpio->index, pressed); if (config->toggle_mode && pressed) { - kscan_inputs_set_flags(&config->inputs, &config->inputs.gpios[i]); + kscan_inputs_set_flags(&data->inputs, &gpio->spec); } } @@ -289,10 +288,11 @@ static int kscan_direct_init_input_inst(const struct device *dev, const struct g } static int kscan_direct_init_inputs(const struct device *dev) { + const struct kscan_direct_data *data = dev->data; const struct kscan_direct_config *config = dev->config; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = kscan_direct_init_input_inst(dev, gpio, i, config->toggle_mode); if (err) { return err; @@ -307,6 +307,9 @@ static int kscan_direct_init(const struct device *dev) { data->dev = dev; + // Sort inputs by port so we can read each port just once per scan. + kscan_gpio_list_sort_by_port(&data->inputs); + kscan_direct_init_inputs(dev); k_work_init_delayable(&data->work, kscan_direct_work_handler); @@ -326,7 +329,7 @@ static const struct kscan_driver_api kscan_direct_api = { BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(n) <= DEBOUNCE_COUNTER_MAX, \ "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ - static const struct gpio_dt_spec kscan_direct_inputs_##n[] = { \ + static struct kscan_gpio kscan_direct_inputs_##n[] = { \ LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ @@ -335,10 +338,11 @@ static const struct kscan_driver_api kscan_direct_api = { (static struct kscan_direct_irq_callback kscan_direct_irqs_##n[INST_INPUTS_LEN(n)];)) \ \ static struct kscan_direct_data kscan_direct_data_##n = { \ - .pin_state = kscan_direct_state_##n, COND_INTERRUPTS((.irqs = kscan_direct_irqs_##n, ))}; \ + .inputs = KSCAN_GPIO_LIST(kscan_direct_inputs_##n), \ + .pin_state = kscan_direct_state_##n, \ + COND_INTERRUPTS((.irqs = kscan_direct_irqs_##n, ))}; \ \ static struct kscan_direct_config kscan_direct_config_##n = { \ - .inputs = KSCAN_GPIO_LIST(kscan_direct_inputs_##n), \ .debounce_config = \ { \ .debounce_press_ms = INST_DEBOUNCE_PRESS_MS(n), \ diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/drivers/kscan/kscan_gpio_matrix.c index d2121273..b8e72044 100644 --- a/app/drivers/kscan/kscan_gpio_matrix.c +++ b/app/drivers/kscan/kscan_gpio_matrix.c @@ -5,6 +5,7 @@ */ #include "debounce.h" +#include "kscan_gpio.h" #include #include @@ -50,9 +51,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); COND_CODE_1(CONFIG_ZMK_KSCAN_MATRIX_POLLING, pollcode, intcode) #define KSCAN_GPIO_ROW_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), row_gpios, idx) #define KSCAN_GPIO_COL_CFG_INIT(idx, inst_idx) \ - GPIO_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) + KSCAN_GPIO_GET_BY_IDX(DT_DRV_INST(inst_idx), col_gpios, idx) enum kscan_diode_direction { KSCAN_ROW2COL, @@ -66,6 +67,7 @@ struct kscan_matrix_irq_callback { struct kscan_matrix_data { const struct device *dev; + struct kscan_gpio_list inputs; kscan_callback_t callback; struct k_work_delayable work; #if USE_INTERRUPTS @@ -76,26 +78,16 @@ struct kscan_matrix_data { int64_t scan_time; /** * Current state of the matrix as a flattened 2D array of length - * (config->rows.len * config->cols.len) + * (config->rows * config->cols) */ struct debounce_state *matrix_state; }; -struct kscan_gpio_list { - const struct gpio_dt_spec *gpios; - size_t len; -}; - -/** Define a kscan_gpio_list from a compile-time GPIO array. */ -#define KSCAN_GPIO_LIST(gpio_array) \ - ((struct kscan_gpio_list){.gpios = gpio_array, .len = ARRAY_SIZE(gpio_array)}) - struct kscan_matrix_config { - struct kscan_gpio_list rows; - struct kscan_gpio_list cols; - struct kscan_gpio_list inputs; struct kscan_gpio_list outputs; struct debounce_config debounce_config; + size_t rows; + size_t cols; int32_t debounce_scan_period_ms; int32_t poll_period_ms; enum kscan_diode_direction diode_direction; @@ -105,10 +97,10 @@ struct kscan_matrix_config { * Get the index into a matrix state array from a row and column. */ static int state_index_rc(const struct kscan_matrix_config *config, const int row, const int col) { - __ASSERT(row < config->rows.len, "Invalid row %i", row); - __ASSERT(col < config->cols.len, "Invalid column %i", col); + __ASSERT(row < config->rows, "Invalid row %i", row); + __ASSERT(col < config->cols, "Invalid column %i", col); - return (col * config->rows.len) + row; + return (col * config->rows) + row; } /** @@ -125,7 +117,7 @@ static int kscan_matrix_set_all_outputs(const struct device *dev, const int valu const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i].spec; int err = gpio_pin_set_dt(gpio, value); if (err) { @@ -139,10 +131,10 @@ static int kscan_matrix_set_all_outputs(const struct device *dev, const int valu #if USE_INTERRUPTS static int kscan_matrix_interrupt_configure(const struct device *dev, const gpio_flags_t flags) { - const struct kscan_matrix_config *config = dev->config; + const struct kscan_matrix_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; + for (int i = 0; i < data->inputs.len; i++) { + const struct gpio_dt_spec *gpio = &data->inputs.gpios[i].spec; int err = gpio_pin_interrupt_configure_dt(gpio, flags); if (err) { @@ -226,32 +218,37 @@ static int kscan_matrix_read(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; // Scan the matrix. - for (int o = 0; o < config->outputs.len; o++) { - const struct gpio_dt_spec *out_gpio = &config->outputs.gpios[o]; + for (int i = 0; i < config->outputs.len; i++) { + const struct kscan_gpio *out_gpio = &config->outputs.gpios[i]; - int err = gpio_pin_set_dt(out_gpio, 1); + int err = gpio_pin_set_dt(&out_gpio->spec, 1); if (err) { - LOG_ERR("Failed to set output %i active: %i", o, err); + LOG_ERR("Failed to set output %i active: %i", out_gpio->index, err); return err; } #if CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS > 0 k_busy_wait(CONFIG_ZMK_KSCAN_MATRIX_WAIT_BEFORE_INPUTS); #endif + struct kscan_gpio_port_state state = {0}; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *in_gpio = &config->inputs.gpios[i]; + for (int j = 0; j < data->inputs.len; j++) { + const struct kscan_gpio *in_gpio = &data->inputs.gpios[j]; - const int index = state_index_io(config, i, o); - const bool active = gpio_pin_get_dt(in_gpio); + const int index = state_index_io(config, in_gpio->index, out_gpio->index); + const int active = kscan_gpio_pin_get(in_gpio, &state); + if (active < 0) { + LOG_ERR("Failed to read port %s: %i", in_gpio->spec.port->name, active); + return active; + } debounce_update(&data->matrix_state[index], active, config->debounce_scan_period_ms, &config->debounce_config); } - err = gpio_pin_set_dt(out_gpio, 0); + err = gpio_pin_set_dt(&out_gpio->spec, 0); if (err) { - LOG_ERR("Failed to set output %i inactive: %i", o, err); + LOG_ERR("Failed to set output %i inactive: %i", out_gpio->index, err); return err; } @@ -263,8 +260,8 @@ static int kscan_matrix_read(const struct device *dev) { // Process the new state. bool continue_scan = false; - for (int r = 0; r < config->rows.len; r++) { - for (int c = 0; c < config->cols.len; c++) { + for (int r = 0; r < config->rows; r++) { + for (int c = 0; c < config->cols; c++) { const int index = state_index_rc(config, r, c); struct debounce_state *state = &data->matrix_state[index]; @@ -329,28 +326,28 @@ static int kscan_matrix_disable(const struct device *dev) { #endif } -static int kscan_matrix_init_input_inst(const struct device *dev, const struct gpio_dt_spec *gpio, - const int index) { - if (!device_is_ready(gpio->port)) { - LOG_ERR("GPIO is not ready: %s", gpio->port->name); +static int kscan_matrix_init_input_inst(const struct device *dev, const struct kscan_gpio *gpio) { + if (!device_is_ready(gpio->spec.port)) { + LOG_ERR("GPIO is not ready: %s", gpio->spec.port->name); return -ENODEV; } - int err = gpio_pin_configure_dt(gpio, GPIO_INPUT); + int err = gpio_pin_configure_dt(&gpio->spec, GPIO_INPUT); if (err) { - LOG_ERR("Unable to configure pin %u on %s for input", gpio->pin, gpio->port->name); + LOG_ERR("Unable to configure pin %u on %s for input", gpio->spec.pin, + gpio->spec.port->name); return err; } - LOG_DBG("Configured pin %u on %s for input", gpio->pin, gpio->port->name); + LOG_DBG("Configured pin %u on %s for input", gpio->spec.pin, gpio->spec.port->name); #if USE_INTERRUPTS struct kscan_matrix_data *data = dev->data; - struct kscan_matrix_irq_callback *irq = &data->irqs[index]; + struct kscan_matrix_irq_callback *irq = &data->irqs[gpio->index]; irq->dev = dev; - gpio_init_callback(&irq->callback, kscan_matrix_irq_callback_handler, BIT(gpio->pin)); - err = gpio_add_callback(gpio->port, &irq->callback); + gpio_init_callback(&irq->callback, kscan_matrix_irq_callback_handler, BIT(gpio->spec.pin)); + err = gpio_add_callback(gpio->spec.port, &irq->callback); if (err) { LOG_ERR("Error adding the callback to the input device: %i", err); return err; @@ -361,11 +358,11 @@ static int kscan_matrix_init_input_inst(const struct device *dev, const struct g } static int kscan_matrix_init_inputs(const struct device *dev) { - const struct kscan_matrix_config *config = dev->config; + const struct kscan_matrix_data *data = dev->data; - for (int i = 0; i < config->inputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->inputs.gpios[i]; - int err = kscan_matrix_init_input_inst(dev, gpio, i); + for (int i = 0; i < data->inputs.len; i++) { + const struct kscan_gpio *gpio = &data->inputs.gpios[i]; + int err = kscan_matrix_init_input_inst(dev, gpio); if (err) { return err; } @@ -396,7 +393,7 @@ static int kscan_matrix_init_outputs(const struct device *dev) { const struct kscan_matrix_config *config = dev->config; for (int i = 0; i < config->outputs.len; i++) { - const struct gpio_dt_spec *gpio = &config->outputs.gpios[i]; + const struct gpio_dt_spec *gpio = &config->outputs.gpios[i].spec; int err = kscan_matrix_init_output_inst(dev, gpio); if (err) { return err; @@ -411,6 +408,9 @@ static int kscan_matrix_init(const struct device *dev) { data->dev = dev; + // Sort inputs by port so we can read each port just once per scan. + kscan_gpio_list_sort_by_port(&data->inputs); + kscan_matrix_init_inputs(dev); kscan_matrix_init_outputs(dev); kscan_matrix_set_all_outputs(dev, 0); @@ -432,10 +432,10 @@ static const struct kscan_driver_api kscan_matrix_api = { BUILD_ASSERT(INST_DEBOUNCE_RELEASE_MS(n) <= DEBOUNCE_COUNTER_MAX, \ "ZMK_KSCAN_DEBOUNCE_RELEASE_MS or debounce-release-ms is too large"); \ \ - static const struct gpio_dt_spec kscan_matrix_rows_##n[] = { \ + static struct kscan_gpio kscan_matrix_rows_##n[] = { \ LISTIFY(INST_ROWS_LEN(n), KSCAN_GPIO_ROW_CFG_INIT, (, ), n)}; \ \ - static const struct gpio_dt_spec kscan_matrix_cols_##n[] = { \ + static struct kscan_gpio kscan_matrix_cols_##n[] = { \ LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (, ), n)}; \ \ static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ @@ -444,14 +444,14 @@ static const struct kscan_driver_api kscan_matrix_api = { (static struct kscan_matrix_irq_callback kscan_matrix_irqs_##n[INST_INPUTS_LEN(n)];)) \ \ static struct kscan_matrix_data kscan_matrix_data_##n = { \ + .inputs = \ + KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_cols_##n), (kscan_matrix_rows_##n))), \ .matrix_state = kscan_matrix_state_##n, \ COND_INTERRUPTS((.irqs = kscan_matrix_irqs_##n, ))}; \ \ static struct kscan_matrix_config kscan_matrix_config_##n = { \ - .rows = KSCAN_GPIO_LIST(kscan_matrix_rows_##n), \ - .cols = KSCAN_GPIO_LIST(kscan_matrix_cols_##n), \ - .inputs = \ - KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_cols_##n), (kscan_matrix_rows_##n))), \ + .rows = ARRAY_SIZE(kscan_matrix_rows_##n), \ + .cols = ARRAY_SIZE(kscan_matrix_cols_##n), \ .outputs = \ KSCAN_GPIO_LIST(COND_DIODE_DIR(n, (kscan_matrix_rows_##n), (kscan_matrix_cols_##n))), \ .debounce_config = \ From a2af74f5ab4d2d7142791ae55cab11d59b29bc4d Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 21:25:12 -0700 Subject: [PATCH 365/494] feat(docs): Add note on modifier functions to macros --- docs/docs/behaviors/macros.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 1648892e..1628e0cb 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -33,7 +33,7 @@ A macro definition looks like: :::note The text before the colon (`:`) in the declaration of the macro node is the "node label", and is the text -used to reference the macro in your keymap +used to reference the macro in your keymap. ::: The macro can then be bound in your keymap by referencing it by the label `&zed_em_kay`, e.g.: @@ -44,6 +44,11 @@ The macro can then be bound in your keymap by referencing it by the label `&zed_ }; ``` +:::note +For use cases involving sending a single keycode with modifiers, for instance ctrl+tab, the [key press behavior](key-press.md) +with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. +::: + ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can From 0508718d6ce8b40adbe932b0bd9bb30ee5e0bbf5 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 21:52:16 -0700 Subject: [PATCH 366/494] feat(docs): Add behavior types section for hold-tap --- docs/docs/behaviors/hold-tap.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index f0096606..2a8489a1 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -133,6 +133,23 @@ See the following example, which uses a hold-tap behavior definition, configured By default, `hold-trigger-key-positions` are evaluated upon the first _key press_ after the hold-tap. For homerow mods, this is not always ideal, because it prevents combining multiple modifiers unless they are included in `hold-trigger-key-positions`. To overwrite this behavior, one can set `hold-trigger-on-release`. If set to true, the evaluation of `hold-trigger-key-positions` gets delayed until _key release_. This allows combining multiple modifiers when the next key is _held_, while still deciding the hold-tap in favor of a tap when the next key is _tapped_. +#### Using different behavior types with hold-taps + +You can create instances of hold-taps invoking most [behavior types](../features/keymaps.md#behaviors) for hold or tap actions, by referencing their node labels in the `bindings` value. +The two parameters that are passed to the hold-tap in your keymap will be forwarded to the referred behaviors, first one to the hold behavior and second one to the tap. + +If you use behaviors that accept no parameters such as [mod-morphs](mod-morph.md) or [macros](macros.md), you can pass a dummy parameter value such as `0` to the hold-tap when you use it in your keymap. +For instance, a hold-tap with node label `caps` and `bindings = <&kp>, <&caps_word>;` can be used in the keymap as below to send the caps lock keycode on hold and invoke the [caps word behavior](caps-word.md) on tap: + +``` +&caps CAPS 0 +``` + +:::info +You cannot use behaviors that expect more than one parameter such as [`&bt`](bluetooth.md) and [`&rgb_ug`](underglow.md) with hold-taps, due to the limitations of the [devicetree keymap format](../config/index.md#devicetree-files). +One workaround is to create a [macro](macros.md) that invokes those behaviors and use the macro as the hold or tap action. +::: + ### Example Use-Cases Date: Mon, 29 May 2023 22:03:24 -0700 Subject: [PATCH 367/494] feat(docs): Add troubleshooting for Windows issue --- docs/docs/features/bluetooth.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index f1a3e241..ff182398 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -57,3 +57,18 @@ If you attempt to pair a ZMK keyboard from macOS in a way that causes a bonding 1. Remove the keyboard from macOS using the Bluetooth control panel. 1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the macOS device is active, by pressing the correct keys for your particular keymap. 1. Try connecting again from macOS. + +### Windows Connected But Not Working + +Occasionally pairing the keyboard to a Windows device might result in a state where the keyboard is connected but does not send any key strokes. +If this occurs: + +1. Remove the keyboard from Windows using the Bluetooth settings. +1. Invoke `&bt BT_CLR` on the keyboard while the profile associated with the Windows device is active, by pressing the correct keys for your particular keymap. +1. Turn off Bluetooth from Windows settings, then turn it back on. +1. Pair the keyboard to the Windows device. + +If this doesn't help, try following the procedure above but replace step 3 with one of the following: + +- Restart the Windows device +- Open "Device Manager," turn on "Show hidden devices" from the "View" menu, then find and delete the keyboard under the "Bluetooth" item From 30ba4b08aed896d77fb7ade96ef0334d8f30af5d Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Mon, 29 May 2023 22:06:09 -0700 Subject: [PATCH 368/494] feat(docs): Add pointer to Bluetooth page in troubleshooting --- docs/docs/troubleshooting.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index 96f729b9..e8a05b6b 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -5,6 +5,8 @@ sidebar_title: Troubleshooting The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite). +Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page. + ### File Transfer Error Variations of the warnings shown below occur when flashing the `.uf2` onto the microcontroller. This is because the microcontroller resets itself before the OS receives confirmation that the file transfer is complete. Errors like this are normal and can generally be ignored. Verification of a functional board can be done by attempting to pair your newly flashed keyboard to your computer via Bluetooth or plugging in a USB cable if `ZMK_USB` is enabled in your Kconfig.defconfig. From a9ad11f91e82e214d91cf9bf1586431060759f06 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 18:42:50 -0700 Subject: [PATCH 369/494] refactor(docs): Move BT troubleshooting items to BT page --- docs/docs/features/bluetooth.md | 14 ++++++++++++++ docs/docs/troubleshooting.md | 16 +--------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index ff182398..386ad70e 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -38,6 +38,20 @@ Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](.. ## Troubleshooting +### Connectivity Issues + +Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: + +``` +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y +``` + +For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) + +### Using bluetooth output with USB power + +If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. + ## Known Issues There are a few known issues related to BLE and ZMK: diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index e8a05b6b..d47671bc 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -5,7 +5,7 @@ sidebar_title: Troubleshooting The following page provides suggestions for common errors that may occur during firmware compilation or other issues with keyboard usage. If the information provided is insufficient to resolve the issue, feel free to seek out help from the [ZMK Discord](https://zmk.dev/community/discord/invite). -Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page. +Please also see [the troubleshooting section](features/bluetooth.md#troubleshooting) under the Bluetooth feature page for issues related to bluetooth. ### File Transfer Error @@ -102,17 +102,3 @@ Perform the following steps to reset both halves of your split keyboard: 1. Flash the actual image for each half of the split keyboard (e.g `my_board_left.uf2` to the left half, `my_board_right.uf2` to the right half). After completing these steps, pair the halves of the split keyboard together by resetting them at the same time. Most commonly, this is done by grounding the reset pins for each of your keyboard's microcontrollers or pressing the reset buttons at the same time. - -### Connectivity Issues - -Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: - -``` -CONFIG_BT_CTLR_TX_PWR_PLUS_8=y -``` - -For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) - -### Other notes and warnings - -- If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. From 0682bc3aa6d9b9deac48b5aa6c781241075819b3 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 18:45:15 -0700 Subject: [PATCH 370/494] feat(docs): Note split connectivity improvement with TX power --- docs/docs/features/bluetooth.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index 386ad70e..9637c4d0 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -48,6 +48,10 @@ CONFIG_BT_CTLR_TX_PWR_PLUS_8=y For the `nRF52840`, the value `PLUS_8` can be set to any multiple of four between `MINUS_20` and `PLUS_8`. The default value for this config is `0`, but if you are having connection issues it is recommended to set it to `PLUS_8` because the power consumption difference is negligible. For more information on changing the transmit power of your BLE device, please refer to [the Zephyr docs.](https://docs.zephyrproject.org/latest/kconfig.html#CONFIG_BT_CTLR_TX_PWR) +:::info +This setting can also improve the connection strength between the keyboard halves for split keyboards. +::: + ### Using bluetooth output with USB power If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. From ace11e327fbfb4c4c894bb66328156d4d0b7eda0 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 2 Jun 2023 20:46:13 -0700 Subject: [PATCH 371/494] fix(docs): Fix broken link in BT troubleshooting --- docs/docs/features/bluetooth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index 9637c4d0..b75b8953 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -54,7 +54,7 @@ This setting can also improve the connection strength between the keyboard halve ### Using bluetooth output with USB power -If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../docs/behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. +If you want to test bluetooth output on your keyboard and are powering it through the USB connection rather than a battery, you will be able to pair with a host device but may not see keystrokes sent. In this case you need to use the [output selection behavior](../behaviors/outputs.md) to prefer sending keystrokes over bluetooth rather than USB. This might be necessary even if you are not powering from a device capable of receiving USB inputs, such as a USB charger. ## Known Issues From 19d883cdfe679977023116dcf689ce67a6ce548d Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 3 Jun 2023 02:53:20 +0000 Subject: [PATCH 372/494] fix(bluetooth): Passkey pairing improvements. * Capture the last 6 entered digits, and then require pressing Enter/Return to submit the entered digits. This matches the messaging shown on hosts regarding how to complete pairing. * Fix the wording on the Kconfig menu item to accurately describe the feature. --- app/Kconfig | 3 ++- app/src/ble.c | 47 +++++++++++++++++++++-------------- docs/docs/config/bluetooth.md | 7 +++--- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index d1b6682f..1537bd61 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -160,8 +160,9 @@ config BT_DEVICE_APPEARANCE default 961 config ZMK_BLE_PASSKEY_ENTRY - bool "Experimental: Requiring typing passkey from host to pair BLE connection" + bool "Require passkey entry on the keyboard to complete pairing" default n + select RING_BUFFER config BT_PERIPHERAL_PREF_MIN_INT default 6 diff --git a/app/src/ble.c b/app/src/ble.c index c7bdc401..383a727d 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -42,8 +43,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define PASSKEY_DIGITS 6 static struct bt_conn *auth_passkey_entry_conn; -static uint8_t passkey_entries[PASSKEY_DIGITS] = {}; -static uint8_t passkey_digit = 0; +RING_BUF_DECLARE(passkey_entries, PASSKEY_DIGITS); #endif /* IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) */ @@ -469,7 +469,7 @@ static void auth_passkey_entry(struct bt_conn *conn) { bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); LOG_DBG("Passkey entry requested for %s", addr); - passkey_digit = 0; + ring_buf_reset(&passkey_entries); auth_passkey_entry_conn = bt_conn_ref(conn); } @@ -486,7 +486,7 @@ static void auth_cancel(struct bt_conn *conn) { auth_passkey_entry_conn = NULL; } - passkey_digit = 0; + ring_buf_reset(&passkey_entries); #endif LOG_DBG("Pairing cancelled: %s", addr); @@ -605,7 +605,7 @@ static int zmk_ble_init(const struct device *_arg) { #if IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) static bool zmk_ble_numeric_usage_to_value(const zmk_key_t key, const zmk_key_t one, - const zmk_key_t zero, uint32_t *value) { + const zmk_key_t zero, uint8_t *value) { if (key < one || key > zero) { return false; } @@ -634,7 +634,23 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { return ZMK_EV_EVENT_HANDLED; } - uint32_t val; + if (key == HID_USAGE_KEY_KEYBOARD_RETURN || key == HID_USAGE_KEY_KEYBOARD_RETURN_ENTER) { + uint8_t digits[PASSKEY_DIGITS]; + uint32_t count = ring_buf_get(&passkey_entries, digits, PASSKEY_DIGITS); + + uint32_t passkey = 0; + for (int i = 0; i < count; i++) { + passkey = (passkey * 10) + digits[i]; + } + + LOG_DBG("Final passkey: %d", passkey); + bt_conn_auth_passkey_entry(auth_passkey_entry_conn, passkey); + bt_conn_unref(auth_passkey_entry_conn); + auth_passkey_entry_conn = NULL; + return ZMK_EV_EVENT_HANDLED; + } + + uint8_t val; if (!(zmk_ble_numeric_usage_to_value(key, HID_USAGE_KEY_KEYBOARD_1_AND_EXCLAMATION, HID_USAGE_KEY_KEYBOARD_0_AND_RIGHT_PARENTHESIS, &val) || zmk_ble_numeric_usage_to_value(key, HID_USAGE_KEY_KEYPAD_1_AND_END, @@ -643,20 +659,13 @@ static int zmk_ble_handle_key_user(struct zmk_keycode_state_changed *event) { return ZMK_EV_EVENT_BUBBLE; } - passkey_entries[passkey_digit++] = val; - LOG_DBG("value entered: %d, digits collected so far: %d", val, passkey_digit); - - if (passkey_digit == PASSKEY_DIGITS) { - uint32_t passkey = 0; - for (int i = 0; i < PASSKEY_DIGITS; i++) { - passkey = (passkey * 10) + passkey_entries[i]; - } - - LOG_DBG("Final passkey: %d", passkey); - bt_conn_auth_passkey_entry(auth_passkey_entry_conn, passkey); - bt_conn_unref(auth_passkey_entry_conn); - auth_passkey_entry_conn = NULL; + if (ring_buf_space_get(&passkey_entries) <= 0) { + uint8_t discard_val; + ring_buf_get(&passkey_entries, &discard_val, 1); } + ring_buf_put(&passkey_entries, &val, 1); + LOG_DBG("value entered: %d, digits collected so far: %d", val, + ring_buf_size_get(&passkey_entries)); return ZMK_EV_EVENT_HANDLED; } diff --git a/docs/docs/config/bluetooth.md b/docs/docs/config/bluetooth.md index 420dd5c3..d2ddefdd 100644 --- a/docs/docs/config/bluetooth.md +++ b/docs/docs/config/bluetooth.md @@ -9,6 +9,7 @@ See [Configuration Overview](index.md) for instructions on how to change these s ## Kconfig -| Option | Type | Description | Default | -| ------------------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------- | ------- | -| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | +| Option | Type | Description | Default | +| ------------------------------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_BLE_PASSKEY_ENTRY` | bool | Enable passkey entry during pairing for enhanced security. (Note: After enabling this, you will need to re-pair all previously paired hosts) | n | +| `CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION` | bool | Low level setting for GATT subscriptions. Set to `n` to work around an annoying Windows bug with battery notifications. | y | From f08802eaa735b87fa089b81512a941a1bcc8ca4b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 5 Jun 2023 05:04:13 +0000 Subject: [PATCH 373/494] fix(boards): Proper i2c pinctrl for BlueMicro840 * Use the proper pin assignmets after the move to pinctrl for the Zephyr 3.2 migration. --- .../arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi index 15c48509..868d3c27 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi +++ b/app/boards/arm/bluemicro840/bluemicro840_v1-pinctrl.dtsi @@ -17,22 +17,22 @@ uart0_sleep: uart0_sleep { group1 { psels = , - ; + ; low-power-enable; }; }; i2c0_default: i2c0_default { group1 { - psels = , - ; + psels = , + ; }; }; i2c0_sleep: i2c0_sleep { group1 { - psels = , - ; + psels = , + ; low-power-enable; }; }; From 5d9ae8fffa869f36e3e0911bed92d41ed8640826 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 17 Jun 2022 17:44:31 -0400 Subject: [PATCH 374/494] feat(split): allow central to connect to multiple peripherals --- app/include/zmk/ble.h | 6 +- app/src/ble.c | 54 ++++++++---- app/src/split/bluetooth/Kconfig | 4 + app/src/split/bluetooth/central.c | 138 ++++++++++++++++++------------ 4 files changed, 130 insertions(+), 72 deletions(-) diff --git a/app/include/zmk/ble.h b/app/include/zmk/ble.h index 1c84777d..435fde49 100644 --- a/app/include/zmk/ble.h +++ b/app/include/zmk/ble.h @@ -14,8 +14,8 @@ IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)) #if ZMK_BLE_IS_CENTRAL -#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT 1 +#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS) +#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS #else #define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED #endif @@ -34,5 +34,5 @@ char *zmk_ble_active_profile_name(); int zmk_ble_unpair_all(); #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -void zmk_ble_set_peripheral_addr(bt_addr_le_t *addr); +int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr); #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ diff --git a/app/src/ble.c b/app/src/ble.c index 383a727d..ff82f3cf 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -47,12 +47,6 @@ RING_BUF_DECLARE(passkey_entries, PASSKEY_DIGITS); #endif /* IS_ENABLED(CONFIG_ZMK_BLE_PASSKEY_ENTRY) */ -#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -#define PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1) -#else -#define PROFILE_COUNT CONFIG_BT_MAX_PAIRED -#endif - enum advertising_type { ZMK_ADV_NONE, ZMK_ADV_DIR, @@ -84,7 +78,7 @@ static const struct bt_data zmk_ble_ad[] = { #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -static bt_addr_le_t peripheral_addr; +static bt_addr_le_t peripheral_addrs[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ @@ -283,9 +277,34 @@ char *zmk_ble_active_profile_name() { return profiles[active_profile].name; } #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) -void zmk_ble_set_peripheral_addr(bt_addr_le_t *addr) { - memcpy(&peripheral_addr, addr, sizeof(bt_addr_le_t)); - settings_save_one("ble/peripheral_address", addr, sizeof(bt_addr_le_t)); +int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { + for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { + // If the address is recognized and already stored in settings, return + // index and no additional action is necessary. + if (!bt_addr_le_cmp(&peripheral_addrs[i], addr)) { + return i; + } + + // If the peripheral address slot is open, store new peripheral in the + // slot and return index. This compares against BT_ADDR_LE_ANY as that + // is the zero value. + if (!bt_addr_le_cmp(&peripheral_addrs[i], BT_ADDR_LE_ANY)) { + char addr_str[BT_ADDR_LE_STR_LEN]; + bt_addr_le_to_str(addr, addr_str, sizeof(addr_str)); + LOG_DBG("Storing peripheral %s in slot %d", addr_str, i); + bt_addr_le_copy(&peripheral_addrs[i], addr); + + char setting_name[32]; + sprintf(setting_name, "ble/peripheral_addresses/%d", i); + settings_save_one(setting_name, addr, sizeof(bt_addr_le_t)); + + return i; + } + } + + // The peripheral does not match a known peripheral and there is no + // available slot. + return -ENOMEM; } #endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */ @@ -340,15 +359,20 @@ static int ble_profiles_handle_set(const char *name, size_t len, settings_read_c } } #if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - else if (settings_name_steq(name, "peripheral_address", &next) && !next) { + else if (settings_name_steq(name, "peripheral_addresses", &next) && next) { if (len != sizeof(bt_addr_le_t)) { return -EINVAL; } - int err = read_cb(cb_arg, &peripheral_addr, sizeof(bt_addr_le_t)); - if (err <= 0) { - LOG_ERR("Failed to handle peripheral address from settings (err %d)", err); - return err; + int i = atoi(next); + if (i < 0 || i >= ZMK_SPLIT_BLE_PERIPHERAL_COUNT) { + LOG_ERR("Failed to store peripheral address in memory"); + } else { + int err = read_cb(cb_arg, &peripheral_addrs[i], sizeof(bt_addr_le_t)); + if (err <= 0) { + LOG_ERR("Failed to handle peripheral address from settings (err %d)", err); + return err; + } } } #endif diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 005d75fd..e2c8d5c3 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -17,6 +17,10 @@ config ZMK_SPLIT_ROLE_CENTRAL if ZMK_SPLIT_ROLE_CENTRAL +config ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS + int "Number of peripherals that will connect to the central." + default 1 + config ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue when received from peripherals" default 5 diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index a7c0d8a9..53e61be6 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -26,7 +26,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include -static int start_scan(void); +static int start_scanning(void); #define POSITION_STATE_DATA_LEN 16 @@ -49,6 +49,8 @@ struct peripheral_slot { static struct peripheral_slot peripherals[ZMK_SPLIT_BLE_PERIPHERAL_COUNT]; +static bool is_scanning = false; + static const struct bt_uuid_128 split_service_uuid = BT_UUID_INIT_128(ZMK_SPLIT_BT_SERVICE_UUID); K_MSGQ_DEFINE(peripheral_event_msgq, sizeof(struct zmk_position_state_changed), @@ -130,8 +132,9 @@ int release_peripheral_slot(int index) { return 0; } -int reserve_peripheral_slot() { - for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { +int reserve_peripheral_slot(const bt_addr_le_t *addr) { + int i = zmk_ble_put_peripheral_addr(addr); + if (i >= 0) { if (peripherals[i].state == PERIPHERAL_SLOT_STATE_OPEN) { // Be sure the slot is fully reinitialized. release_peripheral_slot(i); @@ -344,9 +347,54 @@ static void split_central_process_connection(struct bt_conn *conn) { LOG_DBG("New connection params: Interval: %d, Latency: %d, PHY: %d", info.le.interval, info.le.latency, info.le.phy->rx_phy); + + // Restart scanning if necessary. + start_scanning(); } -static bool split_central_eir_found(struct bt_data *data, void *user_data) { +static int stop_scanning() { + LOG_DBG("Stopping peripheral scanning"); + is_scanning = false; + + int err = bt_le_scan_stop(); + if (err < 0) { + LOG_ERR("Stop LE scan failed (err %d)", err); + return err; + } + + return 0; +} + +static bool split_central_eir_found(const bt_addr_le_t *addr) { + LOG_DBG("Found the split service"); + + // Stop scanning so we can connect to the peripheral device. + int err = stop_scanning(); + if (err < 0) { + return false; + } + + int slot_idx = reserve_peripheral_slot(addr); + if (slot_idx < 0) { + LOG_ERR("Failed to reserve peripheral slot (err %d)", slot_idx); + return false; + } + + struct peripheral_slot *slot = &peripherals[slot_idx]; + + LOG_DBG("Initiating new connnection"); + struct bt_le_conn_param *param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); + if (err < 0) { + LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, BT_HCI_OP_LE_CREATE_CONN); + release_peripheral_slot(slot_idx); + start_scanning(); + } + + return false; +} + +static bool split_central_eir_parse(struct bt_data *data, void *user_data) { bt_addr_le_t *addr = user_data; int i; @@ -361,9 +409,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { } for (i = 0; i < data->data_len; i += 16) { - struct bt_le_conn_param *param; struct bt_uuid_128 uuid; - int err; if (!bt_uuid_create(&uuid.uuid, &data->data[i], 16)) { LOG_ERR("Unable to load UUID"); @@ -381,46 +427,7 @@ static bool split_central_eir_found(struct bt_data *data, void *user_data) { continue; } - LOG_DBG("Found the split service"); - - zmk_ble_set_peripheral_addr(addr); - - err = bt_le_scan_stop(); - if (err) { - LOG_ERR("Stop LE scan failed (err %d)", err); - continue; - } - - uint8_t slot_idx = reserve_peripheral_slot(); - if (slot_idx < 0) { - LOG_ERR("Faild to reserve peripheral slot (err %d)", slot_idx); - continue; - } - - struct peripheral_slot *slot = &peripherals[slot_idx]; - - slot->conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr); - if (slot->conn) { - LOG_DBG("Found existing connection"); - split_central_process_connection(slot->conn); - err = bt_conn_le_phy_update(slot->conn, BT_CONN_LE_PHY_PARAM_2M); - if (err) { - LOG_ERR("Update phy conn failed (err %d)", err); - } - } else { - param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); - - LOG_DBG("Initiating new connnection"); - - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); - if (err) { - LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, - BT_HCI_OP_LE_CREATE_CONN); - start_scan(); - } - } - - return false; + return split_central_eir_found(addr); } } @@ -436,15 +443,34 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui /* We're only interested in connectable events */ if (type == BT_GAP_ADV_TYPE_ADV_IND || type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { - bt_data_parse(ad, split_central_eir_found, (void *)addr); + bt_data_parse(ad, split_central_eir_parse, (void *)addr); } } -static int start_scan(void) { - int err; +static int start_scanning(void) { + // No action is necessary if central is already scanning. + if (is_scanning) { + LOG_DBG("Scanning already running"); + return 0; + } - err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, split_central_device_found); - if (err) { + // If all the devices are connected, there is no need to scan. + bool has_unconnected = false; + for (int i = 0; i < CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS; i++) { + if (peripherals[i].conn == NULL) { + has_unconnected = true; + break; + } + } + if (!has_unconnected) { + LOG_DBG("All devices are connected, scanning is unnecessary"); + return 0; + } + + // Start scanning otherwise. + is_scanning = true; + int err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, split_central_device_found); + if (err < 0) { LOG_ERR("Scanning failed to start (err %d)", err); return err; } @@ -471,7 +497,7 @@ static void split_central_connected(struct bt_conn *conn, uint8_t conn_err) { release_peripheral_slot_for_conn(conn); - start_scan(); + start_scanning(); return; } @@ -495,7 +521,7 @@ static void split_central_disconnected(struct bt_conn *conn, uint8_t reason) { return; } - start_scan(); + start_scanning(); } static struct bt_conn_cb conn_callbacks = { @@ -527,6 +553,10 @@ void split_central_split_run_callback(struct k_work *work) { LOG_ERR("Source not connected"); continue; } + if (!peripherals[payload_wrapper.source].run_behavior_handle) { + LOG_ERR("Run behavior handle not found"); + continue; + } int err = bt_gatt_write_without_response( peripherals[payload_wrapper.source].conn, @@ -590,7 +620,7 @@ int zmk_split_bt_central_init(const struct device *_arg) { CONFIG_ZMK_BLE_THREAD_PRIORITY, NULL); bt_conn_cb_register(&conn_callbacks); - return start_scan(); + return start_scanning(); } SYS_INIT(zmk_split_bt_central_init, APPLICATION, CONFIG_ZMK_BLE_INIT_PRIORITY); From a5c57fa224ba410100dde4e64222505bfb2b89ea Mon Sep 17 00:00:00 2001 From: Albert Y <76888457+filterpaper@users.noreply.github.com> Date: Tue, 6 Jun 2023 13:22:39 +0800 Subject: [PATCH 375/494] feat(docs): Add an example for combining just modifiers (#1826) Co-authored-by: Cem Aksoylar --- docs/docs/codes/modifiers.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/codes/modifiers.mdx b/docs/docs/codes/modifiers.mdx index 483e34af..db88ee92 100644 --- a/docs/docs/codes/modifiers.mdx +++ b/docs/docs/codes/modifiers.mdx @@ -38,6 +38,8 @@ These functions take the form: `XX(code)` - `&kp LS(A)` = `LEFT_SHIFT`+`A` (a capitalized **A**). - They can be combined: - `&kp LC(RA(B))` = `LEFT_CONTROL`+`RIGHT_ALT`+`B` +- They can be applied to a modifier keycode to create combined modifier keys: + - `&kp LS(LALT)` = `LEFT_SHIFT` + `LEFT_ALT` - Some basic codes already include a modifier function in their definition: - `DOLLAR` = `LS(NUMBER_4)` - There are left- and right-handed versions of each modifier (also see table above): From 98524a95671fe9d819a65d1515f9bc37895efc3d Mon Sep 17 00:00:00 2001 From: kadoyau <11990327+kadoyau@users.noreply.github.com> Date: Sun, 11 Jun 2023 04:32:50 +0900 Subject: [PATCH 376/494] fix(docs): Fix INT6 keycode description --- docs/src/data/hid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index 00d48f3f..45767172 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -3477,7 +3477,7 @@ export default [ }, { names: ["INTERNATIONAL_6", "INT6", "INT_KPJPCOMMA"], - description: ", [カソマ] (International 6)", + description: ", [カンマ] (International 6)", context: "Keyboard", clarify: false, usages: [ From 9d39a87f67668b4c083e09b04adf006d6fd1385d Mon Sep 17 00:00:00 2001 From: pixls Date: Sat, 10 Jun 2023 20:49:30 -0400 Subject: [PATCH 377/494] fix(docs): Change user-setup.md order to agree with order in setup script Fixes #1281 Co-authored-by: Cem Aksoylar --- docs/docs/user-setup.md | 47 +++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index a2e491b8..8faa72df 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -88,36 +88,41 @@ powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('http +### Keyboard Selection + +When prompted, enter the number for the corresponding keyboard you would like to target: + +``` +Keyboard Selection: + 1) 2% Milk 19) Ferris 0.2 37) Nibble + 2) A. Dux 20) Fourier Rev. 1 38) nice!60 + 3) BAT43 21) Helix 39) Osprette + 4) BDN9 Rev2 22) Hummingbird 40) Pancake + 5) BFO-9000 23) Iris 41) Planck Rev6 + 6) Boardsource 3x4 Macropad 24) etc... +Pick an keyboard: +``` + +:::note For a keyboard not in the included list: +If you are building firmware for a new keyboard that is not included in the built-in +list of keyboards, you can choose any keyboard from the list that is similar to yours (e.g. in terms of unibody/split and [onboard controller](hardware.mdx#onboard)/[composite](hardware.mdx#composite)) to generate the repository, +and edit / add necessary files. You can follow the [new shield guide](development/new-shield.md) if you are adding support for a composite keyboard. +::: + ### MCU Board Selection +If the keyboard selected uses an onboard controller you will skip this step. When prompted, enter the number for the corresponding MCU board you would like to target: ``` MCU Board Selection: -1) nice!nano -2) QMK Proton-C -3) Quit +1) BlueMicro840 v1 5) nRF52840 M.2 Module 9) QMK Proton-C +2) Mikoto 5.20 6) nRFMicro 1.1 (flipped) 10) Seeeduino XIAO +3) nice!nano v1 7) nRFMicro 1.1/1.2 11) Seeeduino XIAO BLE +4) nice!nano v2 8) nRFMicro 1.3/1.4 12) Quit Pick an MCU board: ``` -### Keyboard Shield Selection - -:::note -If you are building firmware for a new keyboard shield that is not included in the built-in -list of shields, you can choose any shield from the list that is similar to yours to generate the repository, -and edit / add necessary files according to the [guide for adding new keyboard shield](development/new-shield.md). -::: - -When prompted, enter the number for the corresponding keyboard shield you would like to target: - -``` -Keyboard Shield Selection: -1) Kyria -2) Lily58 -3) Quit -Pick an keyboard: -``` - ### Keymap Customization At the next prompt, you have an opportunity to decide if you want the stock keymap file copied in From 0be0d0763081de0c163dd26c29752d1085381dbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 04:35:54 +0000 Subject: [PATCH 378/494] chore(deps): bump minimatch and serve-handler in /docs Bumps [minimatch](https://github.com/isaacs/minimatch) and [serve-handler](https://github.com/zeit/serve-handler). These dependencies needed to be updated together. Updates `minimatch` from 3.0.4 to 3.1.2 - [Release notes](https://github.com/isaacs/minimatch/releases) - [Commits](https://github.com/isaacs/minimatch/compare/v3.0.4...v3.1.2) Updates `serve-handler` from 6.1.3 to 6.1.5 - [Release notes](https://github.com/zeit/serve-handler/releases) - [Commits](https://github.com/zeit/serve-handler/compare/6.1.3...6.1.5) --- updated-dependencies: - dependency-name: minimatch dependency-type: indirect - dependency-name: serve-handler dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 3183a51c..f0cd1fc8 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -13612,31 +13612,20 @@ } }, "node_modules/serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", @@ -25765,28 +25754,20 @@ } }, "serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "requires": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" }, "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, "path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", From 9d714c0b69fee2098a010d29e534051aeca26386 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Jun 2023 06:47:34 +0000 Subject: [PATCH 379/494] chore(deps-dev): bump webpack from 5.80.0 to 5.86.0 in /docs Bumps [webpack](https://github.com/webpack/webpack) from 5.80.0 to 5.86.0. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.80.0...v5.86.0) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 46 +++++++++++++++++++++--------------------- docs/package.json | 2 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index f0cd1fc8..5badb07e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -42,7 +42,7 @@ "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^5.0.4", - "webpack": "^5.80.0" + "webpack": "^5.86.0" } }, "node_modules/@algolia/autocomplete-core": { @@ -3950,9 +3950,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "peerDependencies": { "acorn": "^8" } @@ -6069,9 +6069,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -15390,9 +15390,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -15400,10 +15400,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -18899,9 +18899,9 @@ "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "requires": {} }, "acorn-jsx": { @@ -20426,9 +20426,9 @@ } }, "enhanced-resolve": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", - "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -27031,9 +27031,9 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.80.0.tgz", - "integrity": "sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==", + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -27041,10 +27041,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.13.0", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/docs/package.json b/docs/package.json index 15d5aa38..d82e54ec 100644 --- a/docs/package.json +++ b/docs/package.json @@ -61,6 +61,6 @@ "prettier": "^2.8.7", "string-replace-loader": "^3.1.0", "typescript": "^5.0.4", - "webpack": "^5.80.0" + "webpack": "^5.86.0" } } From 9ff1eaeb5a5f892d17ca87c38697466fd48fc301 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 11:44:49 -0500 Subject: [PATCH 380/494] fix: Enable BT_TINYCRYPT_ECC when using HCI BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY to work on setups that use BT HCI like the nRF5340. --- app/Kconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Kconfig b/app/Kconfig index 1537bd61..18ee473d 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -120,6 +120,10 @@ menuconfig ZMK_BLE if ZMK_BLE +# BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY when using HCI +config BT_TINYCRYPT_ECC + default y if BT_HCI && !BT_CTLR + choice BT_LL_SW_LLCP_IMPL default BT_LL_SW_LLCP_LEGACY From dcf5e75fa674184d9615793882db1c3f4c4194b9 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 13:08:33 -0500 Subject: [PATCH 381/494] fix(boards): Bump nRF5340 DK I2C buffer size Increased the I2C buffer size again, since it needs to be at least 641 to support 128x64 displays. --- app/boards/nrf5340dk_nrf5340_cpuapp.overlay | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay index 66d2332f..9427d9ca 100644 --- a/app/boards/nrf5340dk_nrf5340_cpuapp.overlay +++ b/app/boards/nrf5340dk_nrf5340_cpuapp.overlay @@ -6,5 +6,5 @@ &arduino_i2c { // Default buffer size is too small for use with displays. - zephyr,concat-buf-size = <512>; + zephyr,concat-buf-size = <1024>; }; From 2244bd3d81931753dfd170e804a90a487a205aa1 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 1 Sep 2021 03:49:18 +0000 Subject: [PATCH 382/494] refactor(sensors): Sensor event channel data, resolution tweaks. * Refactor sensor events to include channel data, necessary for prop split encoders, and avoiding duplicate calls, to fetch channel data twice, etc. * More consistent behavior driver API. * Allow setting triggers per resolution at the behavior level optionally. --- app/Kconfig | 20 +++ app/dts/bindings/zmk,keymap-sensors.yaml | 12 +- app/include/drivers/behavior.h | 26 ++-- app/include/zmk/events/sensor_event.h | 17 ++- app/include/zmk/sensors.h | 14 ++ app/include/zmk/virtual_key_position.h | 5 + app/src/behaviors/behavior_sensor_rotate.c | 8 +- .../behaviors/behavior_sensor_rotate_common.c | 59 +++++--- .../behaviors/behavior_sensor_rotate_common.h | 16 ++- .../behaviors/behavior_sensor_rotate_var.c | 6 +- app/src/keymap.c | 25 ++-- app/src/sensors.c | 133 +++++++++++++----- 12 files changed, 258 insertions(+), 83 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 18ee473d..1766bf07 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -194,6 +194,18 @@ rsource "src/split/Kconfig" #Basic Keyboard Setup endmenu +menu "Encoders" + +config ZMK_ENCODERS_DEFAULT_TRIGGERS_PER_ROTATION + int "Default behavior triggers per rotation" + help + Unless overridden for a specific behavior in the keymap/devicetree, this value + determines how many times to trigger the bound behavior per full rotation. + For tactile encoders with detents, this usually should match the number of + detents per rotation of the encoder. + default 30 + +endmenu menu "Display/LED Options" rsource "src/display/Kconfig" @@ -523,6 +535,14 @@ config ZMK_WPM config SENSOR default y +if ZMK_KEYMAP_SENSORS + +config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION + int "Default triggers per rotation" + default 20 + +endif # ZMK_KEYMAP_SENSORS + choice CBPRINTF_IMPLEMENTATION default CBPRINTF_NANO diff --git a/app/dts/bindings/zmk,keymap-sensors.yaml b/app/dts/bindings/zmk,keymap-sensors.yaml index a879684f..5282f25b 100644 --- a/app/dts/bindings/zmk,keymap-sensors.yaml +++ b/app/dts/bindings/zmk,keymap-sensors.yaml @@ -9,4 +9,14 @@ compatible: "zmk,keymap-sensors" properties: sensors: type: phandles - required: true + required: false + triggers-per-rotation: + type: int + required: false + +child-binding: + description: Per-sensor configuration settings + properties: + triggers-per-rotation: + type: int + required: false diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 380fc76f..0aa5d85e 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -12,6 +12,7 @@ #include #include #include +#include #include /** @@ -24,9 +25,10 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event); -typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); +typedef int (*behavior_sensor_keymap_binding_callback_t)( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size]); enum behavior_locality { BEHAVIOR_LOCALITY_CENTRAL, @@ -158,14 +160,15 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); +__syscall int behavior_sensor_keymap_binding_triggered( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); -static inline int -z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event) { +static inline int z_impl_behavior_sensor_keymap_binding_triggered( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); if (dev == NULL) { @@ -178,7 +181,8 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin return -ENOTSUP; } - return api->sensor_binding_triggered(binding, sensor, event); + return api->sensor_binding_triggered(binding, event, sensor_config, channel_data_size, + channel_data); } /** diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index 9398bcbb..5a5aa3ac 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,12 +6,21 @@ #pragma once -#include + +#include #include -#include +#include +#include + +// TODO: Move to Kconfig when we need more than one channel +#define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 + struct zmk_sensor_event { - uint8_t sensor_number; - const struct device *sensor; + uint8_t sensor_position; + + size_t channel_data_size; + struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS]; + int64_t timestamp; }; diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 9e54695f..41061127 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -6,6 +6,9 @@ #pragma once +#include + +#define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) @@ -15,3 +18,14 @@ #else #define ZMK_KEYMAP_SENSORS_LEN 0 #endif + +const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position); + +struct zmk_sensor_config { + uint16_t triggers_per_rotation; +}; + +struct zmk_sensor_channel_data { + enum sensor_channel channel; + struct sensor_value value; +}; diff --git a/app/include/zmk/virtual_key_position.h b/app/include/zmk/virtual_key_position.h index 48deee5c..b8f20683 100644 --- a/app/include/zmk/virtual_key_position.h +++ b/app/include/zmk/virtual_key_position.h @@ -14,6 +14,11 @@ */ #define ZMK_VIRTUAL_KEY_POSITION_SENSOR(index) (ZMK_KEYMAP_LEN + (index)) +/** + * Gets the sensor number from the virtual key position. + */ +#define ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(vkp) ((vkp)-ZMK_KEYMAP_LEN) + /** * Gets the virtual key position to use for the combo with the given index. */ diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index e12278bb..86846d5b 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -33,8 +33,10 @@ static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; .tap_ms = DT_INST_PROP_OR(n, tap_ms, 5), \ .override_params = false, \ }; \ - DEVICE_DT_INST_DEFINE( \ - n, behavior_sensor_rotate_init, NULL, NULL, &behavior_sensor_rotate_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_driver_api); + static struct behavior_sensor_rotate_data behavior_sensor_rotate_data_##n = {}; \ + DEVICE_DT_INST_DEFINE(n, behavior_sensor_rotate_init, NULL, &behavior_sensor_rotate_data_##n, \ + &behavior_sensor_rotate_config_##n, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_INST) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index bd31170e..99e4e019 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -5,48 +5,75 @@ #include #include +#include #include "behavior_sensor_rotate_common.h" LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event) { + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); const struct behavior_sensor_rotate_config *cfg = dev->config; + struct behavior_sensor_rotate_data *data = dev->data; - struct sensor_value value; + const struct sensor_value value = channel_data[0].value; + int triggers; + int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); - const int err = sensor_channel_get(sensor, SENSOR_CHAN_ROTATION, &value); + // Some funky special casing for "old encoder behavior" where ticks where reported in val2 only, + // instead of rotational degrees in val1. + // REMOVE ME: Remove after a grace period of old ec11 sensor behavior + if (value.val1 == 0) { + triggers = value.val2; + } else { + struct sensor_value remainder = data->remainder[sensor_position]; - if (err < 0) { - LOG_WRN("Failed to get sensor rotation value: %d", err); - return err; + remainder.val1 += value.val1; + remainder.val2 += value.val2; + + if (remainder.val2 >= 1000000 || remainder.val2 <= 1000000) { + remainder.val1 += remainder.val2 / 1000000; + remainder.val2 %= 1000000; + } + + int trigger_degrees = 360 / sensor_config->triggers_per_rotation; + triggers = remainder.val1 / trigger_degrees; + remainder.val1 %= trigger_degrees; + + data->remainder[sensor_position] = remainder; } + LOG_DBG( + "val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X", + value.val1, value.val2, data->remainder[sensor_position].val1, + data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + struct zmk_behavior_binding triggered_binding; - switch (value.val1) { - case 1: + if (triggers > 0) { triggered_binding = cfg->cw_binding; if (cfg->override_params) { triggered_binding.param1 = binding->param1; } - break; - case -1: + } else if (triggers < 0) { + triggers = -triggers; triggered_binding = cfg->ccw_binding; if (cfg->override_params) { triggered_binding.param1 = binding->param2; } - break; - default: - return -ENOTSUP; + } else { + return 0; } LOG_DBG("Sensor binding: %s", binding->behavior_dev); - zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); - zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + for (int i = 0; i < triggers; i++) { + zmk_behavior_queue_add(event.position, triggered_binding, true, cfg->tap_ms); + zmk_behavior_queue_add(event.position, triggered_binding, false, 0); + } return ZMK_BEHAVIOR_OPAQUE; } diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index 2d58218d..eab443a3 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -1,5 +1,11 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ #include +#include struct behavior_sensor_rotate_config { struct zmk_behavior_binding cw_binding; @@ -8,6 +14,12 @@ struct behavior_sensor_rotate_config { bool override_params; }; +struct behavior_sensor_rotate_data { + struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN]; +}; + int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - const struct device *sensor, - struct zmk_behavior_binding_event event); \ No newline at end of file + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index a82267a5..95bb9961 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -24,8 +24,10 @@ static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; .tap_ms = DT_INST_PROP(n, tap_ms), \ .override_params = true, \ }; \ + static struct behavior_sensor_rotate_data behavior_sensor_rotate_var_data_##n = {}; \ DEVICE_DT_INST_DEFINE( \ - n, behavior_sensor_rotate_var_init, NULL, NULL, &behavior_sensor_rotate_var_config_##n, \ - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_sensor_rotate_var_driver_api); + n, behavior_sensor_rotate_var_init, NULL, &behavior_sensor_rotate_var_data_##n, \ + &behavior_sensor_rotate_var_config_##n, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_sensor_rotate_var_driver_api); DT_INST_FOREACH_STATUS_OKAY(SENSOR_ROTATE_VAR_INST) diff --git a/app/src/keymap.c b/app/src/keymap.c index da25fc09..16543d37 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,27 +252,34 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_triggered(uint8_t sensor_number, const struct device *sensor, - int64_t timestamp) { +int zmk_keymap_sensor_triggered( + uint8_t sensor_position, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size], int64_t timestamp) { for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { if (zmk_keymap_layer_active(layer)) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_number]; + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; const struct device *behavior; int ret; - LOG_DBG("layer: %d sensor_number: %d, binding name: %s", layer, sensor_number, + LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, binding->behavior_dev); behavior = device_get_binding(binding->behavior_dev); if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_number, layer); + LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); continue; } struct zmk_behavior_binding_event event = { - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_number), .timestamp = timestamp}; - ret = behavior_sensor_keymap_binding_triggered(binding, sensor, event); + .layer = layer, + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .timestamp = timestamp, + }; + + ret = behavior_sensor_keymap_binding_triggered( + binding, event, zmk_sensors_get_config_at_position(sensor_position), + channel_data_size, channel_data); if (ret > 0) { LOG_DBG("behavior processing to continue to next layer"); @@ -301,8 +308,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_triggered(sensor_ev->sensor_number, sensor_ev->sensor, - sensor_ev->timestamp); + return zmk_keymap_sensor_triggered(sensor_ev->sensor_position, sensor_ev->channel_data_size, + sensor_ev->channel_data, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/sensors.c b/app/src/sensors.c index 1b92147f..5f41c4f2 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -18,65 +18,128 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS -struct sensors_data_item { - uint8_t sensor_number; +struct sensors_item_cfg { + uint8_t sensor_position; + const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; }; -#define _SENSOR_ITEM(node) \ +#define _SENSOR_ITEM(idx, node) \ { \ - .dev = NULL, .trigger = {.type = SENSOR_TRIG_DELTA, .chan = SENSOR_CHAN_ROTATION } \ + .dev = DEVICE_DT_GET_OR_NULL(node), \ + .trigger = {.type = SENSOR_TRIG_DATA_READY, .chan = SENSOR_CHAN_ROTATION}, \ + .config = &configs[idx] \ + } +#define SENSOR_ITEM(idx, _i) _SENSOR_ITEM(idx, ZMK_KEYMAP_SENSORS_BY_IDX(idx)) + +#define PLUS_ONE(n) +1 +#define ZMK_KEYMAP_SENSORS_CHILD_COUNT (0 DT_FOREACH_CHILD(ZMK_KEYMAP_SENSORS_NODE, PLUS_ONE)) +#define SENSOR_CHILD_ITEM(node) \ + { \ + .triggers_per_rotation = \ + DT_PROP_OR(node, triggers_per_rotation, \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)) \ + } +#define SENSOR_CHILD_DEFAULTS(idx, arg) \ + { .triggers_per_rotation = DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, 20) } + +static struct zmk_sensor_config configs[] = { +#if ZMK_KEYMAP_SENSORS_CHILD_COUNT > 0 + DT_FOREACH_CHILD_SEP(ZMK_KEYMAP_SENSORS_NODE, SENSOR_CHILD_ITEM, (, )) +#else + LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_CHILD_DEFAULTS, (, ), 0) +#endif +}; + +static struct sensors_item_cfg sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; + +static ATOMIC_DEFINE(pending_sensors, ZMK_KEYMAP_SENSORS_LEN); + +const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position) { + if (sensor_position > ARRAY_SIZE(configs)) { + return NULL; } -#define SENSOR_ITEM(idx, _node) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_ITEM(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), ({})) + return &configs[sensor_position]; +} -static struct sensors_data_item sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_ITEM, (, ), 0)}; - -static void zmk_sensors_trigger_handler(const struct device *dev, - const struct sensor_trigger *trigger) { +static void trigger_sensor_data_for_position(uint32_t sensor_position) { int err; - const struct sensors_data_item *item = CONTAINER_OF(trigger, struct sensors_data_item, trigger); + const struct sensors_item_cfg *item = &sensors[sensor_position]; - LOG_DBG("sensor %d", item->sensor_number); - - err = sensor_sample_fetch(dev); + err = sensor_sample_fetch(item->dev); if (err) { LOG_WRN("Failed to fetch sample from device %d", err); return; } - ZMK_EVENT_RAISE(new_zmk_sensor_event((struct zmk_sensor_event){ - .sensor_number = item->sensor_number, .sensor = dev, .timestamp = k_uptime_get()})); -} + struct sensor_value value; + err = sensor_channel_get(item->dev, item->trigger.chan, &value); -static void zmk_sensors_init_item(const char *node, uint8_t i, uint8_t abs_i) { - LOG_DBG("Init %s at index %d with sensor_number %d", node, i, abs_i); - - sensors[i].dev = device_get_binding(node); - sensors[i].sensor_number = abs_i; - - if (!sensors[i].dev) { - LOG_WRN("Failed to find device for %s", node); + if (err) { + LOG_WRN("Failed to get channel data from device %d", err); return; } - sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); + ZMK_EVENT_RAISE(new_zmk_sensor_event( + (struct zmk_sensor_event){.sensor_position = item->sensor_position, + .channel_data = {(struct zmk_sensor_channel_data){ + .value = value, .channel = item->trigger.chan}}, + .timestamp = k_uptime_get()})); } -#define _SENSOR_INIT(node) \ - zmk_sensors_init_item(DT_PROP(node, label), local_index++, absolute_index++); -#define SENSOR_INIT(idx, _i) \ - COND_CODE_1(DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_BY_IDX(idx), okay), \ - (_SENSOR_INIT(ZMK_KEYMAP_SENSORS_BY_IDX(idx))), (absolute_index++;)) +static void run_sensors_data_trigger(struct k_work *work) { + for (int i = 0; i < ARRAY_SIZE(sensors); i++) { + if (atomic_test_and_clear_bit(pending_sensors, i)) { + trigger_sensor_data_for_position(i); + } + } +} + +K_WORK_DEFINE(sensor_data_work, run_sensors_data_trigger); + +static void zmk_sensors_trigger_handler(const struct device *dev, + const struct sensor_trigger *trigger) { + const struct sensors_item_cfg *test_item = + CONTAINER_OF(trigger, struct sensors_item_cfg, trigger); + int sensor_index = test_item - sensors; + + if (sensor_index < 0 || sensor_index >= ARRAY_SIZE(sensors)) { + LOG_ERR("Invalid sensor item triggered our callback"); + return; + } + + if (k_is_in_isr()) { + atomic_set_bit(pending_sensors, sensor_index); + k_work_submit(&sensor_data_work); + } else { + trigger_sensor_data_for_position(sensor_index); + } +} + +static void zmk_sensors_init_item(uint8_t i) { + LOG_DBG("Init sensor at index %d", i); + + sensors[i].sensor_position = i; + + if (!sensors[i].dev) { + LOG_DBG("No local device for %d", i); + return; + } + + int err = sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); + if (err) { + LOG_WRN("Failed to set sensor trigger (%d)", err); + } +} + +#define SENSOR_INIT(idx, _t) zmk_sensors_init_item(idx); static int zmk_sensors_init(const struct device *_arg) { - int local_index = 0; - int absolute_index = 0; - LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENSOR_INIT, (), 0) + return 0; } From 295ed83409ab0bede761eb2e51f4e4670e4dbf08 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 2 Dec 2021 15:07:29 +0000 Subject: [PATCH 383/494] refactor(sensors): ec11 rotation sensor value in degrees. * Add new `steps` property to the `aips,ec11` binding, to make the driver properly report degrees in the rotation delta channel. * Handle old sensor values in sensor rotate behavior. --- app/drivers/sensor/ec11/Kconfig | 2 ++ app/drivers/sensor/ec11/ec11.c | 33 +++++++++++++++---- app/drivers/sensor/ec11/ec11.h | 1 + .../zephyr/dts/bindings/sensor/alps,ec11.yaml | 5 +++ app/include/zmk/events/sensor_event.h | 4 +-- app/include/zmk/sensors.h | 2 +- 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/app/drivers/sensor/ec11/Kconfig b/app/drivers/sensor/ec11/Kconfig index e86d092a..5da32728 100644 --- a/app/drivers/sensor/ec11/Kconfig +++ b/app/drivers/sensor/ec11/Kconfig @@ -3,6 +3,8 @@ menuconfig EC11 bool "EC11 Incremental Encoder Sensor" + default y + depends on DT_HAS_ALPS_EC11_ENABLED depends on GPIO help Enable driver for EC11 incremental encoder sensors. diff --git a/app/drivers/sensor/ec11/ec11.c b/app/drivers/sensor/ec11/ec11.c index 7091f73e..ee8b41e7 100644 --- a/app/drivers/sensor/ec11/ec11.c +++ b/app/drivers/sensor/ec11/ec11.c @@ -16,6 +16,8 @@ #include "ec11.h" +#define FULL_ROTATION 360 + LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); static int ec11_get_ab_state(const struct device *dev) { @@ -59,9 +61,14 @@ static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) drv_data->pulses += delta; drv_data->ab_state = val; - drv_data->ticks = drv_data->pulses / drv_cfg->resolution; - drv_data->delta = delta; - drv_data->pulses %= drv_cfg->resolution; + // TODO: Temporary code for backwards compatibility to support + // the sensor channel rotation reporting *ticks* instead of delta of degrees. + // REMOVE ME + if (drv_cfg->steps == 0) { + drv_data->ticks = drv_data->pulses / drv_cfg->resolution; + drv_data->delta = delta; + drv_data->pulses %= drv_cfg->resolution; + } return 0; } @@ -69,13 +76,26 @@ static int ec11_sample_fetch(const struct device *dev, enum sensor_channel chan) static int ec11_channel_get(const struct device *dev, enum sensor_channel chan, struct sensor_value *val) { struct ec11_data *drv_data = dev->data; + const struct ec11_config *drv_cfg = dev->config; + int32_t pulses = drv_data->pulses; if (chan != SENSOR_CHAN_ROTATION) { return -ENOTSUP; } - val->val1 = drv_data->ticks; - val->val2 = drv_data->delta; + drv_data->pulses = 0; + + if (drv_cfg->steps > 0) { + val->val1 = (pulses * FULL_ROTATION) / drv_cfg->steps; + val->val2 = (pulses * FULL_ROTATION) % drv_cfg->steps; + if (val->val2 != 0) { + val->val2 *= 1000000; + val->val2 /= drv_cfg->steps; + } + } else { + val->val1 = drv_data->ticks; + val->val2 = drv_data->delta; + } return 0; } @@ -132,7 +152,8 @@ int ec11_init(const struct device *dev) { const struct ec11_config ec11_cfg_##n = { \ .a = GPIO_DT_SPEC_INST_GET(n, a_gpios), \ .b = GPIO_DT_SPEC_INST_GET(n, b_gpios), \ - COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ + .resolution = DT_INST_PROP_OR(n, resolution, 1), \ + .steps = DT_INST_PROP_OR(n, steps, 0), \ }; \ DEVICE_DT_INST_DEFINE(n, ec11_init, NULL, &ec11_data_##n, &ec11_cfg_##n, POST_KERNEL, \ CONFIG_SENSOR_INIT_PRIORITY, &ec11_driver_api); diff --git a/app/drivers/sensor/ec11/ec11.h b/app/drivers/sensor/ec11/ec11.h index 82c21572..4e2e5d26 100644 --- a/app/drivers/sensor/ec11/ec11.h +++ b/app/drivers/sensor/ec11/ec11.h @@ -14,6 +14,7 @@ struct ec11_config { const struct gpio_dt_spec a; const struct gpio_dt_spec b; + const uint16_t steps; const uint8_t resolution; }; diff --git a/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml b/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml index 5cbe77a2..3672ea30 100644 --- a/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml +++ b/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml @@ -18,4 +18,9 @@ properties: resolution: type: int description: Number of pulses per tick + deprecated: true + required: false + steps: + type: int + description: Number of pulses in one full rotation required: false diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index 5a5aa3ac..c5157447 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -6,11 +6,11 @@ #pragma once - +#include #include + #include #include -#include // TODO: Move to Kconfig when we need more than one channel #define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 41061127..06fbc63e 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) From f0f7e2081b5a4aa5bc35d7d8855b0e73e962319b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 26 May 2022 16:53:41 +0000 Subject: [PATCH 384/494] refactor(config): Select SENSOR as needed. * Don't force on SENSOR Kconfig setting unless needed based on the detected DT. --- app/Kconfig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 1766bf07..5b313eff 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -532,8 +532,11 @@ config ZMK_WPM bool "Calculate WPM" default n -config SENSOR +config ZMK_KEYMAP_SENSORS + bool "Enable Keymap Sensors support" default y + depends on DT_HAS_ZMK_KEYMAP_SENSORS_ENABLED + select SENSOR if ZMK_KEYMAP_SENSORS From 621d946d2926f28aa866947f110182726fa9ca10 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 21 May 2023 21:27:41 -0700 Subject: [PATCH 385/494] refactor(bluetooth): Bump HoG stack size. * Bump the default stack size for the HoG processing thread to avoid issues w/ some pathways. --- app/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 5b313eff..a54ad389 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -135,7 +135,7 @@ config SYSTEM_WORKQUEUE_STACK_SIZE config ZMK_BLE_THREAD_STACK_SIZE int "BLE notify thread stack size" - default 512 + default 768 config ZMK_BLE_THREAD_PRIORITY int "BLE notify thread priority" From f8aaaff556e1c43c6646ea1c1ee7faa2907cdf51 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 16 Apr 2023 08:18:57 +0000 Subject: [PATCH 386/494] refactor(shields): Updated ZMK Uno encoder config. * Move to new steps/triggers-per-rotation config. * Leverage QDEC Nordic driver when used on Nordic DK. --- .../boards/nrf52840dk_nrf52840.overlay | 24 +++++++++ app/boards/shields/zmk_uno/zmk_uno.overlay | 49 ++++++++++--------- 2 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay diff --git a/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay new file mode 100644 index 00000000..5ac7af7c --- /dev/null +++ b/app/boards/shields/zmk_uno/boards/nrf52840dk_nrf52840.overlay @@ -0,0 +1,24 @@ + +/ { + // First, delete the existing basic GPIO based instance. + /delete-node/ encoder; +}; + +&pinctrl { + qdec_default: qdec_default { + group1 { + psels = , + ; + bias-pull-up; + }; + }; +}; + +// Set up the QDEC hardware based driver and give it the same label as the deleted node. +encoder: &qdec0 { + status = "okay"; + led-pre = <0>; + steps = <80>; + pinctrl-0 = <&qdec_default>; + pinctrl-names = "default"; +}; diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 04332911..78f3b4a7 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -40,10 +40,10 @@ // Commented out until we add more powerful power domain support // external_power { - // compatible = "zmk,ext-power-generic"; - // label = "EXT_POWER"; - // init-delay-ms = <200>; - // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; + // compatible = "zmk,ext-power-generic"; + // label = "EXT_POWER"; + // init-delay-ms = <200>; + // control-gpios = <&arduino_header 1 GPIO_ACTIVE_LOW>; // }; rgb_power { @@ -128,14 +128,14 @@ diode-direction = "col2row"; col-gpios - = <&arduino_header 10 GPIO_ACTIVE_HIGH> - , <&arduino_header 9 GPIO_ACTIVE_HIGH> - ; + = <&arduino_header 10 GPIO_ACTIVE_HIGH> + , <&arduino_header 9 GPIO_ACTIVE_HIGH> + ; row-gpios - = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; + = <&arduino_header 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&arduino_header 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; }; @@ -144,11 +144,11 @@ status = "disabled"; input-gpios - = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&arduino_header 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; @@ -157,23 +157,26 @@ toggle-mode; input-gpios - = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + = <&arduino_header 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&arduino_header 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; }; encoder: encoder { label = "ENCODER"; - resolution = <4>; + steps = <80>; compatible = "alps,ec11"; - a-gpios = <&arduino_header 14 GPIO_PULL_UP>; - b-gpios = <&arduino_header 15 GPIO_PULL_UP>; + a-gpios = <&arduino_header 15 GPIO_PULL_UP>; + b-gpios = <&arduino_header 14 GPIO_PULL_UP>; }; - sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder>; + triggers-per-rotation = <20>; + left { + triggers-per-rotation = <20>; + }; }; }; From d781ec795b9d9e053ce71c30450ba2b979eab43b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 18 Apr 2023 07:14:18 +0000 Subject: [PATCH 387/494] refactor(bluetooth): Add battery reporting config. * Add dedicated battery reporting Kconfig that is `imply`d by enabling ZMK_BLE. --- app/CMakeLists.txt | 4 ++-- app/Kconfig | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index a647e883..ea3b8f73 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -77,8 +77,8 @@ endif() target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/behaviors/behavior_rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/behaviors/behavior_backlight.c) -target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/events/battery_state_changed.c) -target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/battery.c) +target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/events/battery_state_changed.c) +target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/battery.c) target_sources_ifdef(CONFIG_ZMK_SPLIT app PRIVATE src/events/split_peripheral_status_changed.c) add_subdirectory(src/split) diff --git a/app/Kconfig b/app/Kconfig index a54ad389..9c0606b0 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -114,9 +114,9 @@ menuconfig ZMK_BLE select BT_SMP_APP_PAIRING_ACCEPT select BT_PERIPHERAL select BT_DIS - select BT_BAS select BT_SETTINGS select SETTINGS + imply ZMK_BATTERY_REPORTING if ZMK_BLE @@ -322,6 +322,12 @@ endmenu menu "Power Management" +config ZMK_BATTERY_REPORTING + bool "Battery level detection/reporting" + default n + select SENSOR + select BT_BAS if ZMK_BLE + config ZMK_IDLE_TIMEOUT int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" default 30000 From 8b29f6d34556d98df60f529e84ee66e49e6bf0c0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 4 May 2023 00:04:20 +0000 Subject: [PATCH 388/494] refactor(sensors): Split data handling from triggers. * All sensor behaviors should see sensor data, then selectively only have some trigger their behaviors. --- app/include/drivers/behavior.h | 59 ++++++++++++-- app/src/behaviors/behavior_sensor_rotate.c | 3 +- .../behaviors/behavior_sensor_rotate_common.c | 31 +++++-- .../behaviors/behavior_sensor_rotate_common.h | 13 ++- .../behaviors/behavior_sensor_rotate_var.c | 3 +- app/src/keymap.c | 81 +++++++++++-------- 6 files changed, 135 insertions(+), 55 deletions(-) diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index 0aa5d85e..d7e57d02 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -23,9 +23,17 @@ * (Internal use only.) */ +enum behavior_sensor_binding_process_mode { + BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER, + BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD, +}; + typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event); -typedef int (*behavior_sensor_keymap_binding_callback_t)( +typedef int (*behavior_sensor_keymap_binding_process_callback_t)( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode); +typedef int (*behavior_sensor_keymap_binding_data_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data channel_data[channel_data_size]); @@ -41,7 +49,8 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_callback_t sensor_binding_triggered; + behavior_sensor_keymap_binding_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** * @endcond @@ -151,7 +160,7 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi } /** - * @brief Handle the a sensor keymap binding being triggered + * @brief Handle the a sensor keymap binding processing any incoming data from the sensor * @param binding Sensor keymap binding which was triggered. * @param sensor Pointer to the sensor device structure for the sensor driver instance. * @param virtual_key_position ZMK_KEYMAP_LEN + sensor number @@ -160,12 +169,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_triggered( +__syscall int behavior_sensor_keymap_binding_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data); -static inline int z_impl_behavior_sensor_keymap_binding_triggered( +static inline int z_impl_behavior_sensor_keymap_binding_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { @@ -177,12 +186,46 @@ static inline int z_impl_behavior_sensor_keymap_binding_triggered( const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; - if (api->sensor_binding_triggered == NULL) { + if (api->sensor_binding_data == NULL) { return -ENOTSUP; } - return api->sensor_binding_triggered(binding, event, sensor_config, channel_data_size, - channel_data); + return api->sensor_binding_data(binding, event, sensor_config, channel_data_size, channel_data); +} + +/** + * @brief Handle the keymap sensor binding being triggered after updating any local data + * @param dev Pointer to the device structure for the driver instance. + * @param param1 User parameter specified at time of behavior binding. + * @param param2 User parameter specified at time of behavior binding. + * + * @retval 0 If successful. + * @retval Negative errno code if failure. + */ +// clang-format off +__syscall int behavior_sensor_keymap_binding_process( + struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode); +// clang-format on + +static inline int +z_impl_behavior_sensor_keymap_binding_process(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode) { + const struct device *dev = device_get_binding(binding->behavior_dev); + + if (dev == NULL) { + return -EINVAL; + } + + const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; + + if (api->sensor_binding_process == NULL) { + return -ENOTSUP; + } + + return api->sensor_binding_process(binding, event, mode); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index 86846d5b..3b5bef62 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -13,7 +13,8 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { - .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 99e4e019..0a2b619d 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -11,13 +11,12 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data) { +int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); - const struct behavior_sensor_rotate_config *cfg = dev->config; struct behavior_sensor_rotate_data *data = dev->data; const struct sensor_value value = channel_data[0].value; @@ -52,6 +51,26 @@ int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *bindi value.val1, value.val2, data->remainder[sensor_position].val1, data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + data->triggers[sensor_position] = triggers; + return 0; +} + +int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + enum behavior_sensor_binding_process_mode mode) { + const struct device *dev = device_get_binding(binding->behavior_dev); + const struct behavior_sensor_rotate_config *cfg = dev->config; + struct behavior_sensor_rotate_data *data = dev->data; + + const int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + + if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { + data->triggers[sensor_position] = 0; + return 0; + } + + int triggers = data->triggers[sensor_position]; + struct zmk_behavior_binding triggered_binding; if (triggers > 0) { triggered_binding = cfg->cw_binding; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index eab443a3..d9d4d855 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -4,6 +4,7 @@ * SPDX-License-Identifier: MIT */ +#include #include #include @@ -16,10 +17,14 @@ struct behavior_sensor_rotate_config { struct behavior_sensor_rotate_data { struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN]; + int triggers[ZMK_KEYMAP_SENSORS_LEN]; }; -int zmk_behavior_sensor_rotate_common_trigger(struct zmk_behavior_binding *binding, +int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, + size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); +int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data); \ No newline at end of file + enum behavior_sensor_binding_process_mode mode); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index 95bb9961..3c2373b0 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -13,7 +13,8 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { - .sensor_binding_triggered = zmk_behavior_sensor_rotate_common_trigger}; + .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; diff --git a/app/src/keymap.c b/app/src/keymap.c index 16543d37..c8121176 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,48 +252,59 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_triggered( - uint8_t sensor_position, size_t channel_data_size, - const struct zmk_sensor_channel_data channel_data[channel_data_size], int64_t timestamp) { - for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) { - if (zmk_keymap_layer_active(layer)) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; - const struct device *behavior; - int ret; +int zmk_keymap_sensor_event(uint8_t sensor_position, size_t channel_data_size, + const struct zmk_sensor_channel_data channel_data[channel_data_size], + int64_t timestamp) { + bool opaque_response = false; - LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, - binding->behavior_dev); + for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; + const struct device *behavior; + int ret; - behavior = device_get_binding(binding->behavior_dev); + LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, + binding->behavior_dev); - if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); - continue; - } + behavior = device_get_binding(binding->behavior_dev); - struct zmk_behavior_binding_event event = { - .layer = layer, - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), - .timestamp = timestamp, - }; + if (!behavior) { + LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); + continue; + } - ret = behavior_sensor_keymap_binding_triggered( - binding, event, zmk_sensors_get_config_at_position(sensor_position), - channel_data_size, channel_data); + struct zmk_behavior_binding_event event = { + .layer = layer, + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .timestamp = timestamp, + }; - if (ret > 0) { - LOG_DBG("behavior processing to continue to next layer"); - continue; - } else if (ret < 0) { - LOG_DBG("Behavior returned error: %d", ret); - return ret; - } else { - return ret; - } + ret = behavior_sensor_keymap_binding_data( + binding, event, zmk_sensors_get_config_at_position(sensor_position), channel_data_size, + channel_data); + + if (ret > 0) { + LOG_DBG("behavior processing to continue to next layer"); + continue; + } + + enum behavior_sensor_binding_process_mode mode = + (!opaque_response && layer >= _zmk_keymap_layer_default && + zmk_keymap_layer_active(layer)) + ? BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER + : BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD; + + ret = behavior_sensor_keymap_binding_process(binding, event, mode); + + if (ret == ZMK_BEHAVIOR_OPAQUE) { + LOG_DBG("sensor event processing complete, behavior response was opaque"); + opaque_response = true; + } else if (ret < 0) { + LOG_DBG("Behavior returned error: %d", ret); + return ret; } } - return -ENOTSUP; + return 0; } #endif /* ZMK_KEYMAP_HAS_SENSORS */ @@ -308,8 +319,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_triggered(sensor_ev->sensor_position, sensor_ev->channel_data_size, - sensor_ev->channel_data, sensor_ev->timestamp); + return zmk_keymap_sensor_event(sensor_ev->sensor_position, sensor_ev->channel_data_size, + sensor_ev->channel_data, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ From 3a91b325138dfba8ede743aec28e2cdbc85d17d2 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 16 May 2023 22:27:01 -0700 Subject: [PATCH 389/494] refactor(sensors): Use "sensor index" consistently --- app/include/drivers/behavior.h | 8 ++--- app/include/zmk/events/sensor_event.h | 4 +-- app/include/zmk/sensors.h | 3 +- .../behaviors/behavior_sensor_rotate_common.c | 18 +++++----- app/src/keymap.c | 33 +++++++++---------- app/src/sensors.c | 16 ++++----- 6 files changed, 40 insertions(+), 42 deletions(-) diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index d7e57d02..bf2843bb 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -33,7 +33,7 @@ typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *b typedef int (*behavior_sensor_keymap_binding_process_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode); -typedef int (*behavior_sensor_keymap_binding_data_callback_t)( +typedef int (*behavior_sensor_keymap_binding_accept_data_callback_t)( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data channel_data[channel_data_size]); @@ -49,7 +49,7 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_data; behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** @@ -169,12 +169,12 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi * @retval 0 If successful. * @retval Negative errno code if failure. */ -__syscall int behavior_sensor_keymap_binding_data( +__syscall int behavior_sensor_keymap_binding_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data); -static inline int z_impl_behavior_sensor_keymap_binding_data( +static inline int z_impl_behavior_sensor_keymap_binding_accept_data( struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, const struct zmk_sensor_config *sensor_config, size_t channel_data_size, const struct zmk_sensor_channel_data *channel_data) { diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index c5157447..f6d23ac7 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -16,12 +16,12 @@ #define ZMK_SENSOR_EVENT_MAX_CHANNELS 1 struct zmk_sensor_event { - uint8_t sensor_position; - size_t channel_data_size; struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS]; int64_t timestamp; + + uint8_t sensor_index; }; ZMK_EVENT_DECLARE(zmk_sensor_event); \ No newline at end of file diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 06fbc63e..8ac1c283 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -8,7 +8,6 @@ #include -#define _SENSOR_CHILD_LEN(node) 1 + #define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors) #define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay) #define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx) @@ -19,7 +18,7 @@ #define ZMK_KEYMAP_SENSORS_LEN 0 #endif -const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position); +const struct zmk_sensor_config *zmk_sensors_get_config_at_index(uint8_t sensor_index); struct zmk_sensor_config { uint16_t triggers_per_rotation; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 0a2b619d..4ccfea0e 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -21,7 +21,7 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, const struct sensor_value value = channel_data[0].value; int triggers; - int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); // Some funky special casing for "old encoder behavior" where ticks where reported in val2 only, // instead of rotational degrees in val1. @@ -29,7 +29,7 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, if (value.val1 == 0) { triggers = value.val2; } else { - struct sensor_value remainder = data->remainder[sensor_position]; + struct sensor_value remainder = data->remainder[sensor_index]; remainder.val1 += value.val1; remainder.val2 += value.val2; @@ -43,15 +43,15 @@ int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, triggers = remainder.val1 / trigger_degrees; remainder.val1 %= trigger_degrees; - data->remainder[sensor_position] = remainder; + data->remainder[sensor_index] = remainder; } LOG_DBG( "val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X", - value.val1, value.val2, data->remainder[sensor_position].val1, - data->remainder[sensor_position].val2, triggers, binding->param1, binding->param2); + value.val1, value.val2, data->remainder[sensor_index].val1, + data->remainder[sensor_index].val2, triggers, binding->param1, binding->param2); - data->triggers[sensor_position] = triggers; + data->triggers[sensor_index] = triggers; return 0; } @@ -62,14 +62,14 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi const struct behavior_sensor_rotate_config *cfg = dev->config; struct behavior_sensor_rotate_data *data = dev->data; - const int sensor_position = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); + const int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { - data->triggers[sensor_position] = 0; + data->triggers[sensor_index] = 0; return 0; } - int triggers = data->triggers[sensor_position]; + int triggers = data->triggers[sensor_index]; struct zmk_behavior_binding triggered_binding; if (triggers > 0) { diff --git a/app/src/keymap.c b/app/src/keymap.c index c8121176..020faf3f 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -252,38 +252,37 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr } #if ZMK_KEYMAP_HAS_SENSORS -int zmk_keymap_sensor_event(uint8_t sensor_position, size_t channel_data_size, - const struct zmk_sensor_channel_data channel_data[channel_data_size], - int64_t timestamp) { +int zmk_keymap_sensor_event(uint8_t sensor_index, + const struct zmk_sensor_channel_data *channel_data, + size_t channel_data_size, int64_t timestamp) { bool opaque_response = false; for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { - struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_position]; - const struct device *behavior; - int ret; + struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_index]; - LOG_DBG("layer: %d sensor_position: %d, binding name: %s", layer, sensor_position, + LOG_DBG("layer: %d sensor_index: %d, binding name: %s", layer, sensor_index, binding->behavior_dev); - behavior = device_get_binding(binding->behavior_dev); - + const struct device *behavior = device_get_binding(binding->behavior_dev); if (!behavior) { - LOG_DBG("No behavior assigned to %d on layer %d", sensor_position, layer); + LOG_DBG("No behavior assigned to %d on layer %d", sensor_index, layer); continue; } struct zmk_behavior_binding_event event = { .layer = layer, - .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_position), + .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_index), .timestamp = timestamp, }; - ret = behavior_sensor_keymap_binding_data( - binding, event, zmk_sensors_get_config_at_position(sensor_position), channel_data_size, + int ret = behavior_sensor_keymap_binding_accept_data( + binding, event, zmk_sensors_get_config_at_index(sensor_index), channel_data_size, channel_data); - if (ret > 0) { - LOG_DBG("behavior processing to continue to next layer"); + if (ret < 0) { + LOG_WRN("behavior data accept for behavior %s returned an error (%d). Processing to " + "continue to next layer", + binding->behavior_dev, ret); continue; } @@ -319,8 +318,8 @@ int keymap_listener(const zmk_event_t *eh) { #if ZMK_KEYMAP_HAS_SENSORS const struct zmk_sensor_event *sensor_ev; if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { - return zmk_keymap_sensor_event(sensor_ev->sensor_position, sensor_ev->channel_data_size, - sensor_ev->channel_data, sensor_ev->timestamp); + return zmk_keymap_sensor_event(sensor_ev->sensor_index, sensor_ev->channel_data, + sensor_ev->channel_data_size, sensor_ev->timestamp); } #endif /* ZMK_KEYMAP_HAS_SENSORS */ diff --git a/app/src/sensors.c b/app/src/sensors.c index 5f41c4f2..3a34ca23 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -19,7 +19,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS struct sensors_item_cfg { - uint8_t sensor_position; + uint8_t sensor_index; const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; @@ -57,17 +57,17 @@ static struct sensors_item_cfg sensors[] = {LISTIFY(ZMK_KEYMAP_SENSORS_LEN, SENS static ATOMIC_DEFINE(pending_sensors, ZMK_KEYMAP_SENSORS_LEN); -const struct zmk_sensor_config *zmk_sensors_get_config_at_position(uint8_t sensor_position) { - if (sensor_position > ARRAY_SIZE(configs)) { +const struct zmk_sensor_config *zmk_sensors_get_config_at_index(uint8_t sensor_index) { + if (sensor_index > ARRAY_SIZE(configs)) { return NULL; } - return &configs[sensor_position]; + return &configs[sensor_index]; } -static void trigger_sensor_data_for_position(uint32_t sensor_position) { +static void trigger_sensor_data_for_position(uint32_t sensor_index) { int err; - const struct sensors_item_cfg *item = &sensors[sensor_position]; + const struct sensors_item_cfg *item = &sensors[sensor_index]; err = sensor_sample_fetch(item->dev); if (err) { @@ -84,7 +84,7 @@ static void trigger_sensor_data_for_position(uint32_t sensor_position) { } ZMK_EVENT_RAISE(new_zmk_sensor_event( - (struct zmk_sensor_event){.sensor_position = item->sensor_position, + (struct zmk_sensor_event){.sensor_index = item->sensor_index, .channel_data = {(struct zmk_sensor_channel_data){ .value = value, .channel = item->trigger.chan}}, .timestamp = k_uptime_get()})); @@ -122,7 +122,7 @@ static void zmk_sensors_trigger_handler(const struct device *dev, static void zmk_sensors_init_item(uint8_t i) { LOG_DBG("Init sensor at index %d", i); - sensors[i].sensor_position = i; + sensors[i].sensor_index = i; if (!sensors[i].dev) { LOG_DBG("No local device for %d", i); From 753802cd79ce12d2e5d86c72ced3a4cc76fe4564 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sun, 18 Jun 2023 05:59:31 +0000 Subject: [PATCH 390/494] fix(sensors): Clean ups based on code review. --- app/Kconfig | 17 +++++------------ app/include/drivers/behavior.h | 7 ++++--- app/src/behaviors/behavior_sensor_rotate.c | 2 +- .../behaviors/behavior_sensor_rotate_common.c | 9 ++++----- .../behaviors/behavior_sensor_rotate_common.h | 9 ++++----- app/src/behaviors/behavior_sensor_rotate_var.c | 2 +- app/src/sensors.c | 9 +++++++-- 7 files changed, 26 insertions(+), 29 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 9c0606b0..92641c14 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -194,18 +194,6 @@ rsource "src/split/Kconfig" #Basic Keyboard Setup endmenu -menu "Encoders" - -config ZMK_ENCODERS_DEFAULT_TRIGGERS_PER_ROTATION - int "Default behavior triggers per rotation" - help - Unless overridden for a specific behavior in the keymap/devicetree, this value - determines how many times to trigger the bound behavior per full rotation. - For tactile encoders with detents, this usually should match the number of - detents per rotation of the encoder. - default 30 - -endmenu menu "Display/LED Options" rsource "src/display/Kconfig" @@ -548,6 +536,11 @@ if ZMK_KEYMAP_SENSORS config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION int "Default triggers per rotation" + help + Unless overridden for a sensor in the board/shield/devicetree, this value + determines how many times to trigger the bound behavior per full rotation. + For tactile encoders with detents, this usually should match the number of + detents per rotation of the encoder. default 20 endif # ZMK_KEYMAP_SENSORS diff --git a/app/include/drivers/behavior.h b/app/include/drivers/behavior.h index bf2843bb..066cc723 100644 --- a/app/include/drivers/behavior.h +++ b/app/include/drivers/behavior.h @@ -49,7 +49,7 @@ __subsystem struct behavior_driver_api { behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params; behavior_keymap_binding_callback_t binding_pressed; behavior_keymap_binding_callback_t binding_released; - behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_data; + behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_accept_data; behavior_sensor_keymap_binding_process_callback_t sensor_binding_process; }; /** @@ -186,11 +186,12 @@ static inline int z_impl_behavior_sensor_keymap_binding_accept_data( const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api; - if (api->sensor_binding_data == NULL) { + if (api->sensor_binding_accept_data == NULL) { return -ENOTSUP; } - return api->sensor_binding_data(binding, event, sensor_config, channel_data_size, channel_data); + return api->sensor_binding_accept_data(binding, event, sensor_config, channel_data_size, + channel_data); } /** diff --git a/app/src/behaviors/behavior_sensor_rotate.c b/app/src/behaviors/behavior_sensor_rotate.c index 3b5bef62..822bc206 100644 --- a/app/src/behaviors/behavior_sensor_rotate.c +++ b/app/src/behaviors/behavior_sensor_rotate.c @@ -13,7 +13,7 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_driver_api = { - .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_init(const struct device *dev) { return 0; }; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 4ccfea0e..eea7bf48 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -11,11 +11,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data) { +int zmk_behavior_sensor_rotate_common_accept_data( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data) { const struct device *dev = device_get_binding(binding->behavior_dev); struct behavior_sensor_rotate_data *data = dev->data; diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index d9d4d855..d354b679 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -20,11 +20,10 @@ struct behavior_sensor_rotate_data { int triggers[ZMK_KEYMAP_SENSORS_LEN]; }; -int zmk_behavior_sensor_rotate_common_data(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event, - const struct zmk_sensor_config *sensor_config, - size_t channel_data_size, - const struct zmk_sensor_channel_data *channel_data); +int zmk_behavior_sensor_rotate_common_accept_data( + struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, + const struct zmk_sensor_config *sensor_config, size_t channel_data_size, + const struct zmk_sensor_channel_data *channel_data); int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, enum behavior_sensor_binding_process_mode mode); \ No newline at end of file diff --git a/app/src/behaviors/behavior_sensor_rotate_var.c b/app/src/behaviors/behavior_sensor_rotate_var.c index 3c2373b0..e6d20cab 100644 --- a/app/src/behaviors/behavior_sensor_rotate_var.c +++ b/app/src/behaviors/behavior_sensor_rotate_var.c @@ -13,7 +13,7 @@ #include "behavior_sensor_rotate_common.h" static const struct behavior_driver_api behavior_sensor_rotate_var_driver_api = { - .sensor_binding_data = zmk_behavior_sensor_rotate_common_data, + .sensor_binding_accept_data = zmk_behavior_sensor_rotate_common_accept_data, .sensor_binding_process = zmk_behavior_sensor_rotate_common_process}; static int behavior_sensor_rotate_var_init(const struct device *dev) { return 0; }; diff --git a/app/src/sensors.c b/app/src/sensors.c index 3a34ca23..e339afe0 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -19,10 +19,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #if ZMK_KEYMAP_HAS_SENSORS struct sensors_item_cfg { - uint8_t sensor_index; const struct zmk_sensor_config *config; const struct device *dev; struct sensor_trigger trigger; + uint8_t sensor_index; }; #define _SENSOR_ITEM(idx, node) \ @@ -43,7 +43,11 @@ struct sensors_item_cfg { CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION)) \ } #define SENSOR_CHILD_DEFAULTS(idx, arg) \ - { .triggers_per_rotation = DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, 20) } + { \ + .triggers_per_rotation = \ + DT_PROP_OR(ZMK_KEYMAP_SENSORS_NODE, triggers_per_rotation, \ + CONFIG_ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION) \ + } static struct zmk_sensor_config configs[] = { #if ZMK_KEYMAP_SENSORS_CHILD_COUNT > 0 @@ -85,6 +89,7 @@ static void trigger_sensor_data_for_position(uint32_t sensor_index) { ZMK_EVENT_RAISE(new_zmk_sensor_event( (struct zmk_sensor_event){.sensor_index = item->sensor_index, + .channel_data_size = 1, .channel_data = {(struct zmk_sensor_channel_data){ .value = value, .channel = item->trigger.chan}}, .timestamp = k_uptime_get()})); From 5763558a02154ab599775c770fcf954931816e52 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 30 May 2023 02:38:28 +0000 Subject: [PATCH 391/494] feat(blog): Add post about sensor refactor. * Document changed configuration, support for other Zephyr drivers, next steps. Co-authored-by: Cem Aksoylar --- docs/blog/2023-06-18-encoder-refactors.md | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 docs/blog/2023-06-18-encoder-refactors.md diff --git a/docs/blog/2023-06-18-encoder-refactors.md b/docs/blog/2023-06-18-encoder-refactors.md new file mode 100644 index 00000000..26f9cee8 --- /dev/null +++ b/docs/blog/2023-06-18-encoder-refactors.md @@ -0,0 +1,119 @@ +--- +title: "Major Encoder Refactor" +author: Pete Johanson +author_title: Project Creator +author_url: https://gitlab.com/petejohanson +author_image_url: https://www.gravatar.com/avatar/2001ceff7e9dc753cf96fcb2e6f41110 +tags: [firmware, zephyr, sensors, encoders] +--- + +Today, we merged a significant change to the low level sensor code that is used to support encoders. In particular, +this paves the way for completing the work on supporting split peripheral sensors/encoders, and other future sensors +like pointing devices. + +As part of the work, backwards compatibility for existing shields has been retained, but only for a grace period to allow out-of-tree shields to move to the new approach for encoders. + +Special thanks to [joelspadin] for the _thorough_ code review and testing throughout the development of the refactor. + +## Summary of Changes + +The following items have been merged: + +1. Split configuration of hardware details, and behavior configuration to allow more flexible functionality of sensors/encoders, in particular linear encoders that lack detents/"clicks" as they rotate. +2. Support for upstream Zephyr sensor drivers, including the NRFX QDEC driver that can be used on nRF52 based keyboards. +3. Sensor data handling changes that pave the way for split sensor handling easily. + +## Configuration Changes + +The major changes to configuration in the devicetree files relates to how the number of steps/triggers for a given encoder are set. In particular, the number of pulses/steps for a given encoder is configured first, allowing ZMK to determine the exact angular degrees of change that is represented by a single pulse on the data lines to that encoder. + +Once that angular degrees mapping is completed, now independently there is a configuration setting to control how many triggers of the behavior in the keymap should occur for each full rotation of the sensor. Another way to think of this is "how many degrees of rotation results in a triggering of the sensor behavior in your keymap layer". + +Splitting these two parts of the encoder configuration allows greater flexibility, and fine grained control of encoder behavior for linear encoders that don't have fixed detents. + +### Old Configuration + +Previously, an encoder configuration looked like: + +``` + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + }; +``` + +Here, the `resolution` property was used to indicate how many encoder pulses should trigger the sensor behavior one time. Next, the encoder is selected in the sensors node: + +``` + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +``` + +That was the entirety of the configuration for encoders. + +### New Configuration + +``` + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <80>; + }; +``` + +Here, the `steps` property is now used to indicate how many encoder pulses there are in a single complete rotation of the encoder. Next, the encoder is selected in the sensors node as before, but an additional configuration is used to indicate how many times the encoder should trigger the behavior in your keymap per rotation: + +``` + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; + }; +``` + +For tactile encoders that have detents, the `triggers-per-rotation` would match the number of detents on the encoder. For linear encoders, the value can be chosen to suit your needs. + +## Zephyr Sensor Drivers + +The configuration changes bring ZMK's code in line with how upstream Zephyr sensor drivers handle rotations. This has the added advantage of allowing us to leverage other sensor drivers. On Nordic MCUs, like nRF52840, the NRFX QDEC driver can be used, for example: + +``` +&pinctrl { + qdec_default: qdec_default { + group1 { + psels = , + ; + bias-pull-up; + }; + }; +}; + +// Set up the QDEC hardware based driver and give it the same label as the deleted node. +encoder: &qdec0 { + status = "okay"; + led-pre = <0>; + steps = <80>; + pinctrl-0 = <&qdec_default>; + pinctrl-names = "default"; +}; +``` + +The NRFX QDEC driver has the advantage of supporting optical encoders as well, and although it polls, it does so in hardware without waking the MCU core; initial basic power profiling is promising. + +## Split Sensor/Encoder Support + +In addition to the refactors for splitting the configuration, the changes merged included refactors designed to simplify and move forward with the long outstanding feature of supporting encoders on the peripheral side of split keyboards. That work is planned as a follow up. + +## Deprecation + +The old configuration will be supported for a period of one month, and then removed, giving users a grace period to complete the migration to the new separated configuration. + +[petejohanson]: https://github.com/petejohanson +[joelspadin]: https://github.com/joelspadin From e686fce4d917b708da7f2baba4115043d3f0deab Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 19 May 2023 18:41:08 -0400 Subject: [PATCH 392/494] refactor(split): allow central to define connection parameters Fixes #1614 --- app/src/split/bluetooth/Kconfig | 17 +++++++++++++++-- app/src/split/bluetooth/central.c | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index e2c8d5c3..0610b667 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -33,6 +33,18 @@ config ZMK_SPLIT_BLE_CENTRAL_SPLIT_RUN_QUEUE_SIZE int "Max number of behavior run events to queue to send to the peripheral(s)" default 5 +config ZMK_SPLIT_BLE_PREF_INT + int "Connection interval to use for split central/peripheral connection" + default 6 + +config ZMK_SPLIT_BLE_PREF_LATENCY + int "Latency to use for split central/peripheral connection" + default 30 + +config ZMK_SPLIT_BLE_PREF_TIMEOUT + int "Supervision timeout to use for split central/peripheral connection" + default 400 + endif # ZMK_SPLIT_ROLE_CENTRAL if !ZMK_SPLIT_ROLE_CENTRAL @@ -58,8 +70,9 @@ config BT_MAX_PAIRED config BT_MAX_CONN default 1 -config BT_PERIPHERAL_PREF_MAX_INT - default 6 +# Allow central to specify connection parameters. +config BT_GAP_AUTO_UPDATE_CONN_PARAMS + default n #!ZMK_SPLIT_ROLE_CENTRAL endif diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 53e61be6..147760ff 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -383,7 +383,9 @@ static bool split_central_eir_found(const bt_addr_le_t *addr) { struct peripheral_slot *slot = &peripherals[slot_idx]; LOG_DBG("Initiating new connnection"); - struct bt_le_conn_param *param = BT_LE_CONN_PARAM(0x0006, 0x0006, 30, 400); + struct bt_le_conn_param *param = + BT_LE_CONN_PARAM(CONFIG_ZMK_SPLIT_BLE_PREF_INT, CONFIG_ZMK_SPLIT_BLE_PREF_INT, + CONFIG_ZMK_SPLIT_BLE_PREF_LATENCY, CONFIG_ZMK_SPLIT_BLE_PREF_TIMEOUT); err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, param, &slot->conn); if (err < 0) { LOG_ERR("Create conn failed (err %d) (create conn? 0x%04x)", err, BT_HCI_OP_LE_CREATE_CONN); From 805dd4a53bc9ff7fe1f7eb5c9ea332a9affbc5f9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 8 Apr 2022 15:38:46 +0000 Subject: [PATCH 393/494] feat(behaviors): Support parameterized macros. * Add two new compatibles for macros that take one or two parameters when bound in a keymap. * Use `¯o_param_1to1`, `¯o_param_1to2`, `¯o_param_2to1`, and `¯o_param_2to2` control entries in the bindings for the macro to have the next binding entry have it's values substituted. Co-authored-by: Cem Aksoylar --- app/CMakeLists.txt | 2 +- app/Kconfig.behaviors | 7 +- app/dts/behaviors/macros.dtsi | 55 ++++++++-- app/dts/bindings/behaviors/macro_base.yaml | 13 +++ .../zmk,behavior-macro-one-param.yaml | 8 ++ .../zmk,behavior-macro-two-param.yaml | 8 ++ .../behaviors/zmk,behavior-macro.yaml | 13 +-- .../bindings/macros/zmk,macro-param-1to1.yaml | 8 ++ .../bindings/macros/zmk,macro-param-1to2.yaml | 8 ++ .../bindings/macros/zmk,macro-param-2to1.yaml | 8 ++ .../bindings/macros/zmk,macro-param-2to2.yaml | 8 ++ app/src/behaviors/behavior_macro.c | 100 +++++++++++++----- .../place-holder-parameters/events.patterns | 1 + .../keycode_events.snapshot | 16 +++ .../native_posix_64.keymap | 63 +++++++++++ docs/docs/behaviors/macros.md | 40 +++++++ 16 files changed, 310 insertions(+), 48 deletions(-) create mode 100644 app/dts/bindings/behaviors/macro_base.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml create mode 100644 app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-1to1.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-1to2.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-2to1.yaml create mode 100644 app/dts/bindings/macros/zmk,macro-param-2to2.yaml create mode 100644 app/tests/macros/place-holder-parameters/events.patterns create mode 100644 app/tests/macros/place-holder-parameters/keycode_events.snapshot create mode 100644 app/tests/macros/place-holder-parameters/native_posix_64.keymap diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index ea3b8f73..4c1c63c2 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -43,7 +43,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c) target_sources(app PRIVATE src/behaviors/behavior_caps_word.c) target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c) - target_sources(app PRIVATE src/behaviors/behavior_macro.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MACRO app PRIVATE src/behaviors/behavior_macro.c) target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c) target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c) target_sources(app PRIVATE src/behaviors/behavior_outputs.c) diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors index 17850eae..9e4a82b0 100644 --- a/app/Kconfig.behaviors +++ b/app/Kconfig.behaviors @@ -21,4 +21,9 @@ config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR bool default y depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED - select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON \ No newline at end of file + select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON + +config ZMK_BEHAVIOR_MACRO + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_MACRO_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_ONE_PARAM_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_TWO_PARAM_ENABLED \ No newline at end of file diff --git a/app/dts/behaviors/macros.dtsi b/app/dts/behaviors/macros.dtsi index 757c046e..36b4a8d3 100644 --- a/app/dts/behaviors/macros.dtsi +++ b/app/dts/behaviors/macros.dtsi @@ -4,16 +4,33 @@ * SPDX-License-Identifier: MIT */ +#define MACRO_PLACEHOLDER 0 #define ZMK_MACRO_STRINGIFY(x) #x #define ZMK_MACRO(name,...) \ - name: name { \ - label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ - compatible = "zmk,behavior-macro"; \ - #binding-cells = <0>; \ - __VA_ARGS__ \ - }; +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro"; \ + #binding-cells = <0>; \ + __VA_ARGS__ \ +}; - / { +#define ZMK_MACRO1(name,...) \ +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro-one-param"; \ + #binding-cells = <1>; \ + __VA_ARGS__ \ +}; + +#define ZMK_MACRO2(name,...) \ +name: name { \ + label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \ + compatible = "zmk,behavior-macro-two-param"; \ + #binding-cells = <2>; \ + __VA_ARGS__ \ +}; + +/ { behaviors { macro_tap: macro_control_mode_tap { compatible = "zmk,macro-control-mode-tap"; @@ -50,5 +67,29 @@ label = "MAC_WAIT_REL"; #binding-cells = <0>; }; + + macro_param_1to1: macro_param_1to1 { + compatible = "zmk,macro-param-1to1"; + label = "MAC_PARAM_1TO1"; + #binding-cells = <0>; + }; + + macro_param_1to2: macro_param_1to2 { + compatible = "zmk,macro-param-1to2"; + label = "MAC_PARAM_1TO2"; + #binding-cells = <0>; + }; + + macro_param_2to1: macro_param_2to1 { + compatible = "zmk,macro-param-2to1"; + label = "MAC_PARAM_2TO1"; + #binding-cells = <0>; + }; + + macro_param_2to2: macro_param_2to2 { + compatible = "zmk,macro-param-2to2"; + label = "MAC_PARAM_2TO2"; + #binding-cells = <0>; + }; }; }; diff --git a/app/dts/bindings/behaviors/macro_base.yaml b/app/dts/bindings/behaviors/macro_base.yaml new file mode 100644 index 00000000..236ee33d --- /dev/null +++ b/app/dts/bindings/behaviors/macro_base.yaml @@ -0,0 +1,13 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +properties: + bindings: + type: phandle-array + required: true + wait-ms: + type: int + description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. + tap-ms: + type: int + description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml new file mode 100644 index 00000000..4fe5a2fb --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-macro-one-param.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Behavior + +compatible: "zmk,behavior-macro-one-param" + +include: [one_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml new file mode 100644 index 00000000..ab6e32b4 --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-macro-two-param.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Behavior + +compatible: "zmk,behavior-macro-two-param" + +include: [two_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml index e6f6757d..035dd943 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-macro.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-macro.yaml @@ -5,15 +5,4 @@ description: Macro Behavior compatible: "zmk,behavior-macro" -include: zero_param.yaml - -properties: - bindings: - type: phandle-array - required: true - wait-ms: - type: int - description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list. - tap-ms: - type: int - description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding +include: [zero_param.yaml, macro_base.yaml] diff --git a/app/dts/bindings/macros/zmk,macro-param-1to1.yaml b/app/dts/bindings/macros/zmk,macro-param-1to1.yaml new file mode 100644 index 00000000..ae0d54df --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-1to1.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter One Substituted Into Next Binding's First Parameter + +compatible: "zmk,macro-param-1to1" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-1to2.yaml b/app/dts/bindings/macros/zmk,macro-param-1to2.yaml new file mode 100644 index 00000000..1018526c --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-1to2.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter One Substituted Into Next Binding's Second Parameter + +compatible: "zmk,macro-param-1to2" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-2to1.yaml b/app/dts/bindings/macros/zmk,macro-param-2to1.yaml new file mode 100644 index 00000000..3ebf8fc9 --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-2to1.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter Two Substituted Into Next Binding's First Parameter + +compatible: "zmk,macro-param-2to1" + +include: zero_param.yaml diff --git a/app/dts/bindings/macros/zmk,macro-param-2to2.yaml b/app/dts/bindings/macros/zmk,macro-param-2to2.yaml new file mode 100644 index 00000000..e3ebe40f --- /dev/null +++ b/app/dts/bindings/macros/zmk,macro-param-2to2.yaml @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +description: Macro Parameter Two Substituted Into Next Binding's Second Parameter + +compatible: "zmk,macro-param-2to2" + +include: zero_param.yaml diff --git a/app/src/behaviors/behavior_macro.c b/app/src/behaviors/behavior_macro.c index e84f1fc8..c4728453 100644 --- a/app/src/behaviors/behavior_macro.c +++ b/app/src/behaviors/behavior_macro.c @@ -4,8 +4,6 @@ * SPDX-License-Identifier: MIT */ -#define DT_DRV_COMPAT zmk_behavior_macro - #include #include #include @@ -15,20 +13,22 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) - enum behavior_macro_mode { MACRO_MODE_TAP, MACRO_MODE_PRESS, MACRO_MODE_RELEASE, }; +enum param_source { PARAM_SOURCE_BINDING, PARAM_SOURCE_MACRO_1ST, PARAM_SOURCE_MACRO_2ND }; + struct behavior_macro_trigger_state { uint32_t wait_ms; uint32_t tap_ms; enum behavior_macro_mode mode; uint16_t start_index; uint16_t count; + enum param_source param1_source; + enum param_source param2_source; }; struct behavior_macro_state { @@ -52,6 +52,11 @@ struct behavior_macro_config { #define WAIT_TIME DT_PROP(DT_INST(0, zmk_macro_control_wait_time), label) #define WAIT_REL DT_PROP(DT_INST(0, zmk_macro_pause_for_release), label) +#define P1TO1 DT_PROP(DT_INST(0, zmk_macro_param_1to1), label) +#define P1TO2 DT_PROP(DT_INST(0, zmk_macro_param_1to2), label) +#define P2TO1 DT_PROP(DT_INST(0, zmk_macro_param_2to1), label) +#define P2TO2 DT_PROP(DT_INST(0, zmk_macro_param_2to2), label) + #define ZM_IS_NODE_MATCH(a, b) (strcmp(a, b) == 0) #define IS_TAP_MODE(dev) ZM_IS_NODE_MATCH(dev, TAP_MODE) #define IS_PRESS_MODE(dev) ZM_IS_NODE_MATCH(dev, PRESS_MODE) @@ -61,6 +66,11 @@ struct behavior_macro_config { #define IS_WAIT_TIME(dev) ZM_IS_NODE_MATCH(dev, WAIT_TIME) #define IS_PAUSE(dev) ZM_IS_NODE_MATCH(dev, WAIT_REL) +#define IS_P1TO1(dev) ZM_IS_NODE_MATCH(dev, P1TO1) +#define IS_P1TO2(dev) ZM_IS_NODE_MATCH(dev, P1TO2) +#define IS_P2TO1(dev) ZM_IS_NODE_MATCH(dev, P2TO1) +#define IS_P2TO2(dev) ZM_IS_NODE_MATCH(dev, P2TO2) + static bool handle_control_binding(struct behavior_macro_trigger_state *state, const struct zmk_behavior_binding *binding) { if (IS_TAP_MODE(binding->behavior_dev)) { @@ -78,6 +88,18 @@ static bool handle_control_binding(struct behavior_macro_trigger_state *state, } else if (IS_WAIT_TIME(binding->behavior_dev)) { state->wait_ms = binding->param1; LOG_DBG("macro wait time set: %d", state->wait_ms); + } else if (IS_P1TO1(binding->behavior_dev)) { + state->param1_source = PARAM_SOURCE_MACRO_1ST; + LOG_DBG("macro param: 1to1"); + } else if (IS_P1TO2(binding->behavior_dev)) { + state->param2_source = PARAM_SOURCE_MACRO_1ST; + LOG_DBG("macro param: 1to2"); + } else if (IS_P2TO1(binding->behavior_dev)) { + state->param1_source = PARAM_SOURCE_MACRO_2ND; + LOG_DBG("macro param: 2to1"); + } else if (IS_P2TO2(binding->behavior_dev)) { + state->param2_source = PARAM_SOURCE_MACRO_2ND; + LOG_DBG("macro param: 2to2"); } else { return false; } @@ -110,21 +132,47 @@ static int behavior_macro_init(const struct device *dev) { return 0; }; +static uint32_t select_param(enum param_source param_source, uint32_t source_binding, + const struct zmk_behavior_binding *macro_binding) { + switch (param_source) { + case PARAM_SOURCE_MACRO_1ST: + return macro_binding->param1; + case PARAM_SOURCE_MACRO_2ND: + return macro_binding->param2; + default: + return source_binding; + } +}; + +static void replace_params(struct behavior_macro_trigger_state *state, + struct zmk_behavior_binding *binding, + const struct zmk_behavior_binding *macro_binding) { + binding->param1 = select_param(state->param1_source, binding->param1, macro_binding); + binding->param2 = select_param(state->param2_source, binding->param2, macro_binding); + + state->param1_source = PARAM_SOURCE_BINDING; + state->param2_source = PARAM_SOURCE_BINDING; +} + static void queue_macro(uint32_t position, const struct zmk_behavior_binding bindings[], - struct behavior_macro_trigger_state state) { + struct behavior_macro_trigger_state state, + const struct zmk_behavior_binding *macro_binding) { LOG_DBG("Iterating macro bindings - starting: %d, count: %d", state.start_index, state.count); for (int i = state.start_index; i < state.start_index + state.count; i++) { if (!handle_control_binding(&state, &bindings[i])) { + struct zmk_behavior_binding binding = bindings[i]; + replace_params(&state, &binding, macro_binding); + switch (state.mode) { case MACRO_MODE_TAP: - zmk_behavior_queue_add(position, bindings[i], true, state.tap_ms); - zmk_behavior_queue_add(position, bindings[i], false, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.tap_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; case MACRO_MODE_PRESS: - zmk_behavior_queue_add(position, bindings[i], true, state.wait_ms); + zmk_behavior_queue_add(position, binding, true, state.wait_ms); break; case MACRO_MODE_RELEASE: - zmk_behavior_queue_add(position, bindings[i], false, state.wait_ms); + zmk_behavior_queue_add(position, binding, false, state.wait_ms); break; default: LOG_ERR("Unknown macro mode: %d", state.mode); @@ -145,7 +193,7 @@ static int on_macro_binding_pressed(struct zmk_behavior_binding *binding, .start_index = 0, .count = state->press_bindings_count}; - queue_macro(event.position, cfg->bindings, trigger_state); + queue_macro(event.position, cfg->bindings, trigger_state, binding); return ZMK_BEHAVIOR_OPAQUE; } @@ -156,7 +204,7 @@ static int on_macro_binding_released(struct zmk_behavior_binding *binding, const struct behavior_macro_config *cfg = dev->config; struct behavior_macro_state *state = dev->data; - queue_macro(event.position, cfg->bindings, state->release_state); + queue_macro(event.position, cfg->bindings, state->release_state, binding); return ZMK_BEHAVIOR_OPAQUE; } @@ -166,22 +214,20 @@ static const struct behavior_driver_api behavior_macro_driver_api = { .binding_released = on_macro_binding_released, }; -#define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, DT_DRV_INST(drv_inst)) - #define TRANSFORMED_BEHAVIORS(n) \ - {LISTIFY(DT_PROP_LEN(DT_DRV_INST(n), bindings), BINDING_WITH_COMMA, (, ), n)}, + {LISTIFY(DT_PROP_LEN(n, bindings), ZMK_KEYMAP_EXTRACT_BINDING, (, ), n)}, -#define MACRO_INST(n) \ - static struct behavior_macro_state behavior_macro_state_##n = {}; \ - static struct behavior_macro_config behavior_macro_config_##n = { \ - .default_wait_ms = DT_INST_PROP_OR(n, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ - .default_tap_ms = DT_INST_PROP_OR(n, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ - .count = DT_INST_PROP_LEN(n, bindings), \ - .bindings = TRANSFORMED_BEHAVIORS(n)}; \ - DEVICE_DT_INST_DEFINE(n, behavior_macro_init, NULL, &behavior_macro_state_##n, \ - &behavior_macro_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); +#define MACRO_INST(inst) \ + static struct behavior_macro_state behavior_macro_state_##inst = {}; \ + static struct behavior_macro_config behavior_macro_config_##inst = { \ + .default_wait_ms = DT_PROP_OR(inst, wait_ms, CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS), \ + .default_tap_ms = DT_PROP_OR(inst, tap_ms, CONFIG_ZMK_MACRO_DEFAULT_TAP_MS), \ + .count = DT_PROP_LEN(inst, bindings), \ + .bindings = TRANSFORMED_BEHAVIORS(inst)}; \ + DEVICE_DT_DEFINE(inst, behavior_macro_init, NULL, &behavior_macro_state_##inst, \ + &behavior_macro_config_##inst, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &behavior_macro_driver_api); -DT_INST_FOREACH_STATUS_OKAY(MACRO_INST) - -#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro, MACRO_INST) +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro_one_param, MACRO_INST) +DT_FOREACH_STATUS_OKAY(zmk_behavior_macro_two_param, MACRO_INST) diff --git a/app/tests/macros/place-holder-parameters/events.patterns b/app/tests/macros/place-holder-parameters/events.patterns new file mode 100644 index 00000000..3c9d3f83 --- /dev/null +++ b/app/tests/macros/place-holder-parameters/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode/kp/p \ No newline at end of file diff --git a/app/tests/macros/place-holder-parameters/keycode_events.snapshot b/app/tests/macros/place-holder-parameters/keycode_events.snapshot new file mode 100644 index 00000000..f198a49b --- /dev/null +++ b/app/tests/macros/place-holder-parameters/keycode_events.snapshot @@ -0,0 +1,16 @@ +kp_pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x38 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x38 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x34 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x08 implicit_mods 0x00 explicit_mods 0x00 +kp_pressed: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 +kp_released: usage_page 0x07 keycode 0x09 implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/macros/place-holder-parameters/native_posix_64.keymap b/app/tests/macros/place-holder-parameters/native_posix_64.keymap new file mode 100644 index 00000000..59d78b5e --- /dev/null +++ b/app/tests/macros/place-holder-parameters/native_posix_64.keymap @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + macros { + slash_macro: slash_macro { + #binding-cells = <2>; + label = "ZM_SLASH"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + ¯o_param_1to1 &kp MACRO_PLACEHOLDER + &kp SLASH + ¯o_param_2to1 &kp MACRO_PLACEHOLDER>; + }; + + to_second_macro: to_second_macro { + #binding-cells = <2>; + label = "ZMK_TO_SECOND"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + ¯o_param_1to2 &mt LSHIFT MACRO_PLACEHOLDER + ¯o_param_2to2 &mt RSHIFT MACRO_PLACEHOLDER>; + }; + + quote_letter_macro: quote_letter_macro { + #binding-cells = <1>; + label = "ZMK_QLET"; + compatible = "zmk,behavior-macro-one-param"; + wait-ms = <40>; + tap-ms = <40>; + bindings = < + &kp QUOT + ¯o_param_1to1 &kp MACRO_PLACEHOLDER + &kp QUOT>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &slash_macro A B "e_letter_macro B + &to_second_macro E F &kp C>; + }; + }; +}; + +&kscan { + events = ; +}; \ No newline at end of file diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 1628e0cb..40c333a9 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -49,6 +49,22 @@ For use cases involving sending a single keycode with modifiers, for instance ct with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. ::: +### Parameterized Macros + +Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: + +``` + raise_layer { + bindings = <&my_cool_macro A> + }; +``` + +When defining a parameterized macro, a different `compatible` value will be used depending on how many parameters are passed into it: + +- `zmk,behavior-macro` - a parameter that takes no parameters. +- `zmk,behavior-macro-one-param` - a parameter that takes one parameter when used. +- `zmk,behavior-macro-two-param` - a parameter that takes two parameters when used. + ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can @@ -67,6 +83,30 @@ bindings There are a set of special macro controls that can be included in the `bindings` list to modify the way the macro is processed. +### Parameters + +When creating a macro that takes parameter(s), there are macro controls that change when the parameters passed to the macro are used +within the macro itself. All of the controls are "one shot" and will change how the passed in parameters are used for the very next non-macro control behavior in the `bindings` list of the macro. + +For example, to pass the first parameter from the macro into a `&kp` used in the macro, you would use: + +``` +bindings + = <¯o_param_1to1> + , <&kp MACRO_PLACEHOLDER> + ; +``` + +Because `kp` takes one parameter, you can't simply make the second entry `<&kp>` in the `bindings` list. Whatever value you do pass in will be replaced when the macro is triggered, so you can put _any_ value there, e.g. `0`, `A` keycode, etc. To make it very obvious that the parameter there is not actually going to be used, you can use `MACRO_PLACEHOLDER` which is simply an alias for `0`. + +The available parameter controls are: + +- `¯o_param_1to1` - pass the first parameter of the macro into the first parameter of the next behavior in the `bindings` list. +- `¯o_param_1to2` - pass the first parameter of the macro into the second parameter of the next behavior in the `bindings` list. + +* `¯o_param_2to1` - pass the second parameter of the macro into the first parameter of the next behavior in the `bindings` list. +* `¯o_param_2to2` - pass the second parameter of the macro into the second parameter of the next behavior in the `bindings` list. + ### Binding Activation Mode Bindings in a macro are activated differently, depending on the current "activation mode" of the macro. From b259d5a22e423458b94bd1aba70fd62f327528c0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 20 Jun 2023 22:23:06 +0000 Subject: [PATCH 394/494] fix(sensors): Sensor rotate behavior fix for layers. * Properly return transparent value when processing mode for higher disabled layers means the processing is ignored. --- app/src/behaviors/behavior_sensor_rotate_common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index eea7bf48..586cac3f 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -65,7 +65,7 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { data->triggers[sensor_index] = 0; - return 0; + return ZMK_BEHAVIOR_TRANSPARENT; } int triggers = data->triggers[sensor_index]; @@ -83,7 +83,7 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi triggered_binding.param1 = binding->param2; } } else { - return 0; + return ZMK_BEHAVIOR_TRANSPARENT; } LOG_DBG("Sensor binding: %s", binding->behavior_dev); From 3772ecb04e777ec4d592711427211cfac26a712d Mon Sep 17 00:00:00 2001 From: Kyle McCreery Date: Wed, 5 Jul 2023 12:50:19 -0400 Subject: [PATCH 395/494] fix(boards): Update pillbug_defconfig to enable pinctrl --- app/boards/arm/pillbug/pillbug_defconfig | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/boards/arm/pillbug/pillbug_defconfig b/app/boards/arm/pillbug/pillbug_defconfig index d71d9f62..9781cf99 100644 --- a/app/boards/arm/pillbug/pillbug_defconfig +++ b/app/boards/arm/pillbug/pillbug_defconfig @@ -8,6 +8,9 @@ CONFIG_BOARD_PILLBUG=y # Enable MPU CONFIG_ARM_MPU=y +# Use pinctrl +CONFIG_PINCTRL=y + # enable GPIO CONFIG_GPIO=y From bbb27ac02769c7bf5f20b76605f2b4e0f811e6e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Fri, 7 Jul 2023 01:39:08 +0800 Subject: [PATCH 396/494] feat(docs): Note that UF2 drive unmounts after flashing (#1859) Add a note about the UF2 drive that automatically unmounts itself to restart, which may surprise some new users. --- docs/docs/development/build-flash.md | 4 ++-- docs/docs/user-setup.md | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 6f4ba84d..f57c4b5c 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -130,8 +130,8 @@ The above build commands generate a UF2 file in `build/zephyr` (or `build/left|right/zephyr` if you followed the instructions for splits) and is by default named `zmk.uf2`. If your board supports USB Flashing Format (UF2), copy that file onto the root of the USB mass storage device for your board. The -controller should flash your built firmware and automatically restart once -flashing is complete. +controller should flash your built firmware, unmount the USB storage device and +automatically restart once flashing is complete. Alternatively, if your board supports flashing and you're not developing from within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 8faa72df..9d04c347 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -198,8 +198,9 @@ To flash the firmware, first put your board into bootloader mode by double click or the one that is part of your keyboard). The controller should appear in your OS as a new USB storage device. Once this happens, copy the correct UF2 file (e.g. left or right if working on a split), and paste it onto the root of that USB mass -storage device. Once the flash is complete, the controller should automatically restart, and load your newly flashed firmware. It is -recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to connect to it wirelessly. +storage device. Once the flash is complete, the controller should unmount the USB storage, automatically restart and load your newly +flashed firmware. It is recommended that you test your keyboard works over USB first to rule out hardware issues, before trying to +connect to it wirelessly. :::caution Split keyboards From aaf9958d865ac28659d16e1ea1ba356f7e742ea8 Mon Sep 17 00:00:00 2001 From: ClicketySplit <101202583+ClicketySplit@users.noreply.github.com> Date: Mon, 17 Jul 2023 15:26:27 -0600 Subject: [PATCH 397/494] feat(boards): Leeloo v2 and V2 Zephyr 3.2 fixes * Add Leeloo v2 * Leeloo-Micro v1 updates to support Zephyr 3.2 * Refactored for new Encoder Configuration Co-authored-by: Cem Aksoylar --- app/boards/shields/leeloo/Kconfig.defconfig | 15 +- app/boards/shields/leeloo/Kconfig.shield | 15 +- app/boards/shields/leeloo/README.md | 120 +++++++++++--- .../leeloo/boards/nice_nano_v2.overlay | 47 ++++++ app/boards/shields/leeloo/leeloo.conf | 11 +- app/boards/shields/leeloo/leeloo.dtsi | 85 +--------- app/boards/shields/leeloo/leeloo.keymap | 37 +++-- app/boards/shields/leeloo/leeloo_common.dtsi | 90 +++++++++++ app/boards/shields/leeloo/leeloo_left.overlay | 6 +- app/boards/shields/leeloo/leeloo_rev2.conf | 43 +++++ app/boards/shields/leeloo/leeloo_rev2.dtsi | 6 + app/boards/shields/leeloo/leeloo_rev2.keymap | 79 +++++++++ app/boards/shields/leeloo/leeloo_rev2.zmk.yml | 15 ++ .../shields/leeloo/leeloo_rev2_left.overlay | 21 +++ .../shields/leeloo/leeloo_rev2_right.overlay | 25 +++ .../shields/leeloo/leeloo_right.overlay | 6 +- .../shields/leeloo_micro/Kconfig.defconfig | 49 ++++++ .../shields/leeloo_micro/Kconfig.shield | 13 ++ app/boards/shields/leeloo_micro/README.md | 89 +++++++++++ .../leeloo_micro/boards/nice_nano_v2.overlay | 47 ++++++ .../shields/leeloo_micro/leeloo_micro.conf | 38 +++++ .../shields/leeloo_micro/leeloo_micro.dtsi | 88 ++++++++++ .../shields/leeloo_micro/leeloo_micro.keymap | 151 ++++++++++++++++++ .../shields/leeloo_micro/leeloo_micro.zmk.yml | 15 ++ .../leeloo_micro/leeloo_micro_left.overlay | 20 +++ .../leeloo_micro/leeloo_micro_right.overlay | 24 +++ 26 files changed, 1027 insertions(+), 128 deletions(-) create mode 100644 app/boards/shields/leeloo/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/leeloo/leeloo_common.dtsi create mode 100644 app/boards/shields/leeloo/leeloo_rev2.conf create mode 100644 app/boards/shields/leeloo/leeloo_rev2.dtsi create mode 100644 app/boards/shields/leeloo/leeloo_rev2.keymap create mode 100644 app/boards/shields/leeloo/leeloo_rev2.zmk.yml create mode 100644 app/boards/shields/leeloo/leeloo_rev2_left.overlay create mode 100644 app/boards/shields/leeloo/leeloo_rev2_right.overlay create mode 100644 app/boards/shields/leeloo_micro/Kconfig.defconfig create mode 100644 app/boards/shields/leeloo_micro/Kconfig.shield create mode 100644 app/boards/shields/leeloo_micro/README.md create mode 100644 app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.conf create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.dtsi create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.keymap create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro_left.overlay create mode 100644 app/boards/shields/leeloo_micro/leeloo_micro_right.overlay diff --git a/app/boards/shields/leeloo/Kconfig.defconfig b/app/boards/shields/leeloo/Kconfig.defconfig index 7388a4b9..046bd49a 100644 --- a/app/boards/shields/leeloo/Kconfig.defconfig +++ b/app/boards/shields/leeloo/Kconfig.defconfig @@ -1,6 +1,16 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT +if SHIELD_LEELOO_REV2_LEFT + +config ZMK_KEYBOARD_NAME + default "Leeloo v2" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + if SHIELD_LEELOO_LEFT config ZMK_KEYBOARD_NAME @@ -11,7 +21,7 @@ config ZMK_SPLIT_ROLE_CENTRAL endif -if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT +if SHIELD_LEELOO config ZMK_SPLIT default y @@ -31,7 +41,6 @@ endif # ZMK_DISPLAY if LVGL - config LV_Z_VDB_SIZE default 64 diff --git a/app/boards/shields/leeloo/Kconfig.shield b/app/boards/shields/leeloo/Kconfig.shield index 46ea9640..1d784395 100644 --- a/app/boards/shields/leeloo/Kconfig.shield +++ b/app/boards/shields/leeloo/Kconfig.shield @@ -1,8 +1,21 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT +config SHIELD_LEELOO + bool + config SHIELD_LEELOO_LEFT def_bool $(shields_list_contains,leeloo_left) + select SHIELD_LEELOO config SHIELD_LEELOO_RIGHT def_bool $(shields_list_contains,leeloo_right) + select SHIELD_LEELOO + +config SHIELD_LEELOO_REV2_LEFT + def_bool $(shields_list_contains,leeloo_rev2_left) + select SHIELD_LEELOO + +config SHIELD_LEELOO_REV2_RIGHT + def_bool $(shields_list_contains,leeloo_rev2_right) + select SHIELD_LEELOO \ No newline at end of file diff --git a/app/boards/shields/leeloo/README.md b/app/boards/shields/leeloo/README.md index a807843f..27d5e872 100644 --- a/app/boards/shields/leeloo/README.md +++ b/app/boards/shields/leeloo/README.md @@ -1,41 +1,123 @@ -# Clickety Split | Leeloo +# Clickety Split | Leeloo v2 -![Leeloo](https://cdn.shopify.com/s/files/1/0599/3460/5491/files/Leeloo-rev1.0-w.jpg?v=1646798726) +![Leeloo v2](https://github.com/ClicketySplit/build-guides/blob/main/leeloo/images/gallery/Leeloo-v2-ZMK.jpg) Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca) GitHub: [ClicketySplit](https://github.com/ClicketySplit) -Hardware Supported: Pro Micro, Elite-C, nice!nano v2 +Hardware Supported: Pro Micro, Elite-C, and nice!nano v2 -Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation. +Leeloo v2 has been designed from scratch—again. Everything from the wiring schematic to its case. Leeloo v2 still keeps the column stagger that it's known for, along with its low profile design. -Leeloo has been designed from scratch; everything from the schematic to its PCB footprints, and column stagger. There are some subtle differences that may not be apparent; however, its subtle changes enable an interesting future. +## Features/Differences from Leeloo v1 -Features: +- Support for Kailh Low Profile Choc switches with 18mm x 18mm spacing. + - A version for Kailh Box/MX switches with 19.05mm x 19.05mm spacing will be available in the future. +- All switch locations are socketed. +- Rotary encoder locations are socketed. + - One of two locations on each side can be used for a rotary encoder. +- OLED Displays and nice!view Displays are natively supported, socketed, and no extra wiring is required. +- Support for per-switch RGB underglow. +- Better location for 110mAh or 700mAh batteries. + - Different location for soldering battery leads. +- Support for Alps Alpine Micro On/off switches. + +# Leeloo v1 + +![Leeloo](https://github.com/ClicketySplit/build-guides/blob/main/leeloo/images/gallery/Leeloo-v1.jpg) + +## Features - 4x6x5m Split Keyboard -- Support for MX/Box or Low Profile Choc switches. -- 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering. -- Support for 128x32 OLED Displays. -- The option to select one of three positions for an EC11 rotary encoder on each half. -- Support for Alps Alpine Micro Switch -- Support for 3.7v 301230 LiPo Battery +- Support for both Low Profile Choc switches, and Box/MX switches; 19.05mm x 19.05mm spacing. +- 90% of the switches are socketed; with the exception to the rotary encoder positions. +- Support for Alps Alpine EC11 Rotary Encoders—one on each side, in one of three locations. +- Support for OLED Displays or nice!view Displays. + - nice!view displays require a wire to be soldered from the CS Pin on nice!view display to P0.22 or D4 on the nice!nano. +- Support for both 110mAh or 700mAh batteries. +- Solder pads for battery leads. +- Support for Alps Alpine Micro On/off switches. -# Building Your Firmware +# Building Leeloo's ZMK Firmware ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/) Installation: [Installing ZMK](https://zmk.dev/docs/user-setup) Customization: [Customizing ZMK](https://zmk.dev/docs/customization) Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup) -Build command for the default keymap of Leeloo: +Build commands for the default keymap of Leeloo v1: - west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left - west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right +``` -Build command for your custom keymap of Leeloo: +Build commands for the default keymap of Leeloo v2: - west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourNmae]/leeloo/config" - west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +``` +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right +``` + +Build commands for your custom keymap of Leeloo v1: + +``` +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config" +``` + +Build commands for your custom keymap of Leeloo v2: + +``` +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config" +``` + +## Building Leeloo's ZMK Firmware with nice!view Displays + +There are a couple of files that need to be adjusted before the build commands can be run. + +### Edit the leeloo[_rev2].keymap File + +Near the top 3rd of the leeloo[_rev2].keymap file, locate the following code block: + +``` +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; +``` + +Remove the forward slashes to resemble the following: + +``` +nice_view_spi: &spi0 { + cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +}; +``` + +Save your changes and close the file. + +### Sample Build Commands for nice!view Displays + +Build commands for the default keymap of Leeloo v1: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_left nice_view_adapter nice_view" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_right nice_view_adapter nice_view" +``` + +Build commands for the default keymap of Leeloo v2: + +``` +west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" +west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" +``` + +Build commands for your custom keymap of Leeloo v2: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config" +``` # Support diff --git a/app/boards/shields/leeloo/boards/nice_nano_v2.overlay b/app/boards/shields/leeloo/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..5c451b73 --- /dev/null +++ b/app/boards/shields/leeloo/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <37>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo.conf b/app/boards/shields/leeloo/leeloo.conf index a652bb65..466279a3 100644 --- a/app/boards/shields/leeloo/leeloo.conf +++ b/app/boards/shields/leeloo/leeloo.conf @@ -1,9 +1,16 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT # Uncomment the following line to enable the OLED Display # CONFIG_ZMK_DISPLAY=y +# Uncomment to turn off WPM Status. +# CONFIG_ZMK_WIDGET_WPM_STATUS=n + +# Uncomment to invert colour when using nice!view Displays +# CONFIG_ZMK_DISPLAY_INVERT=y + + # Uncomment these two lines to add support for encoders # CONFIG_EC11=y -# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo.dtsi b/app/boards/shields/leeloo/leeloo.dtsi index 438f9a9d..dad05c55 100644 --- a/app/boards/shields/leeloo/leeloo.dtsi +++ b/app/boards/shields/leeloo/leeloo.dtsi @@ -1,87 +1,6 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ -#include -/ { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; - - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <12>; - rows = <5>; -// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | -// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | -// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | -// | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW29 | | SW29 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | -// | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 | - map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) -RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) - RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) - >; - }; - - kscan0: kscan { - compatible = "zmk,kscan-gpio-matrix"; - label = "KSCAN"; - - diode-direction = "col2row"; - row-gpios - = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> - ; - }; - - left_encoder: encoder_left { - compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; - - right_encoder: encoder_right { - compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; - a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; - }; - - sensors { - compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; - }; -}; - -&pro_micro_i2c { - status = "okay"; - - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - segment-remap; - com-invdir; - com-sequential; - prechargep = <0x22>; - }; -}; +#include "leeloo_common.dtsi" \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo.keymap b/app/boards/shields/leeloo/leeloo.keymap index fc3b25e0..bdbf8988 100644 --- a/app/boards/shields/leeloo/leeloo.keymap +++ b/app/boards/shields/leeloo/leeloo.keymap @@ -1,17 +1,23 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ + #include #include #include #include -// Layers -#define DEFAULT 0 // default_layer -#define LOWER 1 // lower_layer -#define RAISE 2 // raise_layer +/* + * Assign the cs-gpios pin to 4. + * Uncomment these next few lines if implementing nice!view Displays + * A wire from the nice!view CS display needs to be connected to the + * High Frequency P0.22, also known as D4 if you choose to refer to + * the pins with Arduino Labels. + */ +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; / { @@ -19,40 +25,43 @@ compatible = "zmk,keymap"; default_layer { + label = " QWERTY"; bindings = < &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT -&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LALT &kp LCTRL < 1 RET < 2 MINUS &kp LGUI &kp LGUI < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp LGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; lower_layer { + label = " Lower"; bindings = < &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12 &trans &trans &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &trans &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; raise_layer { + label = " Raise"; bindings = < &trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans -&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; }; }; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_common.dtsi b/app/boards/shields/leeloo/leeloo_common.dtsi new file mode 100644 index 00000000..6ce93504 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_common.dtsi @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <12>; + rows = <5>; +// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | +// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | +// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | +// | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW29 | | SW29 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | +// | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <30>; + }; + +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_left.overlay b/app/boards/shields/leeloo/leeloo_left.overlay index 59fce1b0..4421e112 100644 --- a/app/boards/shields/leeloo/leeloo_left.overlay +++ b/app/boards/shields/leeloo/leeloo_left.overlay @@ -1,8 +1,8 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ + #include "leeloo.dtsi" &kscan0 { @@ -18,4 +18,4 @@ &left_encoder { status = "okay"; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.conf b/app/boards/shields/leeloo/leeloo_rev2.conf new file mode 100644 index 00000000..8c1cf3ee --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.conf @@ -0,0 +1,43 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment to turn off WPM Status. +# CONFIG_ZMK_WIDGET_WPM_STATUS=n + +# Uncomment to invert colour when using nice!view Displays +# CONFIG_ZMK_DISPLAY_INVERT=y + + +# Uncomment the following line to enable per-key lighting +# CONFIG_ZMK_RGB_UNDERGLOW=y + +# Use the STRIP config specific to the LEDs you're using +# CONFIG_WS2812_STRIP=y + +# Keep OLED or nice!view Displays on even when toggling off LEDs +# Change to y if you wish to toggle Displays on and off with LEDs +# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n + +# Turn off LEDs when idle. +# Change to n if you wish to keep LEDs on even when idle. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y + +# When USB is disconnected, turn off LEDs +# Change to n if you wish to keep LEDs on even when USB is unpluged. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB=y + +# Start LEDs off at 75% +# CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=75 + + +# Uncomment these two lines to add support for encoders +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + + +# Uncomment if you are experiencing connectivity issues; this +# configuration item boosts the BLE transmit power. +# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.dtsi b/app/boards/shields/leeloo/leeloo_rev2.dtsi new file mode 100644 index 00000000..dad05c55 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.dtsi @@ -0,0 +1,6 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_common.dtsi" \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.keymap b/app/boards/shields/leeloo/leeloo_rev2.keymap new file mode 100644 index 00000000..a66205b6 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.keymap @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +// Short versions +#define RGBON &rgb_ug RGB_ON +#define RGBOFF &rgb_ug RGB_OFF +#define RGBTOG &rgb_ug RGB_TOG +#define RGBHUI &rgb_ug RGB_HUI +#define RGBHUD &rgb_ug RGB_HUD +#define RGBSAI &rgb_ug RGB_SAI +#define RGBSAD &rgb_ug RGB_SAD +#define RGBBRI &rgb_ug RGB_BRI +#define RGBBRD &rgb_ug RGB_BRD +#define RGBEFF &rgb_ug RGB_EFF + + +/* + * Assign the cs-gpios pin to 4. + * Uncomment these next few lines if implementing nice!view Displays + */ +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; + + +/ { + + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = " QWERTY"; + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV +&kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp RGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + lower_layer { + label = " Lower"; + bindings = < +&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 +&trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12 +&trans &trans &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &trans &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + raise_layer { + label = " Raise"; + bindings = < +&trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader +RGBON RGBTOG RGBHUI RGBSAI RGBBRI &trans &trans &trans &trans &trans &trans &trans +RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2.zmk.yml b/app/boards/shields/leeloo/leeloo_rev2.zmk.yml new file mode 100644 index 00000000..5e0a4db3 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: leeloo_rev2 +name: Leeloo v2 +type: shield +url: https://clicketysplit.ca/pages/leeloo +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - leeloo_rev2_left + - leeloo_rev2_right diff --git a/app/boards/shields/leeloo/leeloo_rev2_left.overlay b/app/boards/shields/leeloo/leeloo_rev2_left.overlay new file mode 100644 index 00000000..14ddc0ec --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2_left.overlay @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_rev2.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_rev2_right.overlay b/app/boards/shields/leeloo/leeloo_rev2_right.overlay new file mode 100644 index 00000000..afca41b4 --- /dev/null +++ b/app/boards/shields/leeloo/leeloo_rev2_right.overlay @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_rev2.dtsi" + +&default_transform { + col-offset = <6>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo/leeloo_right.overlay b/app/boards/shields/leeloo/leeloo_right.overlay index 80e89529..b860c2ca 100644 --- a/app/boards/shields/leeloo/leeloo_right.overlay +++ b/app/boards/shields/leeloo/leeloo_right.overlay @@ -1,8 +1,8 @@ /* - * Copyright (c) 2022 The ZMK Contributors - * + * Copyright (c) 2023 The ZMK Contributors * SPDX-License-Identifier: MIT */ + #include "leeloo.dtsi" &default_transform { @@ -22,4 +22,4 @@ &right_encoder { status = "okay"; -}; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/Kconfig.defconfig b/app/boards/shields/leeloo_micro/Kconfig.defconfig new file mode 100644 index 00000000..26256120 --- /dev/null +++ b/app/boards/shields/leeloo_micro/Kconfig.defconfig @@ -0,0 +1,49 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_LEELOO_MICRO_LEFT + +config ZMK_KEYBOARD_NAME + default "Leeloo-Micro" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif + +if SHIELD_LEELOO_MICRO + +config ZMK_SPLIT + default y + +if ZMK_DISPLAY + +config I2C + default y + +config SSD1306 + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LV_Z_VDB_SIZE + default 64 + +config LV_Z_DPI + default 148 + +config LV_Z_BITS_PER_PIXEL + default 1 + +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif diff --git a/app/boards/shields/leeloo_micro/Kconfig.shield b/app/boards/shields/leeloo_micro/Kconfig.shield new file mode 100644 index 00000000..c622f16d --- /dev/null +++ b/app/boards/shields/leeloo_micro/Kconfig.shield @@ -0,0 +1,13 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_LEELOO_MICRO + bool + +config SHIELD_LEELOO_MICRO_LEFT + def_bool $(shields_list_contains,leeloo_micro_left) + select SHIELD_LEELOO_MICRO + +config SHIELD_LEELOO_MICRO_RIGHT + def_bool $(shields_list_contains,leeloo_micro_right) + select SHIELD_LEELOO_MICRO \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/README.md b/app/boards/shields/leeloo_micro/README.md new file mode 100644 index 00000000..c1827f82 --- /dev/null +++ b/app/boards/shields/leeloo_micro/README.md @@ -0,0 +1,89 @@ +# Clickety Split | Leeloo-Micro + +![Leeloo-Micro v1 Wireless](https://github.com/ClicketySplit/build-guides/blob/main/leeloo/images/gallery/Leeloo-Micro-v1-ZMK.jpg) + +Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca) +GitHub: [ClicketySplit](https://github.com/ClicketySplit) +Hardware Supported: nice!nano v2, nice!view v1 + +Leeloo-Micro is a 3x5x5m derivative of Leeloo v2; inheriting the column stagger and modifiers row, yet, reducing the number of switches by removing the top row and outside columns. With Leeloo-Micro's inaugural release being wireless, it leverages nice!nanos and nice!views for its microcontrollers and displays. + +## Features + +- 3x5x5m Split Keyboard +- Support for Kailh Low Profile Choc switches with 18mm x 18mm spacing. +- All switch locations are socketed. +- Support for Alps Alpine EC11 Rotary Encoders—one on each side, in one of two locations. + - Rotary encoder locations are socketed. +- nice!view Displays are inherently supported, socketed, and no extra wiring is required. +- Support for per-switch RGB underglow. +- Support for both 110mAh or 700mAh batteries. +- Support for Alps Alpine Micro On/off switches. + +# Building Leeloo-Micro ZMK Firmware + +ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/) +Installation: [Installing ZMK](https://zmk.dev/docs/user-setup) +Customization: [Customizing ZMK](https://zmk.dev/docs/customization) +Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup) + +Build commands for the default keymap of Leeloo-Micro: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right +``` + +Build commands for your custom keymap of Leeloo-Micro: + +``` +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config" +``` + +## Building Leeloo-Micro's ZMK Firmware with nice!view Displays + +There are a couple of files that need to be adjusted before the build commands can be run. + +### Edit the leeloo_micro.keymap File + +Near the top 3rd of the leeloo_micro.keymap file, locate the following code block: + +``` +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; +``` + +Remove the forward slashes to resemble the following: + +``` +nice_view_spi: &spi0 { + cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +}; +``` + +Save your changes and close the file. + +### Sample Build Commands for nice!view Displays + +Build commands for the default keymap of Leeloo-Micro: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" +``` + +Build commands for your custom keymap of Leeloo-Micro: + +``` +west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" +west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config" +``` + +# Support + +If you have any questions with regards to Leeloo-Micro, please [Contact Us](https://clicketysplit.ca/pages/contact-us). + +Clickety Split +For the love of split keyboards. diff --git a/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay b/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..be5dc54e --- /dev/null +++ b/app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <20>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.conf b/app/boards/shields/leeloo_micro/leeloo_micro.conf new file mode 100644 index 00000000..02c1d605 --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.conf @@ -0,0 +1,38 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment to turn off WPM Status. +# CONFIG_ZMK_WIDGET_WPM_STATUS=n + +# Uncomment to invert colour, if using nice!view Displays +# CONFIG_ZMK_DISPLAY_INVERT=y + + +# Uncomment the following line to enable per-key lighting +# CONFIG_ZMK_RGB_UNDERGLOW=y + +# Use the STRIP config specific to the LEDs you're using +# CONFIG_WS2812_STRIP=y + +# Keep OLED or nice!view Displays on even when toggling off LEDs +# Change to y if you wish to toggle Displays on and off with LEDs +# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n + +# Turn off LEDs when idle. +# Change to n if you wish to keep LEDs on even when idle. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y + +# When USB is disconnected, turn off LEDs +# Change to n if you wish to keep LEDs on even when USB is unpluged. +# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB=y + +# Start LEDs off at 75% +# CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=75 + + +# Uncomment these two lines to add support for encoders +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.dtsi b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi new file mode 100644 index 00000000..afe16dfa --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; +// +// | SW1 | SW2 | SW3 | SW4 | SW5 | | SW15 | SW4 | SW3 | SW2 | SW1 | +// | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 | +// | SW11 | SW12 | SW13 | SW14 | SW15 | SW20 | | SW20 | SW15 | SW14 | SW13 | SW12 | SW11 | +// | SW16 | SW17 | SW18 | SW19 | | SW19 | SW18 | SW17 | SW16 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,6) RC(3,7) RC(3,8) RC(3,9) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <120>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <30>; + }; + +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.keymap b/app/boards/shields/leeloo_micro/leeloo_micro.keymap new file mode 100644 index 00000000..8526f5ac --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.keymap @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include + +// Layers +#define QW_M 0 // Main +#define QW_L 1 // Lower +#define QW_R 2 // Raise +#define QW_A 3 // Adjust + +#define QC_N 4 // Number Pad +#define QC_B 5 // Firmware + + +// Short versions +#define BT0 BT_SEL 0 +#define BT1 BT_SEL 1 +#define BT2 BT_SEL 2 +#define BT3 BT_SEL 3 +#define BT4 BT_SEL 4 + +#define BOOTLDR &bootloader + +#define RGBON &rgb_ug RGB_ON +#define RGBOFF &rgb_ug RGB_OFF +#define RGBTOG &rgb_ug RGB_TOG +#define RGBHUI &rgb_ug RGB_HUI +#define RGBHUD &rgb_ug RGB_HUD +#define RGBSAI &rgb_ug RGB_SAI +#define RGBSAD &rgb_ug RGB_SAD +#define RGBBRI &rgb_ug RGB_BRI +#define RGBBRD &rgb_ug RGB_BRD +#define RGBEFF &rgb_ug RGB_EFF + + +/* + * Assign the cs-gpios pin to 4. + * Uncomment these next few lines if implementing nice!view Displays. + */ +//nice_view_spi: &spi0 { +// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>; +//}; + + +/ { + conditional_layers { + compatible = "zmk,conditional-layers"; + adjust_layer { + if-layers = ; + then-layer = ; + }; + }; + + combos { + compatible = "zmk,combos"; + + combo_esc { + timeout-ms = <50>; + key-positions = <0 1>; + layers = ; + bindings = <&kp ESC>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + label = " QWERTY"; + bindings = < +&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P +&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI +&mt LSFT Z &kp X &kp C &kp V &kp B &mo QC_N &kp RGUI &kp N &kp M &kp COMMA &kp DOT &mt RSFT FSLH + &kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &mo QC_B + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + lower_layer { + label = " Lower"; + bindings = < +&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 +&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp QUOT +&kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp RSHFT + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + raise_layer { + label = " Raise"; + bindings = < +&kp TAB &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &kp BSLH +&kp CAPS &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp GRAVE +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &mt RSFT TILDE + &trans &trans &trans &trans &trans &trans &kp DEL &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + adjust_layer { + label = " Adjust"; + bindings = < + +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &trans &trans &trans &trans +&kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &trans &trans +&kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + numpad_layer { + label = " NumPad"; + bindings = < + +&trans &none &none &none &none &kp SLASH &kp N7 &kp N8 &kp N9 &kp MINUS +RGBON RGBTOG RGBHUI RGBSAI RGBBRI &kp ASTRK &kp N4 &kp N5 &kp N6 &kp PLUS +RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &none &kp N1 &kp N2 &kp N3 &kp EQUAL + &trans &trans &trans &trans &trans &kp N0 &kp DOT &none + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + ble_layer { + label = " BLE"; + bindings = < + +&bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4 &bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4 +BOOTLDR &sys_reset &trans &trans &trans &trans &trans &trans &sys_reset BOOTLDR +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &bt BT_CLR &trans &trans &trans &trans &bt BT_CLR &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>; + }; + + }; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml b/app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml new file mode 100644 index 00000000..e78ce0a3 --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: leeloo_micro +name: Leeloo-Micro +type: shield +url: https://clicketysplit.ca/pages/leeloo-micro +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - leeloo_micro_left + - leeloo_micro_right diff --git a/app/boards/shields/leeloo_micro/leeloo_micro_left.overlay b/app/boards/shields/leeloo_micro/leeloo_micro_left.overlay new file mode 100644 index 00000000..d31fcf2c --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro_left.overlay @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_micro.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; \ No newline at end of file diff --git a/app/boards/shields/leeloo_micro/leeloo_micro_right.overlay b/app/boards/shields/leeloo_micro/leeloo_micro_right.overlay new file mode 100644 index 00000000..a3f347fb --- /dev/null +++ b/app/boards/shields/leeloo_micro/leeloo_micro_right.overlay @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +#include "leeloo_micro.dtsi" + +&default_transform { + col-offset = <5>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; \ No newline at end of file From f3110d1d1ea195725551b4c997c542a4003e1452 Mon Sep 17 00:00:00 2001 From: NAHO <90870942+trueNAHO@users.noreply.github.com> Date: Tue, 18 Jul 2023 00:23:22 +0200 Subject: [PATCH 398/494] fix(docs): Fix README punctuation and add license link --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 50cb2817..f112b0f9 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ [![Build](https://github.com/zmkfirmware/zmk/workflows/Build/badge.svg)](https://github.com/zmkfirmware/zmk/actions) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md) -[ZMK Firmware](https://zmk.dev/) is an open source (MIT) keyboard firmware built on the [Zephyr™ Project](https://www.zephyrproject.org/) Real Time Operating System (RTOS). ZMK's goal is to provide a modern, wireless, and powerful firmware free of licensing issues. +[ZMK Firmware](https://zmk.dev/) is an open source ([MIT](LICENSE)) keyboard firmware built on the [Zephyr™ Project](https://www.zephyrproject.org/) Real Time Operating System (RTOS). ZMK's goal is to provide a modern, wireless, and powerful firmware free of licensing issues. -Check out the website to learn more: https://zmk.dev/ +Check out the website to learn more: https://zmk.dev/. -You can also come join our [ZMK Discord Server](https://zmk.dev/community/discord/invite) +You can also come join our [ZMK Discord Server](https://zmk.dev/community/discord/invite). To review features, check out the [feature overview](https://zmk.dev/docs/). ZMK is under active development, and new features are listed with the [enhancement label](https://github.com/zmkfirmware/zmk/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement) in GitHub. Please feel free to add 👍 to the issue description of any requests to upvote the feature. From 18a2b76bf085249e9d650d6664d32931c56dc7b7 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Tue, 18 Jul 2023 16:43:30 -0500 Subject: [PATCH 399/494] feat(nice!view): Custom widgets --- app/boards/shields/nice_view/CMakeLists.txt | 13 + .../shields/nice_view/Kconfig.defconfig | 53 ++- app/boards/shields/nice_view/README.md | 14 +- .../shields/nice_view/custom_status_screen.c | 28 ++ app/boards/shields/nice_view/nice_view.conf | 3 +- app/boards/shields/nice_view/widgets/art.c | 229 ++++++++++++ app/boards/shields/nice_view/widgets/bolt.c | 45 +++ .../nice_view/widgets/peripheral_status.c | 128 +++++++ .../nice_view/widgets/peripheral_status.h | 22 ++ app/boards/shields/nice_view/widgets/status.c | 330 ++++++++++++++++++ app/boards/shields/nice_view/widgets/status.h | 24 ++ app/boards/shields/nice_view/widgets/util.c | 69 ++++ app/boards/shields/nice_view/widgets/util.h | 47 +++ 13 files changed, 986 insertions(+), 19 deletions(-) create mode 100644 app/boards/shields/nice_view/CMakeLists.txt create mode 100644 app/boards/shields/nice_view/custom_status_screen.c create mode 100644 app/boards/shields/nice_view/widgets/art.c create mode 100644 app/boards/shields/nice_view/widgets/bolt.c create mode 100644 app/boards/shields/nice_view/widgets/peripheral_status.c create mode 100644 app/boards/shields/nice_view/widgets/peripheral_status.h create mode 100644 app/boards/shields/nice_view/widgets/status.c create mode 100644 app/boards/shields/nice_view/widgets/status.h create mode 100644 app/boards/shields/nice_view/widgets/util.c create mode 100644 app/boards/shields/nice_view/widgets/util.h diff --git a/app/boards/shields/nice_view/CMakeLists.txt b/app/boards/shields/nice_view/CMakeLists.txt new file mode 100644 index 00000000..694242b2 --- /dev/null +++ b/app/boards/shields/nice_view/CMakeLists.txt @@ -0,0 +1,13 @@ +if(CONFIG_ZMK_DISPLAY AND CONFIG_NICE_VIEW_WIDGET_STATUS) + zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) + zephyr_library_sources(custom_status_screen.c) + zephyr_library_sources(widgets/bolt.c) + zephyr_library_sources(widgets/util.c) + + if(NOT CONFIG_ZMK_SPLIT OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + zephyr_library_sources(widgets/status.c) + else() + zephyr_library_sources(widgets/art.c) + zephyr_library_sources(widgets/peripheral_status.c) + endif() +endif() diff --git a/app/boards/shields/nice_view/Kconfig.defconfig b/app/boards/shields/nice_view/Kconfig.defconfig index d2378409..53edc1cc 100644 --- a/app/boards/shields/nice_view/Kconfig.defconfig +++ b/app/boards/shields/nice_view/Kconfig.defconfig @@ -1,21 +1,13 @@ -# Copyright (c) 2022 The ZMK Contributors +# Copyright (c) 2023 The ZMK Contributors # SPDX-License-Identifier: MIT if SHIELD_NICE_VIEW -config ZMK_DISPLAY - select LV_FONT_MONTSERRAT_26 +config LV_Z_VDB_SIZE + default 100 -if ZMK_DISPLAY - -config SPI - default y - -config LS0XX - default y - -config ZMK_WIDGET_WPM_STATUS - default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL +config LV_Z_DPI + default 161 config LV_Z_BITS_PER_PIXEL default 1 @@ -24,6 +16,37 @@ choice LV_COLOR_DEPTH default LV_COLOR_DEPTH_1 endchoice -endif # ZMK_DISPLAY +choice ZMK_DISPLAY_WORK_QUEUE + default ZMK_DISPLAY_WORK_QUEUE_DEDICATED +endchoice -endif +choice ZMK_DISPLAY_STATUS_SCREEN + default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM +endchoice + +config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM + imply NICE_VIEW_WIDGET_STATUS + +config NICE_VIEW_WIDGET_STATUS + bool "Custom nice!view status widget" + select LV_FONT_MONTSERRAT_16 + select LV_USE_IMG + select LV_USE_CANVAS + +config NICE_VIEW_WIDGET_INVERTED + bool "Invert custom status widget colors" + +if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + +config NICE_VIEW_WIDGET_STATUS + select LV_FONT_MONTSERRAT_18 + select LV_FONT_MONTSERRAT_14 + select LV_FONT_UNSCII_8 + select ZMK_WPM + +endif # !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL + +config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN + select LV_FONT_MONTSERRAT_26 + +endif # SHIELD_NICE_VIEW diff --git a/app/boards/shields/nice_view/README.md b/app/boards/shields/nice_view/README.md index e3dffa34..00abfbfa 100644 --- a/app/boards/shields/nice_view/README.md +++ b/app/boards/shields/nice_view/README.md @@ -1,5 +1,15 @@ # nice!view -The nice!view is a low power, high refresh rate display meant to replace I2C OLEDs traditionally used. +The nice!view is a low-power, high refresh rate display meant to replace I2C OLEDs traditionally used. -This shield requires that an `&nice_view_spi` labelled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. +This shield requires that an `&nice_view_spi` labeled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined. + +## Disable custom widget + +The nice!view shield includes a custom vertical widget. To use the built-in ZMK one, add the following item to your `.conf` file: + +``` +CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=y +CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y +CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y +``` diff --git a/app/boards/shields/nice_view/custom_status_screen.c b/app/boards/shields/nice_view/custom_status_screen.c new file mode 100644 index 00000000..c08da0eb --- /dev/null +++ b/app/boards/shields/nice_view/custom_status_screen.c @@ -0,0 +1,28 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include "widgets/status.h" + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#if IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_STATUS) +static struct zmk_widget_status status_widget; +#endif + +lv_obj_t *zmk_display_status_screen() { + + lv_obj_t *screen; + screen = lv_obj_create(NULL); + +#if IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_STATUS) + zmk_widget_status_init(&status_widget, screen); + lv_obj_align(zmk_widget_status_obj(&status_widget), LV_ALIGN_TOP_LEFT, 0, 0); +#endif + + return screen; +} diff --git a/app/boards/shields/nice_view/nice_view.conf b/app/boards/shields/nice_view/nice_view.conf index ff57c07c..e6f9158f 100644 --- a/app/boards/shields/nice_view/nice_view.conf +++ b/app/boards/shields/nice_view/nice_view.conf @@ -1,5 +1,4 @@ # Enable nice!view CONFIG_ZMK_DISPLAY=y -CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y -CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y +# Disable idle blanking CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n diff --git a/app/boards/shields/nice_view/widgets/art.c b/app/boards/shields/nice_view/widgets/art.c new file mode 100644 index 00000000..56c89146 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/art.c @@ -0,0 +1,229 @@ +/* + * + * Copyright (c) 2023 Collin Hodge + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BALLOON +#define LV_ATTRIBUTE_IMG_BALLOON +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BALLOON uint8_t + balloon_map[] = { +#if CONFIG_NICE_VIEW_WIDGET_INVERTED + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ +#else + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ +#endif + + 0xfe, 0xaa, 0x0a, 0x2a, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0xea, 0xaa, 0xae, 0xba, 0xff, 0xff, + 0xfb, 0xff, 0xf0, 0xf1, 0x55, 0x05, 0x15, 0x47, 0xff, 0xff, 0xff, 0xf5, 0xd5, 0x55, 0x5f, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xa4, 0xaa, 0x8a, 0x8a, 0xa1, 0xff, 0xff, 0xfb, 0xea, + 0xaa, 0xaa, 0xbe, 0xbf, 0xef, 0xfb, 0xfb, 0xff, 0xf0, 0x54, 0x55, 0x05, 0x45, 0x54, 0xff, + 0xff, 0x7d, 0x55, 0xd5, 0x75, 0x7f, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0xae, 0x2a, 0x82, + 0xa0, 0xaa, 0x3f, 0xff, 0xfe, 0xaa, 0xea, 0xbb, 0xfe, 0xbf, 0xff, 0xfb, 0xfb, 0xfe, 0xf0, + 0x5f, 0x55, 0x01, 0x50, 0x54, 0x1f, 0xff, 0x7f, 0x55, 0xd5, 0x7f, 0xff, 0x7f, 0xd7, 0xff, + 0xfd, 0xfd, 0xf0, 0x2f, 0xff, 0x20, 0x28, 0x00, 0x0f, 0xff, 0xae, 0xaa, 0xaa, 0xbf, 0xff, + 0xff, 0xeb, 0xfb, 0xff, 0xff, 0xf0, 0x0e, 0x01, 0x50, 0x14, 0x00, 0x3f, 0xff, 0x57, 0x55, + 0xd5, 0x7f, 0xff, 0x7f, 0xd7, 0xfd, 0xff, 0xfd, 0xf0, 0x1e, 0x01, 0xa8, 0x0a, 0x00, 0xff, + 0xff, 0xaf, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xf0, 0x1f, 0xf9, 0x50, + 0x01, 0x03, 0xff, 0xff, 0x57, 0x55, 0xd5, 0x7d, 0xff, 0x7f, 0xdf, 0xfd, 0xff, 0xfd, 0xf0, + 0x9f, 0xf9, 0xa8, 0x00, 0x8f, 0xff, 0xfe, 0xaf, 0xaa, 0xaa, 0xff, 0xff, 0xfd, 0xbf, 0xfb, + 0xff, 0xfb, 0xf0, 0x5a, 0x01, 0x54, 0x00, 0x3f, 0xff, 0xff, 0x7f, 0x5d, 0xd5, 0xfd, 0xff, + 0xfd, 0xdf, 0xfd, 0xff, 0xfd, 0xf0, 0x8e, 0x01, 0xaa, 0x00, 0x7f, 0xff, 0xfe, 0xbf, 0xae, + 0xef, 0xff, 0xff, 0xfb, 0xef, 0xfb, 0xff, 0xfa, 0xf0, 0xcf, 0xff, 0xf4, 0x00, 0xf7, 0xff, + 0xff, 0x7f, 0x5d, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0xae, 0x01, 0x2a, + 0x00, 0xfb, 0xff, 0xff, 0xbf, 0xae, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfa, 0xf0, + 0xde, 0x01, 0x35, 0x01, 0xfb, 0xff, 0xff, 0x7f, 0x5d, 0xfd, 0xbf, 0xff, 0xff, 0xdf, 0xfd, + 0xff, 0xdd, 0xf0, 0xa7, 0xff, 0xea, 0x81, 0xfc, 0xff, 0x7f, 0xbe, 0xbe, 0xff, 0xe3, 0xff, + 0xff, 0xef, 0xff, 0xf9, 0x3e, 0xf0, 0x56, 0x01, 0x55, 0x41, 0xff, 0x7f, 0xff, 0xff, 0xfd, + 0xfd, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x7d, 0xf0, 0xa6, 0x01, 0x2a, 0x88, 0xfe, 0xff, + 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xfc, 0xfe, 0xf0, 0x52, 0x79, 0x15, + 0x44, 0x7d, 0xff, 0xff, 0xfd, 0x7f, 0xbd, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xf8, 0xfd, 0xf0, + 0x22, 0x69, 0x2a, 0xa0, 0x3d, 0xff, 0xff, 0xfa, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xe2, 0x48, + 0xfa, 0xff, 0xf0, 0x42, 0x59, 0x15, 0x54, 0x1b, 0xff, 0xff, 0xf7, 0xff, 0xbd, 0xf7, 0xff, + 0xff, 0x95, 0x55, 0x37, 0x7d, 0xf0, 0x02, 0x69, 0x0a, 0xa2, 0x1f, 0xfe, 0xff, 0xee, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0x2a, 0x4a, 0x9f, 0xff, 0xf0, 0x03, 0xff, 0x55, 0x11, 0x4f, 0xff, + 0xff, 0x55, 0x7f, 0xfd, 0xff, 0x00, 0xfc, 0x55, 0x55, 0x4f, 0xff, 0xf0, 0x02, 0x01, 0xaa, + 0x88, 0x8f, 0xde, 0xff, 0xaa, 0xbf, 0xfe, 0xff, 0xff, 0x00, 0xa8, 0x02, 0xa7, 0xff, 0xf0, + 0x02, 0x01, 0x55, 0x55, 0x47, 0xff, 0x7f, 0xd5, 0x5f, 0xff, 0xff, 0xff, 0xc8, 0x47, 0x5c, + 0x53, 0xff, 0xf0, 0x82, 0x49, 0xaa, 0x8a, 0xa7, 0xfe, 0xff, 0xea, 0xbf, 0xff, 0xff, 0xff, + 0xb0, 0x3f, 0x5f, 0x89, 0xff, 0xf0, 0xc2, 0x49, 0x55, 0x45, 0x53, 0xff, 0xff, 0xf5, 0x5f, + 0xff, 0xff, 0xfe, 0x70, 0x7f, 0x5f, 0xe5, 0xff, 0xf0, 0xe2, 0x41, 0xa2, 0xa2, 0xab, 0xfe, + 0xfb, 0xfa, 0xaf, 0xef, 0xff, 0xf9, 0xe2, 0xbf, 0x5f, 0xfa, 0xff, 0xf0, 0xe2, 0x41, 0x51, + 0x51, 0x51, 0xff, 0x77, 0xfd, 0x57, 0xf9, 0xff, 0xe7, 0x85, 0x7f, 0x5f, 0xfc, 0xff, 0xf0, + 0xe3, 0xff, 0xf2, 0xa0, 0xa8, 0xff, 0xfb, 0xbe, 0xaf, 0xfe, 0x1e, 0x80, 0x6a, 0x80, 0x00, + 0x7e, 0xff, 0xb0, 0xe2, 0x60, 0x11, 0x50, 0x54, 0x7f, 0xff, 0xfd, 0x57, 0xff, 0xe0, 0x1f, + 0xc4, 0x15, 0x55, 0x06, 0x7f, 0x70, 0xee, 0x60, 0x18, 0xa8, 0x2a, 0x1f, 0xff, 0xfe, 0xaf, + 0xff, 0xe8, 0xf0, 0x00, 0x0a, 0x4a, 0xa8, 0x7f, 0xf0, 0xdf, 0xff, 0xf1, 0x54, 0x15, 0x43, + 0xff, 0xff, 0x5f, 0xff, 0xe8, 0x7b, 0xc0, 0x05, 0x55, 0x55, 0x7f, 0x70, 0xff, 0x81, 0x28, + 0xaa, 0x0a, 0xa1, 0xff, 0xfe, 0xbf, 0xf7, 0xea, 0x09, 0xe0, 0x0a, 0x4a, 0xaa, 0x7f, 0xf0, + 0xff, 0x81, 0x50, 0x54, 0x05, 0x54, 0x7f, 0xff, 0x7f, 0xfc, 0xe8, 0x4b, 0xc0, 0x05, 0x55, + 0x55, 0x7f, 0x70, 0xfe, 0x7f, 0x28, 0xaa, 0x00, 0xa8, 0xff, 0xfe, 0xbf, 0xff, 0x0a, 0xf0, + 0x00, 0x02, 0x4a, 0xa8, 0x7e, 0xb0, 0xfe, 0x7f, 0x14, 0x55, 0x00, 0x03, 0xff, 0xf7, 0x5f, + 0x7f, 0xe0, 0x1f, 0xc4, 0x01, 0x55, 0x06, 0x7f, 0x70, 0xff, 0x81, 0x08, 0x2a, 0x80, 0x07, + 0xff, 0xf6, 0xaf, 0xff, 0xfe, 0x80, 0x6a, 0x80, 0x00, 0x7e, 0xff, 0xb0, 0x7f, 0x81, 0x14, + 0x55, 0x40, 0x0f, 0xff, 0xed, 0x57, 0x7f, 0xff, 0xe7, 0x85, 0x55, 0x5f, 0xfc, 0xff, 0x70, + 0xbf, 0xff, 0xe8, 0x2a, 0xa8, 0x1f, 0xff, 0xf6, 0xae, 0xff, 0xff, 0xf9, 0xea, 0xaa, 0x5f, + 0xfa, 0xff, 0xf0, 0x5e, 0x01, 0x24, 0x15, 0x54, 0x3f, 0xff, 0xf5, 0x57, 0x7f, 0xfb, 0xfe, + 0xf0, 0x55, 0x5f, 0xe5, 0xff, 0x70, 0xbe, 0x01, 0x22, 0x2a, 0xa0, 0xff, 0xff, 0xba, 0xae, + 0xff, 0xfe, 0x1f, 0x30, 0x2a, 0x0f, 0x89, 0xbf, 0xf0, 0x5f, 0xff, 0xe5, 0x15, 0x41, 0xff, + 0xff, 0xd5, 0x57, 0x7f, 0xff, 0xe0, 0x48, 0x05, 0x54, 0x53, 0xff, 0xf0, 0xbe, 0x01, 0xa2, + 0x02, 0x03, 0xff, 0xff, 0xea, 0xaa, 0xbf, 0xff, 0xff, 0x80, 0x00, 0x02, 0xa7, 0xbf, 0xf0, + 0x5e, 0x01, 0x41, 0x00, 0x06, 0xfd, 0xff, 0xd5, 0x55, 0x5f, 0xff, 0xff, 0xfc, 0x00, 0x40, + 0x4f, 0xff, 0xf0, 0xbe, 0x49, 0x20, 0x80, 0x0f, 0x7f, 0xfe, 0xea, 0xaa, 0xbe, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x1f, 0xbf, 0xf0, 0x7e, 0x49, 0x50, 0x00, 0x0f, 0x7f, 0xff, 0xd5, 0x55, + 0x5f, 0x83, 0xff, 0xff, 0x80, 0x40, 0x3f, 0xff, 0xf0, 0xfe, 0x41, 0x28, 0x00, 0x0f, 0xbf, + 0xff, 0xeb, 0xaa, 0xbf, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0xff, 0xbf, 0xf0, 0xfe, 0x41, 0x14, + 0x00, 0x1f, 0xdf, 0xff, 0xd5, 0xd5, 0x57, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xdf, 0xf0, + 0xff, 0xff, 0x08, 0x00, 0x1f, 0x3f, 0xdf, 0xeb, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xbf, 0xf0, 0xfe, 0x01, 0x14, 0x40, 0x3e, 0xff, 0xbf, 0xf5, 0x55, 0x57, 0xdf, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xdf, 0xf0, 0xfe, 0x01, 0x0a, 0x20, 0x3f, 0xff, 0xdf, 0xfa, 0xaa, + 0xab, 0xbf, 0xff, 0xf3, 0xff, 0xff, 0xdf, 0xbf, 0xf0, 0xde, 0x7f, 0x05, 0x10, 0x7f, 0xff, + 0xff, 0xfd, 0x55, 0x55, 0xdf, 0xff, 0xe4, 0xff, 0xff, 0xbf, 0x7f, 0xf0, 0xee, 0x7e, 0x02, + 0x88, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xab, 0xbf, 0xff, 0xe3, 0xff, 0xbf, 0xbf, 0xbf, 0xf0, + 0xde, 0x05, 0x41, 0x54, 0x3f, 0xff, 0xff, 0xdd, 0x55, 0x55, 0xff, 0xff, 0xd7, 0xff, 0xdf, + 0x7f, 0x7f, 0xf0, 0xee, 0x06, 0xa2, 0xaa, 0x3f, 0xff, 0xff, 0xbe, 0xaa, 0xab, 0xbf, 0xff, + 0xf7, 0xff, 0xbf, 0x3f, 0xbf, 0xf0, 0xde, 0x7d, 0x55, 0x55, 0x1f, 0xfb, 0xff, 0xff, 0x55, + 0x55, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xf0, 0xfe, 0x7f, 0xaa, 0xaa, 0x8f, 0xff, + 0xff, 0xba, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0xbf, 0xf0, 0xfe, 0x01, 0x55, + 0x55, 0x47, 0xff, 0xff, 0xf7, 0xd5, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xfe, 0x01, 0xaa, 0xaa, 0xa1, 0xff, 0xff, 0xbf, 0xea, 0xab, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0x55, 0x55, 0x54, 0xff, 0xff, 0x5f, 0xf5, 0x57, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0x7f, 0xff, 0xbf, 0xfa, + 0xab, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0x9d, 0x55, 0x55, 0x00, 0xff, + 0xff, 0x7f, 0xfd, 0x57, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xbf, 0xa2, + 0xa8, 0x03, 0xff, 0xfb, 0xbf, 0xfa, 0xaa, 0xbf, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0x3f, 0xc0, 0x00, 0x07, 0xff, 0xff, 0x5f, 0xfd, 0x57, 0x57, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0x3f, 0x80, 0x00, 0x0f, 0xff, 0xfb, 0xaf, 0xfe, 0xae, 0xaa, 0xfb, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0xf6, 0x7f, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0x57, 0xfd, + 0x55, 0x55, 0x77, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf0, +}; + +const lv_img_dsc_t balloon = { + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 140, + .header.h = 68, + .data_size = 1232, + .data = balloon_map, +}; + +#ifndef LV_ATTRIBUTE_IMG_MOUNTAIN +#define LV_ATTRIBUTE_IMG_MOUNTAIN +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MOUNTAIN uint8_t + mountain_map[] = { +#if CONFIG_NICE_VIEW_WIDGET_INVERTED + 0xff, 0xff, 0xff, 0xff, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ +#else + 0x00, 0x00, 0x00, 0xff, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ +#endif + + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x00, 0x90, 0x00, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xa0, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x10, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x10, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x01, 0xfe, 0x03, 0xe0, 0x0f, 0x9e, 0x01, 0x90, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0xff, 0x07, 0xe0, 0x1f, + 0x9e, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x7f, + 0x8f, 0xe0, 0x1f, 0xbe, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x00, 0x00, 0x3f, 0xcf, 0xf0, 0x1f, 0xbc, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xcf, 0xf0, 0x3f, 0xbc, 0x00, 0x90, 0x80, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x1f, 0xe7, 0xf0, 0x7f, 0x3c, 0x00, 0x90, + 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00, 0x0f, 0xe7, 0xf8, 0x7f, + 0x78, 0x01, 0xb0, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00, 0x07, + 0xf3, 0xf8, 0x3f, 0x78, 0x03, 0xd0, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc0, 0x00, + 0x00, 0x00, 0x07, 0xfb, 0xf8, 0x3f, 0xf8, 0x0f, 0x90, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfd, 0xfc, 0x3f, 0xf8, 0x0f, 0x10, 0xc0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x3f, 0xf0, 0x0e, 0x10, + 0xc0, 0x0c, 0x27, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x7f, + 0xf0, 0x1e, 0x30, 0xc0, 0x00, 0x1f, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0xfe, 0x7f, 0xf3, 0xfc, 0x50, 0xe0, 0x00, 0x3f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x7f, 0xf7, 0xf8, 0x90, 0xe0, 0x00, 0x7f, 0xfe, 0xb0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x7f, 0xe7, 0xf1, 0x90, 0xe0, 0x00, 0x7f, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x7f, 0xef, 0xe3, 0x90, + 0xf0, 0x00, 0x7f, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x7f, + 0xff, 0xe7, 0x90, 0xb0, 0x10, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xff, 0xbf, 0xff, 0xcf, 0x90, 0xf0, 0x30, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xf9, 0xff, 0x9f, 0x90, 0xb0, 0x30, 0xff, 0xff, 0xff, 0xf2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf6, 0xff, 0x3e, 0x90, 0xf8, 0x70, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf6, 0xfe, 0x7c, 0x90, + 0xf8, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf9, + 0xfe, 0xf8, 0x90, 0xa8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0xfd, 0xf3, 0x90, 0xdc, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfb, 0xef, 0x90, 0xf5, 0xac, 0xff, 0xff, 0xff, 0xfe, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xd6, 0x7f, + 0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x90, + 0xff, 0xfa, 0x7f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0xff, 0xff, 0x90, 0xdd, 0xff, 0x7f, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0xea, 0xbf, 0x3f, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x10, 0xff, 0x4f, 0xbf, 0xf5, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x10, 0xff, 0xff, 0x9f, + 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0, + 0xff, 0xb0, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xff, 0xff, 0x90, 0xcd, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x1f, 0xff, 0xff, 0x90, 0xb2, 0xe0, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7f, 0xff, 0xff, 0x90, 0xff, 0xc0, 0x3f, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0x90, 0xfe, 0xc0, 0x7f, + 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0x7c, 0x90, + 0xfd, 0x80, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc3, 0xff, + 0xff, 0xb8, 0x90, 0xff, 0x80, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3f, 0x87, 0xff, 0xff, 0xc8, 0x90, 0x9f, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0x1f, 0xff, 0xff, 0xe0, 0x90, 0x86, 0x01, 0xff, 0xff, 0xd0, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x3f, 0xff, 0xff, 0xe0, 0x90, 0x80, 0x01, 0xff, + 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x19, 0x83, 0xfe, 0x7f, 0xff, 0xff, 0xf0, 0x90, + 0x80, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7f, 0xc7, 0xee, 0x7f, 0xff, + 0xff, 0xf8, 0x90, 0x80, 0x1a, 0xbf, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0xff, 0xff, + 0xc6, 0x7f, 0xff, 0xff, 0xfc, 0x90, 0x80, 0x3f, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xf1, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xfe, 0x90, 0x80, 0x3f, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xe3, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x90, 0x80, 0x7f, 0xfe, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc7, 0xff, 0xfe, 0x18, 0xff, 0xef, 0xff, 0xff, 0x90, + 0x80, 0x7f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x8f, 0xff, 0xfc, 0x7f, 0xff, 0xef, + 0xfd, 0xff, 0x90, 0x80, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xff, 0xf8, + 0xff, 0xff, 0xef, 0xfc, 0xf7, 0x90, 0x80, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x3f, + 0x1f, 0xff, 0xf1, 0xff, 0xff, 0xcf, 0xfc, 0xe1, 0x90, 0x80, 0xff, 0xff, 0xff, 0xf4, 0x00, + 0x00, 0x00, 0x7f, 0x3f, 0xff, 0xe3, 0xff, 0xff, 0xcf, 0xfe, 0x60, 0x90, 0x81, 0xff, 0xff, + 0xff, 0xfe, 0x80, 0x00, 0x00, 0x7f, 0x3f, 0xff, 0xc7, 0xff, 0xff, 0xdf, 0xfe, 0x40, 0x90, + 0x81, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x01, 0xfe, 0x3f, 0xff, 0xcf, 0xbf, 0xff, 0xdf, + 0xfe, 0x00, 0x90, 0x81, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x07, 0xfe, 0x7f, 0xff, 0x8f, + 0x7f, 0xff, 0x9f, 0xfe, 0x00, 0x90, 0x80, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x1f, 0xfe, + 0x7f, 0xff, 0x1e, 0xff, 0xff, 0x91, 0xfe, 0x00, 0x90, 0x80, 0xff, 0xff, 0xfe, 0xc0, 0x00, + 0x00, 0x3f, 0xfc, 0x7f, 0xfe, 0x3c, 0xff, 0xff, 0x81, 0xff, 0x00, 0x90, 0x80, 0x7f, 0xff, + 0xec, 0x00, 0x00, 0x3c, 0xff, 0xf8, 0xff, 0xfc, 0x79, 0xfd, 0xff, 0x80, 0xff, 0x00, 0x90, + 0x80, 0x27, 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xf9, 0xff, 0xfc, 0xf3, 0xfb, 0xff, 0x00, + 0xff, 0x00, 0x90, 0x80, 0x5f, 0xff, 0xd8, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xff, 0xc8, 0xe7, + 0xf3, 0xff, 0x00, 0x7f, 0x00, 0x90, 0x80, 0xff, 0xff, 0xfd, 0x80, 0x01, 0xff, 0xff, 0xe3, + 0xff, 0x81, 0xcf, 0xf7, 0xff, 0x00, 0x7f, 0x00, 0x90, 0x80, 0xff, 0xff, 0xff, 0xd8, 0x03, + 0xff, 0xff, 0x87, 0xff, 0x03, 0x8f, 0xe7, 0xff, 0x00, 0x3f, 0x81, 0x90, 0x81, 0xff, 0xff, + 0xff, 0xfe, 0x83, 0xff, 0xfe, 0x0f, 0xfe, 0x3f, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x80, 0x00, 0x00, 0x00, 0x2f, 0xc6, 0x00, 0x00, 0x38, 0x00, 0x60, 0x00, 0x48, 0x00, 0x00, + 0x00, 0x00, 0x10, 0xc0, 0x00, 0x00, 0x00, 0x17, 0xf4, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x00, + 0x88, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, +}; + +const lv_img_dsc_t mountain = { + .header.cf = LV_IMG_CF_INDEXED_1BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 140, + .header.h = 68, + .data_size = 1232, + .data = mountain_map, +}; diff --git a/app/boards/shields/nice_view/widgets/bolt.c b/app/boards/shields/nice_view/widgets/bolt.c new file mode 100644 index 00000000..74dcc2b0 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/bolt.c @@ -0,0 +1,45 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include + +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + +#ifndef LV_ATTRIBUTE_IMG_BOLT +#define LV_ATTRIBUTE_IMG_BOLT +#endif + +const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BOLT uint8_t bolt_map[] = { +#if CONFIG_NICE_VIEW_WIDGET_INVERTED + 0x00, 0x00, 0x00, 0x00, /*Color of index 0*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 1*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 2*/ + 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ +#else + 0x00, 0x00, 0x00, 0x00, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ + 0x00, 0x00, 0x00, 0xff, /*Color of index 2*/ + 0x00, 0x00, 0x00, 0x00, /*Color of index 3*/ +#endif + + 0x00, 0x14, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00, 0x01, 0xa4, 0x00, 0x01, 0xa4, + 0x00, 0x06, 0xa4, 0x00, 0x06, 0xa4, 0x00, 0x1a, 0xa5, 0x54, 0x1a, 0xaa, 0xa4, 0x6a, + 0xaa, 0x90, 0x55, 0x6a, 0x90, 0x00, 0x6a, 0x40, 0x00, 0x6a, 0x40, 0x00, 0x69, 0x00, + 0x00, 0x69, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00, 0x00, 0x50, 0x00, +}; + +const lv_img_dsc_t bolt = { + .header.cf = LV_IMG_CF_INDEXED_2BIT, + .header.always_zero = 0, + .header.reserved = 0, + .header.w = 11, + .header.h = 18, + .data_size = 70, + .data = bolt_map, +}; diff --git a/app/boards/shields/nice_view/widgets/peripheral_status.c b/app/boards/shields/nice_view/widgets/peripheral_status.c new file mode 100644 index 00000000..85c2a1d8 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/peripheral_status.c @@ -0,0 +1,128 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "peripheral_status.h" +#include +#include +#include +#include +#include +#include +#include + +LV_IMG_DECLARE(balloon); +LV_IMG_DECLARE(mountain); + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct peripheral_status_state { + bool connected; +}; + +static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 0); + + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_16, LV_TEXT_ALIGN_RIGHT); + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw battery + draw_battery(canvas, state); + + // Draw output status + lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, + state.connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void set_battery_status(struct zmk_widget_status *widget, + struct battery_status_state state) { +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + widget->state.charging = state.usb_present; +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + + widget->state.battery = state.level; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void battery_status_update_cb(struct battery_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_status(widget, state); } +} + +static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + .usb_present = zmk_usb_is_powered(), +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + }; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, + battery_status_update_cb, battery_status_get_state) + +ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + +static struct peripheral_status_state get_state(const zmk_event_t *_eh) { + return (struct peripheral_status_state){.connected = zmk_split_bt_peripheral_is_connected()}; +} + +static void set_connection_status(struct zmk_widget_status *widget, + struct peripheral_status_state state) { + widget->state.connected = state.connected; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void output_status_update_cb(struct peripheral_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_connection_status(widget, state); } +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_peripheral_status, struct peripheral_status_state, + output_status_update_cb, get_state) +ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed); + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) { + widget->obj = lv_obj_create(parent); + lv_obj_set_size(widget->obj, 160, 68); + lv_obj_t *top = lv_canvas_create(widget->obj); + lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + + lv_obj_t *art = lv_img_create(widget->obj); + bool random = sys_rand32_get() & 1; + lv_img_set_src(art, random ? &balloon : &mountain); + lv_obj_align(art, LV_ALIGN_TOP_LEFT, 0, 0); + + sys_slist_append(&widgets, &widget->node); + widget_battery_status_init(); + widget_peripheral_status_init(); + + return 0; +} + +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget) { return widget->obj; } diff --git a/app/boards/shields/nice_view/widgets/peripheral_status.h b/app/boards/shields/nice_view/widgets/peripheral_status.h new file mode 100644 index 00000000..81596357 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/peripheral_status.h @@ -0,0 +1,22 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include +#include "util.h" + +struct zmk_widget_status { + sys_snode_t node; + lv_obj_t *obj; + lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE]; + struct status_state state; +}; + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget); diff --git a/app/boards/shields/nice_view/widgets/status.c b/app/boards/shields/nice_view/widgets/status.c new file mode 100644 index 00000000..1ad9e920 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/status.c @@ -0,0 +1,330 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include "status.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); + +struct output_status_state { + enum zmk_endpoint selected_endpoint; + bool active_profile_connected; + bool active_profile_bonded; + uint8_t active_profile_index; +}; + +struct layer_status_state { + uint8_t index; + const char *label; +}; + +struct wpm_status_state { + uint8_t wpm; +}; + +static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 0); + + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_16, LV_TEXT_ALIGN_RIGHT); + lv_draw_label_dsc_t label_dsc_wpm; + init_label_dsc(&label_dsc_wpm, LVGL_FOREGROUND, &lv_font_unscii_8, LV_TEXT_ALIGN_RIGHT); + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_rect_dsc_t rect_white_dsc; + init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND); + lv_draw_line_dsc_t line_dsc; + init_line_dsc(&line_dsc, LVGL_FOREGROUND, 1); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw battery + draw_battery(canvas, state); + + // Draw output status + char output_text[10] = {}; + + switch (state.selected_endpoint) { + case ZMK_ENDPOINT_USB: + strcat(output_text, LV_SYMBOL_USB); + break; + case ZMK_ENDPOINT_BLE: + if (state.active_profile_bonded) { + if (state.active_profile_connected) { + strcat(output_text, LV_SYMBOL_WIFI); + } else { + strcat(output_text, LV_SYMBOL_CLOSE); + } + } else { + strcat(output_text, LV_SYMBOL_SETTINGS); + } + break; + } + + lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, output_text); + + // Draw WPM + lv_canvas_draw_rect(canvas, 0, 21, 68, 42, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 1, 22, 66, 40, &rect_black_dsc); + + char wpm_text[6] = {}; + snprintf(wpm_text, sizeof(wpm_text), "%d", state.wpm[9]); + lv_canvas_draw_text(canvas, 42, 52, 24, &label_dsc_wpm, wpm_text); + + int max = 0; + int min = 256; + + for (int i = 0; i < 10; i++) { + if (state.wpm[i] > max) { + max = state.wpm[i]; + } + if (state.wpm[i] < min) { + min = state.wpm[i]; + } + } + + int range = max - min; + if (range == 0) { + range = 1; + } + + lv_point_t points[10]; + for (int i = 0; i < 10; i++) { + points[i].x = 2 + i * 7; + points[i].y = 60 - (state.wpm[i] - min) * 36 / range; + } + lv_canvas_draw_line(canvas, points, 10, &line_dsc); + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 1); + + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_rect_dsc_t rect_white_dsc; + init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND); + lv_draw_arc_dsc_t arc_dsc; + init_arc_dsc(&arc_dsc, LVGL_FOREGROUND, 2); + lv_draw_arc_dsc_t arc_dsc_filled; + init_arc_dsc(&arc_dsc_filled, LVGL_FOREGROUND, 9); + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER); + lv_draw_label_dsc_t label_dsc_black; + init_label_dsc(&label_dsc_black, LVGL_BACKGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw circles + int circle_offsets[5][2] = { + {13, 13}, {55, 13}, {34, 34}, {13, 55}, {55, 55}, + }; + + for (int i = 0; i < 5; i++) { + bool selected = state.active_profile_index == i; + + lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 359, + &arc_dsc); + + if (selected) { + lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 9, 0, 359, + &arc_dsc_filled); + } + + char label[2]; + snprintf(label, sizeof(label), "%d", i + 1); + lv_canvas_draw_text(canvas, circle_offsets[i][0] - 8, circle_offsets[i][1] - 10, 16, + (selected ? &label_dsc_black : &label_dsc), label); + } + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { + lv_obj_t *canvas = lv_obj_get_child(widget, 2); + + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_label_dsc_t label_dsc; + init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_14, LV_TEXT_ALIGN_CENTER); + + // Fill background + lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); + + // Draw layer + if (state.layer_label == NULL) { + char text[9] = {}; + + sprintf(text, "LAYER %i", state.layer_index); + + lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text); + } else { + lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state.layer_label); + } + + // Rotate canvas + rotate_canvas(canvas, cbuf); +} + +static void set_battery_status(struct zmk_widget_status *widget, + struct battery_status_state state) { +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + widget->state.charging = state.usb_present; +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + + widget->state.battery = state.level; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void battery_status_update_cb(struct battery_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_status(widget, state); } +} + +static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) { + return (struct battery_status_state) { + .level = bt_bas_get_battery_level(), +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + .usb_present = zmk_usb_is_powered(), +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + }; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state, + battery_status_update_cb, battery_status_get_state) + +ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); +#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ + +static void set_output_status(struct zmk_widget_status *widget, struct output_status_state state) { + widget->state.selected_endpoint = state.selected_endpoint; + widget->state.active_profile_connected = state.active_profile_connected; + widget->state.active_profile_bonded = state.active_profile_bonded; + widget->state.active_profile_index = state.active_profile_index; + + draw_top(widget->obj, widget->cbuf, widget->state); + draw_middle(widget->obj, widget->cbuf2, widget->state); +} + +static void output_status_update_cb(struct output_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_output_status(widget, state); } +} + +static struct output_status_state output_status_get_state(const zmk_event_t *_eh) { + return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), + .active_profile_connected = + zmk_ble_active_profile_is_connected(), + .active_profile_bonded = !zmk_ble_active_profile_is_open(), + .active_profile_index = zmk_ble_active_profile_index()}; + ; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, + output_status_update_cb, output_status_get_state) +ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); + +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) +ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); +#endif +#if defined(CONFIG_ZMK_BLE) +ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); +#endif + +static void set_layer_status(struct zmk_widget_status *widget, struct layer_status_state state) { + widget->state.layer_index = state.index; + widget->state.layer_label = state.label; + + draw_bottom(widget->obj, widget->cbuf3, widget->state); +} + +static void layer_status_update_cb(struct layer_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_layer_status(widget, state); } +} + +static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) { + uint8_t index = zmk_keymap_highest_layer_active(); + return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)}; +} + +ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb, + layer_status_get_state) + +ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed); + +static void set_wpm_status(struct zmk_widget_status *widget, struct wpm_status_state state) { + for (int i = 0; i < 9; i++) { + widget->state.wpm[i] = widget->state.wpm[i + 1]; + } + widget->state.wpm[9] = state.wpm; + + draw_top(widget->obj, widget->cbuf, widget->state); +} + +static void wpm_status_update_cb(struct wpm_status_state state) { + struct zmk_widget_status *widget; + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_wpm_status(widget, state); } +} + +struct wpm_status_state wpm_status_get_state(const zmk_event_t *eh) { + return (struct wpm_status_state){.wpm = zmk_wpm_get_state()}; +}; + +ZMK_DISPLAY_WIDGET_LISTENER(widget_wpm_status, struct wpm_status_state, wpm_status_update_cb, + wpm_status_get_state) +ZMK_SUBSCRIPTION(widget_wpm_status, zmk_wpm_state_changed); + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) { + widget->obj = lv_obj_create(parent); + lv_obj_set_size(widget->obj, 160, 68); + lv_obj_t *top = lv_canvas_create(widget->obj); + lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0); + lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + lv_obj_t *middle = lv_canvas_create(widget->obj); + lv_obj_align(middle, LV_ALIGN_TOP_LEFT, 24, 0); + lv_canvas_set_buffer(middle, widget->cbuf2, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + lv_obj_t *bottom = lv_canvas_create(widget->obj); + lv_obj_align(bottom, LV_ALIGN_TOP_LEFT, -44, 0); + lv_canvas_set_buffer(bottom, widget->cbuf3, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR); + + sys_slist_append(&widgets, &widget->node); + widget_battery_status_init(); + widget_output_status_init(); + widget_layer_status_init(); + widget_wpm_status_init(); + + return 0; +} + +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget) { return widget->obj; } diff --git a/app/boards/shields/nice_view/widgets/status.h b/app/boards/shields/nice_view/widgets/status.h new file mode 100644 index 00000000..53a22518 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/status.h @@ -0,0 +1,24 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#pragma once + +#include +#include +#include "util.h" + +struct zmk_widget_status { + sys_snode_t node; + lv_obj_t *obj; + lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE]; + lv_color_t cbuf2[CANVAS_SIZE * CANVAS_SIZE]; + lv_color_t cbuf3[CANVAS_SIZE * CANVAS_SIZE]; + struct status_state state; +}; + +int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent); +lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget); diff --git a/app/boards/shields/nice_view/widgets/util.c b/app/boards/shields/nice_view/widgets/util.c new file mode 100644 index 00000000..9655f837 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/util.c @@ -0,0 +1,69 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include "util.h" + +LV_IMG_DECLARE(bolt); + +void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]) { + static lv_color_t cbuf_tmp[CANVAS_SIZE * CANVAS_SIZE]; + memcpy(cbuf_tmp, cbuf, sizeof(cbuf_tmp)); + lv_img_dsc_t img; + img.data = (void *)cbuf_tmp; + img.header.cf = LV_IMG_CF_TRUE_COLOR; + img.header.w = CANVAS_SIZE; + img.header.h = CANVAS_SIZE; + + lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER); + lv_canvas_transform(canvas, &img, 900, LV_IMG_ZOOM_NONE, -1, 0, CANVAS_SIZE / 2, + CANVAS_SIZE / 2, true); +} + +void draw_battery(lv_obj_t *canvas, struct status_state state) { + lv_draw_rect_dsc_t rect_black_dsc; + init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); + lv_draw_rect_dsc_t rect_white_dsc; + init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND); + + lv_canvas_draw_rect(canvas, 0, 2, 29, 12, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 1, 3, 27, 10, &rect_black_dsc); + lv_canvas_draw_rect(canvas, 2, 4, (state.battery + 2) / 4, 8, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 30, 5, 3, 6, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 31, 6, 1, 4, &rect_black_dsc); + + if (state.charging) { + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + lv_canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc); + } +} + +void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font, + lv_text_align_t align) { + lv_draw_label_dsc_init(label_dsc); + label_dsc->color = color; + label_dsc->font = font; + label_dsc->align = align; +} + +void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color) { + lv_draw_rect_dsc_init(rect_dsc); + rect_dsc->bg_color = bg_color; +} + +void init_line_dsc(lv_draw_line_dsc_t *line_dsc, lv_color_t color, uint8_t width) { + lv_draw_line_dsc_init(line_dsc); + line_dsc->color = color; + line_dsc->width = width; +} + +void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width) { + lv_draw_arc_dsc_init(arc_dsc); + arc_dsc->color = color; + arc_dsc->width = width; +} diff --git a/app/boards/shields/nice_view/widgets/util.h b/app/boards/shields/nice_view/widgets/util.h new file mode 100644 index 00000000..e48c1082 --- /dev/null +++ b/app/boards/shields/nice_view/widgets/util.h @@ -0,0 +1,47 @@ +/* + * + * Copyright (c) 2023 The ZMK Contributors + * SPDX-License-Identifier: MIT + * + */ + +#include +#include + +#define CANVAS_SIZE 68 + +#define LVGL_BACKGROUND \ + IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_INVERTED) ? lv_color_black() : lv_color_white() +#define LVGL_FOREGROUND \ + IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_INVERTED) ? lv_color_white() : lv_color_black() + +struct status_state { + uint8_t battery; + bool charging; +#if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) + enum zmk_endpoint selected_endpoint; + bool active_profile_connected; + bool active_profile_bonded; + uint8_t active_profile_index; + uint8_t layer_index; + const char *layer_label; + uint8_t wpm[10]; +#else + bool connected; +#endif +}; + +struct battery_status_state { + uint8_t level; +#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) + bool usb_present; +#endif +}; + +void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]); +void draw_battery(lv_obj_t *canvas, struct status_state state); +void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font, + lv_text_align_t align); +void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color); +void init_line_dsc(lv_draw_line_dsc_t *line_dsc, lv_color_t color, uint8_t width); +void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width); From 51a4be89355550ccdc00833c18ceaba5ddabcb51 Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Tue, 18 Jul 2023 16:55:32 -0500 Subject: [PATCH 400/494] fix(displays): Don't enable built-in widget configs by default --- app/src/display/Kconfig | 6 +++++- app/src/display/widgets/Kconfig | 4 ---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/display/Kconfig b/app/src/display/Kconfig index 63ba968b..a2029481 100644 --- a/app/src/display/Kconfig +++ b/app/src/display/Kconfig @@ -7,7 +7,6 @@ menuconfig ZMK_DISPLAY select DISPLAY select LVGL select LV_CONF_MINIMAL - imply LV_USE_THEME_MONO if ZMK_DISPLAY @@ -42,6 +41,11 @@ choice ZMK_DISPLAY_STATUS_SCREEN config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN bool "Built in status screen" select LV_OBJ_LABEL + imply LV_USE_THEME_MONO + imply ZMK_WIDGET_LAYER_STATUS + imply ZMK_WIDGET_BATTERY_STATUS + imply ZMK_WIDGET_OUTPUT_STATUS + imply ZMK_WIDGET_PERIPHERAL_STATUS config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM bool "Custom status screen" diff --git a/app/src/display/widgets/Kconfig b/app/src/display/widgets/Kconfig index 4c056cf5..7ec20c1f 100644 --- a/app/src/display/widgets/Kconfig +++ b/app/src/display/widgets/Kconfig @@ -5,14 +5,12 @@ menu "ZMK Display Widgets" config ZMK_WIDGET_LAYER_STATUS bool "Widget for highest, active layer using small icons" - default y depends on !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL select LV_USE_LABEL config ZMK_WIDGET_BATTERY_STATUS bool "Widget for battery charge information, using small icons" depends on BT - default y if BT select LV_USE_LABEL if ZMK_WIDGET_BATTERY_STATUS @@ -25,13 +23,11 @@ endif config ZMK_WIDGET_OUTPUT_STATUS bool "Widget for keyboard output status icons" depends on BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) - default y if BT && (!ZMK_SPLIT_BLE || ZMK_SPLIT_ROLE_CENTRAL) select LV_USE_LABEL config ZMK_WIDGET_PERIPHERAL_STATUS bool "Widget for split peripheral status icons" depends on BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL - default y if BT && ZMK_SPLIT_BLE && !ZMK_SPLIT_ROLE_CENTRAL select LV_USE_LABEL config ZMK_WIDGET_WPM_STATUS From ee1e13510410e9b482fd20acf112bc3f1466c362 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Tue, 18 Jul 2023 23:21:09 -0700 Subject: [PATCH 401/494] fix: Proper battery sensor Kconfig dependencies. Properly make the battery sensor Kconfig symbols depend on `SENSOR` config, and minor battery reporting Kconfig symbol dependency fix. --- app/Kconfig | 2 +- app/drivers/sensor/battery/Kconfig | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 92641c14..fe019918 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -500,7 +500,7 @@ config ZMK_SETTINGS_SAVE_DEBOUNCE endif config ZMK_BATTERY_REPORT_INTERVAL - depends on ZMK_BLE + depends on ZMK_BATTERY_REPORTING int "Battery level report interval in seconds" default 60 diff --git a/app/drivers/sensor/battery/Kconfig b/app/drivers/sensor/battery/Kconfig index a9d7189e..703adebd 100644 --- a/app/drivers/sensor/battery/Kconfig +++ b/app/drivers/sensor/battery/Kconfig @@ -14,6 +14,7 @@ config ZMK_BATTERY_NRF_VDDH default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_NRF_VDDH)) select ADC select ZMK_BATTERY + depends on SENSOR help Enable ZMK nRF VDDH voltage driver for battery monitoring. @@ -22,5 +23,6 @@ config ZMK_BATTERY_VOLTAGE_DIVIDER default $(dt_compat_enabled,$(DT_COMPAT_ZMK_BATTERY_VOLTAGE_DIVIDER)) select ADC select ZMK_BATTERY + depends on SENSOR help Enable ZMK battery voltage divider driver for battery monitoring. From cec2061dada6b18580ce20f0c1c70df38aa2a379 Mon Sep 17 00:00:00 2001 From: Maciej Konieczny aka narf Date: Wed, 19 Jul 2023 21:59:29 +0200 Subject: [PATCH 402/494] fix(docs): Fix typos in parameterized macros docs. --- docs/docs/behaviors/macros.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 40c333a9..279d1356 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -61,9 +61,9 @@ Macros can also be "parameterized", allowing them to be bound in your keymap wit When defining a parameterized macro, a different `compatible` value will be used depending on how many parameters are passed into it: -- `zmk,behavior-macro` - a parameter that takes no parameters. -- `zmk,behavior-macro-one-param` - a parameter that takes one parameter when used. -- `zmk,behavior-macro-two-param` - a parameter that takes two parameters when used. +- `zmk,behavior-macro` - a macro that takes no parameters. +- `zmk,behavior-macro-one-param` - a macro that takes one parameter when used. +- `zmk,behavior-macro-two-param` - a macro that takes two parameters when used. ### Bindings From b945ffe943f1639bfe992ddb4bc12f968d3858f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:07:59 +0000 Subject: [PATCH 403/494] chore(deps): bump semver from 5.7.1 to 5.7.2 in /docs Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 156 ++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 5badb07e..b990f53c 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -251,9 +251,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -325,9 +325,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -384,9 +384,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1634,9 +1634,9 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1846,9 +1846,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2959,9 +2959,9 @@ } }, "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -4366,9 +4366,9 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -6812,9 +6812,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -9456,9 +9456,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -11353,9 +11353,9 @@ } }, "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -13008,9 +13008,9 @@ } }, "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -13522,9 +13522,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -13547,9 +13547,9 @@ } }, "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -16203,9 +16203,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -16260,9 +16260,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -16303,9 +16303,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -17113,9 +17113,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -17270,9 +17270,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -18097,9 +18097,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -19210,9 +19210,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -20999,9 +20999,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true } } @@ -22887,9 +22887,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -24147,9 +24147,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -25310,9 +25310,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -25676,9 +25676,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -25692,9 +25692,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, From 73e1b526d56376be09908a3726fbe9553052e447 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 19 Jul 2023 14:59:40 +0000 Subject: [PATCH 404/494] fix(bluetooth): Properly clear peripheral slots * When the clear bonds Kconfig is set, also clear peripheral address slots addresses from settings as well. --- app/src/ble.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/ble.c b/app/src/ble.c index ff82f3cf..6607574c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -606,7 +606,7 @@ static int zmk_ble_init(const struct device *_arg) { bt_unpair(BT_ID_DEFAULT, NULL); - for (int i = 0; i < ZMK_BLE_PROFILE_COUNT; i++) { + for (int i = 0; i < 8; i++) { char setting_name[15]; sprintf(setting_name, "ble/profiles/%d", i); @@ -615,7 +615,20 @@ static int zmk_ble_init(const struct device *_arg) { LOG_ERR("Failed to delete setting: %d", err); } } -#endif + + // Hardcoding a reasonable hardcoded value of peripheral addresses + // to clear so we properly clear a split central as well. + for (int i = 0; i < 8; i++) { + char setting_name[32]; + sprintf(setting_name, "ble/peripheral_addresses/%d", i); + + err = settings_delete(setting_name); + if (err) { + LOG_ERR("Failed to delete setting: %d", err); + } + } + +#endif // IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) bt_conn_cb_register(&conn_callbacks); bt_conn_auth_cb_register(&zmk_ble_auth_cb_display); From ed400c4feb7955bdc839fbf33b463a73c898a033 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 19 Jul 2023 16:21:06 +0000 Subject: [PATCH 405/494] fix(bluetooth): Corrected use of `bt_addr_le_cmp` * Properly compare to zero when comparing LE addresses. --- app/src/ble.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/ble.c b/app/src/ble.c index 6607574c..38a9833c 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -281,14 +281,14 @@ int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { for (int i = 0; i < ZMK_SPLIT_BLE_PERIPHERAL_COUNT; i++) { // If the address is recognized and already stored in settings, return // index and no additional action is necessary. - if (!bt_addr_le_cmp(&peripheral_addrs[i], addr)) { + if (bt_addr_le_cmp(&peripheral_addrs[i], addr) == 0) { return i; } // If the peripheral address slot is open, store new peripheral in the // slot and return index. This compares against BT_ADDR_LE_ANY as that // is the zero value. - if (!bt_addr_le_cmp(&peripheral_addrs[i], BT_ADDR_LE_ANY)) { + if (bt_addr_le_cmp(&peripheral_addrs[i], BT_ADDR_LE_ANY) == 0) { char addr_str[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(addr, addr_str, sizeof(addr_str)); LOG_DBG("Storing peripheral %s in slot %d", addr_str, i); From 54c2e8e155e9be71026251946c98e8e45c989388 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Jul 2023 06:35:41 +0000 Subject: [PATCH 406/494] feat: Add more logging to peripheral settings. --- app/src/ble.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/ble.c b/app/src/ble.c index 38a9833c..483bc9d7 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -282,7 +282,12 @@ int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr) { // If the address is recognized and already stored in settings, return // index and no additional action is necessary. if (bt_addr_le_cmp(&peripheral_addrs[i], addr) == 0) { + LOG_DBG("Found existing peripheral address in slot %d", i); return i; + } else { + char addr_str[BT_ADDR_LE_STR_LEN]; + bt_addr_le_to_str(&peripheral_addrs[i], addr_str, sizeof(addr_str)); + LOG_DBG("peripheral slot %d occupied by %s", i, addr_str); } // If the peripheral address slot is open, store new peripheral in the From 5f6a13413bba84eeb1eb89c4ff2a5710ca552e6b Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Jul 2023 23:34:09 -0700 Subject: [PATCH 407/494] fix(bluetooth): Split improvements * Proper usage of bt_uuid_cmp. * Central's don't start scanning for peripherals if `ZMK_BLE_CLEAR_BONDS_ON_START` is enabled. * Split peripherals don't advertize if `ZMK_BLE_CLEAR_BONDS_ON_START` is enabled. --- app/src/split/bluetooth/central.c | 15 ++++++++------- app/src/split/bluetooth/peripheral.c | 4 ++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 147760ff..8a5e9d35 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -251,8 +251,8 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, LOG_DBG("[ATTRIBUTE] handle %u", attr->handle); - if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID))) { + if (bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, + BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID)) == 0) { LOG_DBG("Found position state characteristic"); slot->discover_params.uuid = NULL; slot->discover_params.start_handle = attr->handle + 2; @@ -264,8 +264,8 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, slot->subscribe_params.notify = split_central_notify_func; slot->subscribe_params.value = BT_GATT_CCC_NOTIFY; split_central_subscribe(conn); - } else if (!bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID))) { + } else if (bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, + BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID)) == 0) { LOG_DBG("Found run behavior handle"); slot->run_behavior_handle = bt_gatt_attr_value_handle(attr); } @@ -292,7 +292,8 @@ static uint8_t split_central_service_discovery_func(struct bt_conn *conn, return BT_GATT_ITER_STOP; } - if (bt_uuid_cmp(slot->discover_params.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID))) { + if (bt_uuid_cmp(slot->discover_params.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID)) != + 0) { LOG_DBG("Found other service"); return BT_GATT_ITER_CONTINUE; } @@ -418,7 +419,7 @@ static bool split_central_eir_parse(struct bt_data *data, void *user_data) { continue; } - if (bt_uuid_cmp(&uuid.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID))) { + if (bt_uuid_cmp(&uuid.uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_SERVICE_UUID)) != 0) { char uuid_str[BT_UUID_STR_LEN]; char service_uuid_str[BT_UUID_STR_LEN]; @@ -622,7 +623,7 @@ int zmk_split_bt_central_init(const struct device *_arg) { CONFIG_ZMK_BLE_THREAD_PRIORITY, NULL); bt_conn_cb_register(&conn_callbacks); - return start_scanning(); + return IS_ENABLED(CONFIG_ZMK_BLE_CLEAR_BONDS_ON_START) ? 0 : start_scanning(); } SYS_INIT(zmk_split_bt_central_init, APPLICATION, CONFIG_ZMK_BLE_INIT_PRIORITY); diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index 6b767baa..e053db8a 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -116,11 +116,11 @@ static int zmk_peripheral_ble_init(const struct device *_arg) { LOG_WRN("Clearing all existing BLE bond information from the keyboard"); bt_unpair(BT_ID_DEFAULT, NULL); -#endif - +#else bt_conn_cb_register(&conn_callbacks); start_advertising(); +#endif return 0; } From 147f7f23dca7a2eb5d7433d399948cfd51e068a9 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 20 Jul 2023 23:53:38 -0700 Subject: [PATCH 408/494] fix(shields): Make settings_reset more flexible. * Don't reference `pro_micro` nexus node in settings_reset so it can be used with other controllers. * Use mock kscan node instead. --- app/boards/shields/settings_reset/settings_reset.keymap | 4 +--- app/boards/shields/settings_reset/settings_reset.overlay | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/boards/shields/settings_reset/settings_reset.keymap b/app/boards/shields/settings_reset/settings_reset.keymap index 0afdcc2b..1206ef1e 100644 --- a/app/boards/shields/settings_reset/settings_reset.keymap +++ b/app/boards/shields/settings_reset/settings_reset.keymap @@ -12,9 +12,7 @@ compatible = "zmk,keymap"; default_layer { - bindings = < - &sys_reset - >; + bindings = <&sys_reset>; }; }; }; diff --git a/app/boards/shields/settings_reset/settings_reset.overlay b/app/boards/shields/settings_reset/settings_reset.overlay index 77a9d858..48a5f223 100644 --- a/app/boards/shields/settings_reset/settings_reset.overlay +++ b/app/boards/shields/settings_reset/settings_reset.overlay @@ -12,12 +12,12 @@ }; kscan0: kscan { - compatible = "zmk,kscan-gpio-direct"; + compatible = "zmk,kscan-mock"; label = "KSCAN"; + columns = <1>; + rows = <0>; - input-gpios - = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> - ; + events = <>; }; }; From f743d57ff1d4d68f51fb11b99fc0217eeca42919 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 10 Jul 2023 22:44:44 -0700 Subject: [PATCH 409/494] feat(shields): Add splitkb.com Aurora Sofle * Add new shield for splitkb.com Aurora Sofle, supporting keys, encoder(s), displays, and RGB. Co-authored-by: Cem Aksoylar --- .../splitkb_aurora_sofle/Kconfig.defconfig | 53 +++++++++++++ .../splitkb_aurora_sofle/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 46 +++++++++++ .../boards/nice_nano_v2.overlay | 46 +++++++++++ .../splitkb_aurora_sofle.conf | 9 +++ .../splitkb_aurora_sofle.dtsi | 79 +++++++++++++++++++ .../splitkb_aurora_sofle.keymap | 78 ++++++++++++++++++ .../splitkb_aurora_sofle.zmk.yml | 15 ++++ .../splitkb_aurora_sofle_left.overlay | 43 ++++++++++ .../splitkb_aurora_sofle_right.overlay | 45 +++++++++++ 10 files changed, 422 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_sofle/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay diff --git a/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig new file mode 100644 index 00000000..b53c4c8d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig @@ -0,0 +1,53 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_SOFLE_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Sofle" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_SOFLE_LEFT + +if SHIELD_SPLITKB_AURORA_SOFLE_LEFT || SHIELD_SPLITKB_AURORA_SOFLE_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LV_Z_VDB_SIZE + default 64 + +config LV_DPI_DEF + default 148 + +config LV_Z_BITS_PER_PIXEL + default 1 + +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_SOFLE_LEFT || SHIELD_SPLITKB_AURORA_SOFLE_RIGHT diff --git a/app/boards/shields/splitkb_aurora_sofle/Kconfig.shield b/app/boards/shields/splitkb_aurora_sofle/Kconfig.shield new file mode 100644 index 00000000..c72e95d9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_SOFLE_LEFT + def_bool $(shields_list_contains,splitkb_aurora_sofle_left) + +config SHIELD_SPLITKB_AURORA_SOFLE_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_sofle_right) diff --git a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/boards/nice_nano_v2.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf new file mode 100644 index 00000000..d456100a --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi new file mode 100644 index 00000000..798cd84e --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.dtsi @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; +// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | +// | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | +// | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | +// | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | +// | SW30 | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | SW30 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + steps = <144>; + status = "disabled"; + + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + steps = <144>; + status = "disabled"; + + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 10 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <36>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap new file mode 100644 index 00000000..23127416 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.keymap @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/* Uncomment this block if using RGB +&led_strip { + chain-length = <6>; + // chain-length = <35>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <29>; // Uncomment if using only per-key LEDs. +}; + */ + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ------------------------------------------------------------------------------------------------------------ +// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | +// | TAB | Q | W | E | R | T | | Y | U | I | O | P | - | +// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | "[" | | "]" | N | M | , | . | / | SHIFT | +// |CTRL | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | RALT | + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS +&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI &kp RALT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + lower_layer { +// ------------------------------------------------------------------------------------------------------------ +// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | +// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ | +// | | | | | | | | | | | _ | + | { | } | "|" | +// | | | | | | | | | | | | + bindings = < +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 +&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE +&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + + raise_layer { +// ------------------------------------------------------------------------------------------------------------ +// | | | | | | | | | | | | | | +// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | +// | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | | +// | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ | +// | | | | | | | | | | | | + bindings = < +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans +&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans +&kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml new file mode 100644 index 00000000..d832d3e1 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: splitkb_aurora_sofle +name: splitkb.com Aurora Sofle +type: shield +url: https://splitkb.com/products/aurora-sofle-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - splitkb_aurora_sofle_left + - splitkb_aurora_sofle_right diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay new file mode 100644 index 00000000..1adaf401 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_left.overlay @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sofle.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; + + diff --git a/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay new file mode 100644 index 00000000..3249b941 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_sofle/splitkb_aurora_sofle_right.overlay @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_sofle.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <6>; +}; From 9a963abfc8b27c6fdfb5b6b4b38e5905d6a360a7 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Mon, 17 Jul 2023 17:16:04 -0400 Subject: [PATCH 410/494] refactor: use low priority workqueue for underglow and battery reporting Blocking operations on the high priority system workqueue may result in deadlocks, particularly when Bluetooth is in use. --- app/CMakeLists.txt | 1 + app/Kconfig | 8 ++++++++ app/include/zmk/workqueue.h | 1 + app/src/battery.c | 14 +++++--------- app/src/rgb_underglow.c | 3 ++- app/src/workqueue.c | 27 +++++++++++++++++++++++++++ 6 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 app/include/zmk/workqueue.h create mode 100644 app/src/workqueue.c diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 4c1c63c2..efa34905 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -87,6 +87,7 @@ target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c) target_sources_ifdef(CONFIG_ZMK_USB app PRIVATE src/usb_hid.c) target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c) target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/backlight.c) +target_sources(app PRIVATE src/workqueue.c) target_sources(app PRIVATE src/main.c) add_subdirectory(src/display/) diff --git a/app/Kconfig b/app/Kconfig index fe019918..89a128b5 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -504,6 +504,14 @@ config ZMK_BATTERY_REPORT_INTERVAL int "Battery level report interval in seconds" default 60 +config ZMK_LOW_PRIORITY_THREAD_STACK_SIZE + int "Low priority thread stack size" + default 768 + +config ZMK_LOW_PRIORITY_THREAD_PRIORITY + int "Low priority thread priority" + default 10 + #Advanced endmenu diff --git a/app/include/zmk/workqueue.h b/app/include/zmk/workqueue.h new file mode 100644 index 00000000..41e94580 --- /dev/null +++ b/app/include/zmk/workqueue.h @@ -0,0 +1 @@ +struct k_work_q *zmk_workqueue_lowprio_work_q(); diff --git a/app/src/battery.c b/app/src/battery.c index 540f7c3e..87a25e08 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -18,6 +18,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#include static uint8_t last_state_of_charge = 0; @@ -77,7 +78,9 @@ static void zmk_battery_work(struct k_work *work) { K_WORK_DEFINE(battery_work, zmk_battery_work); -static void zmk_battery_timer(struct k_timer *timer) { k_work_submit(&battery_work); } +static void zmk_battery_timer(struct k_timer *timer) { + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &battery_work); +} K_TIMER_DEFINE(battery_timer, zmk_battery_timer, NULL); @@ -97,14 +100,7 @@ static int zmk_battery_init(const struct device *_arg) { return -ENODEV; } - int rc = zmk_battery_update(battery); - - if (rc != 0) { - LOG_DBG("Failed to update battery value: %d.", rc); - return rc; - } - - k_timer_start(&battery_timer, K_MINUTES(1), K_SECONDS(CONFIG_ZMK_BATTERY_REPORT_INTERVAL)); + k_timer_start(&battery_timer, K_NO_WAIT, K_SECONDS(CONFIG_ZMK_BATTERY_REPORT_INTERVAL)); return 0; } diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 7b649174..08ba2fb2 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -24,6 +24,7 @@ #include #include #include +#include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -203,7 +204,7 @@ static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) { return; } - k_work_submit(&underglow_work); + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_work); } K_TIMER_DEFINE(underglow_tick, zmk_rgb_underglow_tick_handler, NULL); diff --git a/app/src/workqueue.c b/app/src/workqueue.c new file mode 100644 index 00000000..a9a8bce5 --- /dev/null +++ b/app/src/workqueue.c @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +#include + +K_THREAD_STACK_DEFINE(lowprio_q_stack, CONFIG_ZMK_LOW_PRIORITY_THREAD_STACK_SIZE); + +static struct k_work_q lowprio_work_q; + +struct k_work_q *zmk_workqueue_lowprio_work_q() { + return &lowprio_work_q; +} + +static int workqueue_init() { + static const struct k_work_queue_config queue_config = {.name = "Low Priority Work Queue"}; + k_work_queue_start(&lowprio_work_q, lowprio_q_stack, K_THREAD_STACK_SIZEOF(lowprio_q_stack), + CONFIG_ZMK_LOW_PRIORITY_THREAD_PRIORITY, &queue_config); + return 0; +} + +SYS_INIT(workqueue_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); From cb9c573b534dcb52ee8cf6b2cec6cb880e841301 Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Mon, 17 Jul 2023 17:32:14 -0400 Subject: [PATCH 411/494] refactor(underglow): turn underglow off in low priority work queue --- app/src/rgb_underglow.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/rgb_underglow.c b/app/src/rgb_underglow.c index 08ba2fb2..b80d4039 100644 --- a/app/src/rgb_underglow.c +++ b/app/src/rgb_underglow.c @@ -197,14 +197,14 @@ static void zmk_rgb_underglow_tick(struct k_work *work) { } } -K_WORK_DEFINE(underglow_work, zmk_rgb_underglow_tick); +K_WORK_DEFINE(underglow_tick_work, zmk_rgb_underglow_tick); static void zmk_rgb_underglow_tick_handler(struct k_timer *timer) { if (!state.on) { return; } - k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_work); + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_tick_work); } K_TIMER_DEFINE(underglow_tick, zmk_rgb_underglow_tick_handler, NULL); @@ -323,6 +323,16 @@ int zmk_rgb_underglow_on() { return zmk_rgb_underglow_save_state(); } +static void zmk_rgb_underglow_off_handler(struct k_work *work) { + for (int i = 0; i < STRIP_NUM_PIXELS; i++) { + pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; + } + + led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); +} + +K_WORK_DEFINE(underglow_off_work, zmk_rgb_underglow_off_handler); + int zmk_rgb_underglow_off() { if (!led_strip) return -ENODEV; @@ -336,11 +346,7 @@ int zmk_rgb_underglow_off() { } #endif - for (int i = 0; i < STRIP_NUM_PIXELS; i++) { - pixels[i] = (struct led_rgb){r : 0, g : 0, b : 0}; - } - - led_strip_update_rgb(led_strip, pixels, STRIP_NUM_PIXELS); + k_work_submit_to_queue(zmk_workqueue_lowprio_work_q(), &underglow_off_work); k_timer_stop(&underglow_tick); state.on = false; From e65a7e3075a7a153ea478d4fd293ae65b31e33ed Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Thu, 20 Jul 2023 16:48:02 -0400 Subject: [PATCH 412/494] fix(battery): change nRF52 ADC gain With ADC pin, maximum 3.6V input needs gain 1/6 to be less than the 0.6V reference. With VDDHDIV5, maximum 6V input corresponds to 1.2V so gain 1/2 will be less than the 0.6V reference and be slightly more precise. --- app/drivers/sensor/battery/battery_nrf_vddh.c | 2 +- app/drivers/sensor/battery/battery_voltage_divider.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/drivers/sensor/battery/battery_nrf_vddh.c b/app/drivers/sensor/battery/battery_nrf_vddh.c index 3f230812..32c7c61e 100644 --- a/app/drivers/sensor/battery/battery_nrf_vddh.c +++ b/app/drivers/sensor/battery/battery_nrf_vddh.c @@ -93,7 +93,7 @@ static int vddh_init(const struct device *dev) { #ifdef CONFIG_ADC_NRFX_SAADC drv_data->acc = (struct adc_channel_cfg){ - .gain = ADC_GAIN_1_5, + .gain = ADC_GAIN_1_2, .reference = ADC_REF_INTERNAL, .acquisition_time = ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 40), .input_positive = SAADC_CH_PSELN_PSELN_VDDHDIV5, diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/drivers/sensor/battery/battery_voltage_divider.c index 655af3db..62a02e9c 100644 --- a/app/drivers/sensor/battery/battery_voltage_divider.c +++ b/app/drivers/sensor/battery/battery_voltage_divider.c @@ -140,7 +140,7 @@ static int bvd_init(const struct device *dev) { #ifdef CONFIG_ADC_NRFX_SAADC drv_data->acc = (struct adc_channel_cfg){ - .gain = ADC_GAIN_1_5, + .gain = ADC_GAIN_1_6, .reference = ADC_REF_INTERNAL, .acquisition_time = ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 40), .input_positive = SAADC_CH_PSELP_PSELP_AnalogInput0 + drv_cfg->io_channel.channel, From d17c473d45b3bd01d80b8a5eab417986be0281da Mon Sep 17 00:00:00 2001 From: Jorge Villalobos Date: Wed, 2 Aug 2023 12:57:00 -0400 Subject: [PATCH 413/494] feat(docs): Improve parameterized macros docs --- docs/docs/behaviors/macros.md | 150 +++++++++++++++++++++++----------- docs/docs/config/behaviors.md | 37 +++++---- 2 files changed, 122 insertions(+), 65 deletions(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 279d1356..0757e735 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -49,22 +49,6 @@ For use cases involving sending a single keycode with modifiers, for instance ct with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used instead of a macro. ::: -### Parameterized Macros - -Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: - -``` - raise_layer { - bindings = <&my_cool_macro A> - }; -``` - -When defining a parameterized macro, a different `compatible` value will be used depending on how many parameters are passed into it: - -- `zmk,behavior-macro` - a macro that takes no parameters. -- `zmk,behavior-macro-one-param` - a macro that takes one parameter when used. -- `zmk,behavior-macro-two-param` - a macro that takes two parameters when used. - ### Bindings Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can @@ -83,30 +67,6 @@ bindings There are a set of special macro controls that can be included in the `bindings` list to modify the way the macro is processed. -### Parameters - -When creating a macro that takes parameter(s), there are macro controls that change when the parameters passed to the macro are used -within the macro itself. All of the controls are "one shot" and will change how the passed in parameters are used for the very next non-macro control behavior in the `bindings` list of the macro. - -For example, to pass the first parameter from the macro into a `&kp` used in the macro, you would use: - -``` -bindings - = <¯o_param_1to1> - , <&kp MACRO_PLACEHOLDER> - ; -``` - -Because `kp` takes one parameter, you can't simply make the second entry `<&kp>` in the `bindings` list. Whatever value you do pass in will be replaced when the macro is triggered, so you can put _any_ value there, e.g. `0`, `A` keycode, etc. To make it very obvious that the parameter there is not actually going to be used, you can use `MACRO_PLACEHOLDER` which is simply an alias for `0`. - -The available parameter controls are: - -- `¯o_param_1to1` - pass the first parameter of the macro into the first parameter of the next behavior in the `bindings` list. -- `¯o_param_1to2` - pass the first parameter of the macro into the second parameter of the next behavior in the `bindings` list. - -* `¯o_param_2to1` - pass the second parameter of the macro into the first parameter of the next behavior in the `bindings` list. -* `¯o_param_2to2` - pass the second parameter of the macro into the second parameter of the next behavior in the `bindings` list. - ### Binding Activation Mode Bindings in a macro are activated differently, depending on the current "activation mode" of the macro. @@ -185,6 +145,70 @@ Macros use an internal queue to invoke each behavior in the bindings list when t To prevent issues with longer macros, you can change the size of this queue via the `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` setting in your configuration, [typically through your `.conf` file](../config/index.md). For example, `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE=512` would allow your macro to type about 256 characters. +## Parameterized Macros + +Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: + +``` + raise_layer { + bindings = <&my_one_param_macro A> + }; +``` + +### Defining Parameterized Macros + +Parameterized macros must be defined using specific values for the `compatible` and `#binding-cells` properties, depending on how many parameters they require (up to a maximum of two): + +```dts +/ { + macros { + // 0 params macro + my_macro: my_macro { + // ... + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; // Must be 0 + bindings = /* ... */; + }; + + // 1 param macro + my_one_param_macro: my_one_param_macro { + // ... + compatible = "zmk,behavior-macro-one-param"; + #binding-cells = <1>; // Must be 1 + bindings = /* ... */; + }; + + // 2 params macro + my_two_param_macro: my_two_param_macro { + // ... + compatible = "zmk,behavior-macro-two-param"; + #binding-cells = <2>; // Must be 2 + bindings = /* ... */; + }; + }; +}; +``` + +### Parameters, Bindings and Controls + +There are special macro controls which must be used in order to forward received parameters to the macro's `bindings`. These controls are "one shot" and will determine how received parameters are used on the very next (non-macro control) behavior in the macro's `bindings` list. + +For example, to pass the first parameter received into a `&kp` binding, you would use: + +```dts +bindings = <¯o_param_1to1>, <&kp MACRO_PLACEHOLDER>; +``` + +Because `kp` takes one parameter, you can't simply make the second entry `<&kp>` in the `bindings` list. Whatever value you do pass in will be replaced when the macro is triggered, so you can put _any_ value there, e.g. `0`, `A` keycode, etc. To make it very obvious that the parameter there is not actually going to be used, you can use `MACRO_PLACEHOLDER` which is simply an alias for `0`. + +The available parameter controls are: + +- `¯o_param_1to1` - pass the first parameter of the macro into the first parameter of the next behavior in the `bindings` list. +- `¯o_param_1to2` - pass the first parameter of the macro into the second parameter of the next behavior in the `bindings` list. + +* `¯o_param_2to1` - pass the second parameter of the macro into the first parameter of the next behavior in the `bindings` list. +* `¯o_param_2to2` - pass the second parameter of the macro into the second parameter of the next behavior in the `bindings` list. + ## Common Patterns Below are some examples of how the macro behavior can be used for various useful functionality. @@ -198,12 +222,36 @@ To achieve this, a combination of a 0ms wait time and splitting the press and re #### Layer + Modifier -``` -wait-ms = <0>; -bindings - = <¯o_press &mo 1 &kp LSHFT> - , <¯o_pause_for_release> - , <¯o_release &mo 1 &kp LSHFT>; +```dts +/** + * Temporarily switches to a layer (`&mo`) while a modifier is held. + * Analogous to QMK's `LM()`, using a parameterized macro. + * + * Params: + * 1. Layer to switch to + * 2. Modifier to press while layer is active + * + * Example: + * `&lm NUM_LAYER LSHIFT` + */ +lm: lm { + label = "LAYER_MOD"; + compatible = "zmk,behavior-macro-two-param"; + wait-ms = <0>; + tap-ms = <0>; + #binding-cells = <2>; + bindings + = <¯o_param_1to1> + , <¯o_press &mo MACRO_PLACEHOLDER> + , <¯o_param_2to1> + , <¯o_press &kp MACRO_PLACEHOLDER> + , <¯o_pause_for_release> + , <¯o_param_2to1> + , <¯o_release &kp MACRO_PLACEHOLDER> + , <¯o_param_1to1> + , <¯o_release &mo MACRO_PLACEHOLDER> + ; +}; ``` #### Layer + Underglow Color @@ -252,20 +300,24 @@ bindings ## Convenience C Macro -To avoid repetition or possible typos when declaring a macro, a convenience _C_ macro, named `ZMK_MACRO(name, props)` can be used to simplify things: +To avoid repetition or possible typos when declaring a **zero parameter macro**, a convenience _C_ macro, named `ZMK_MACRO(name, props)` can be used to simplify things: ``` - ZMK_MACRO(my_macro, + ZMK_MACRO(my_zero_param_macro, wait-ms = <30>; tap-ms = <40>; bindings = <&kp Z &kp M &kp K>; ) ``` +:::note +`ZMK_MACRO()` **only supports declaring non-parameterized (zero parameter) macros**; parameterized declarations are not currently supported. +::: + This can be used instead of a complete macro definition. During the firmware build process, the example above would produce the complete macro definition below: ``` - my_macro: my_macro { + my_zero_param_macro: my_zero_param_macro { compatible = "zmk,behavior-macro"; label = "ZM_my_macro"; #binding-cells = <0>; diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 2ff99d58..60e8b72a 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -131,26 +131,31 @@ See the [macro behavior](../behaviors/macros.md) documentation for more details Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-macro.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/behaviors/zmk%2Cbehavior-macro.yaml) -Applies to: `compatible = "zmk,behavior-macro"` +| Property | Type | Description | Default | +| ---------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | +| `label` | string | Unique label for the node | | +| `compatible` | string | Macro type, **must be _one_ of**:
• `"zmk,behavior-macro"`
• `"zmk,behavior-macro-one-param"`
• `"zmk,behavior-macro-two-param"` | | +| `#binding-cells` | int | Number of params accepted (depends on `compatible` property), **must be _one_ of**:
• `<0>`
• `<1>`
• `<2>` | | +| `bindings` | phandle array | List of behaviors to trigger | | +| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | +| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | -| Property | Type | Description | Default | -| ---------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------- | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<0>` | | -| `bindings` | phandle array | List of behaviors to trigger | | -| `wait-ms` | int | The default time to wait (in milliseconds) before triggering the next behavior. | `CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS` | -| `tap-ms` | int | The default time to wait (in milliseconds) between the press and release events of a tapped behavior. | `CONFIG_ZMK_MACRO_DEFAULT_TAP_MS` | +### Macro Control Behaviors The following macro-specific behaviors can be added at any point in the `bindings` list to change how the macro triggers subsequent behaviors. -| Behavior | Description | -| -------------------------- | ----------------------------------------------------------------------------------------------------- | -| `¯o_tap` | Switches to tap mode | -| `¯o_press` | Switches to press mode | -| `¯o_release` | Switches to release mode | -| `¯o_pause_for_release` | Pauses the macro until the macro key itself is released | -| `¯o_wait_time TIME` | Changes the time to wait (in milliseconds) before triggering the next behavior. | -| `¯o_tap_time TIME` | Changes the time to wait (in milliseconds) between the press and release events of a tapped behavior. | +| Behavior | Description | +| -------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `¯o_tap` | Switches to tap mode | +| `¯o_press` | Switches to press mode | +| `¯o_release` | Switches to release mode | +| `¯o_pause_for_release` | Pauses the macro until the macro key itself is released | +| `¯o_wait_time TIME` | Changes the time to wait (in milliseconds) before triggering the next behavior. | +| `¯o_tap_time TIME` | Changes the time to wait (in milliseconds) between the press and release events of a tapped behavior. | +| `¯o_param_1to1` | Forward the first parameter received by the macro to the first parameter of the next (non-macro control) behavior. | +| `¯o_param_1to2` | Forward the first parameter received by the macro to the second parameter of the next (non-macro control) behavior. | +| `¯o_param_2to1` | Forward the second parameter received by the macro to the first parameter of the next (non-macro control) behavior. | +| `¯o_param_2to2` | Forward the second parameter received by the macro to the second parameter of the next (non-macro control) behavior. | ## Mod-Morph From c957348e6187ffde3c073e8c367a60a7ee16b12c Mon Sep 17 00:00:00 2001 From: Seth Milliken Date: Tue, 8 Aug 2023 15:12:46 -0700 Subject: [PATCH 414/494] fix(docs): detail overriding the `led_strip` `chain-length` property Quite a few people have struggled with setting the correct `chain-length` for their `led_strip`. For some, this is their first time needing to change a pre-defined devicetree property, and so they aren't familiar with the technique. I commonly see folks adding a duplicate of the entire `*.overlay` file with only the `chain-length` value changed. Having clear documentation for this specific application of the property override technique could help forestall these problems, and give those of us helping out in Discord something to easily reference. --- docs/docs/features/underglow.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index 00d3aa0a..2b1400fc 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -39,6 +39,20 @@ use Kconfig. If your board or shield does not have RGB underglow configured, refer to [Adding RGB Underglow to a Board](#adding-rgb-underglow-to-a-board). +### Modifying the number of LEDs + +A common issue when enabling underglow is that some of the installed LEDs do not illuminate. This can happen when a board's default underglow configuration accounts only for either the downward facing LEDs or the upward facing LEDs under each key. On a split keyboard, a good sign that this may be the problem is that the unilluminated LEDs on each half are symmetrical. + +The number of underglow LEDs is controlled by the `chain-length` property in the `led_strip` node. You can [change the value of this property](../config/index.md#changing-devicetree-properties) in the `.keymap` file by adding a stanza like this one outside of any other node (i.e. above or below the `/` node): + +``` +&led_strip { + chain-length = <21>; +}; +``` + +where the value is the total count of LEDs (per half, for split keyboards). + ## Configuring RGB Underglow See [RGB underglow configuration](/docs/config/underglow). From 9d4422980088fb6d2130ac9a3119809984762267 Mon Sep 17 00:00:00 2001 From: Stephen Wan Date: Mon, 15 Mar 2021 12:26:18 -0700 Subject: [PATCH 415/494] feature(split): add support for sensors from peripheral This commit adds a new GATT characteristics on the peripheral side and wires it up to read sensor values. The central side subscribes to this new characteristics and replays sensor values on its side. Co-authored-by: Peter Johanson --- app/include/zmk/sensors.h | 6 +- app/include/zmk/split/bluetooth/service.h | 15 +++- app/include/zmk/split/bluetooth/uuid.h | 1 + app/src/sensors.c | 6 +- app/src/split/bluetooth/central.c | 92 +++++++++++++++++++---- app/src/split/bluetooth/service.c | 78 ++++++++++++++++++- app/src/split/bluetooth/split_listener.c | 26 +++++-- 7 files changed, 196 insertions(+), 28 deletions(-) diff --git a/app/include/zmk/sensors.h b/app/include/zmk/sensors.h index 8ac1c283..1919d4ce 100644 --- a/app/include/zmk/sensors.h +++ b/app/include/zmk/sensors.h @@ -24,7 +24,9 @@ struct zmk_sensor_config { uint16_t triggers_per_rotation; }; +// This struct is also used for data transfer for splits, so any changes to the size, layout, etc +// is a breaking change for the split GATT service protocol. struct zmk_sensor_channel_data { - enum sensor_channel channel; struct sensor_value value; -}; + enum sensor_channel channel; +} __packed; diff --git a/app/include/zmk/split/bluetooth/service.h b/app/include/zmk/split/bluetooth/service.h index f0c1d79f..112cd552 100644 --- a/app/include/zmk/split/bluetooth/service.h +++ b/app/include/zmk/split/bluetooth/service.h @@ -6,8 +6,18 @@ #pragma once +#include +#include + #define ZMK_SPLIT_RUN_BEHAVIOR_DEV_LEN 9 +struct sensor_event { + uint8_t sensor_index; + + uint8_t channel_data_size; + struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS]; +} __packed; + struct zmk_split_run_behavior_data { uint8_t position; uint8_t state; @@ -21,4 +31,7 @@ struct zmk_split_run_behavior_payload { } __packed; int zmk_split_bt_position_pressed(uint8_t position); -int zmk_split_bt_position_released(uint8_t position); \ No newline at end of file +int zmk_split_bt_position_released(uint8_t position); +int zmk_split_bt_sensor_triggered(uint8_t sensor_index, + const struct zmk_sensor_channel_data channel_data[], + size_t channel_data_size); diff --git a/app/include/zmk/split/bluetooth/uuid.h b/app/include/zmk/split/bluetooth/uuid.h index cbdb1772..c38131dd 100644 --- a/app/include/zmk/split/bluetooth/uuid.h +++ b/app/include/zmk/split/bluetooth/uuid.h @@ -16,3 +16,4 @@ #define ZMK_SPLIT_BT_SERVICE_UUID ZMK_BT_SPLIT_UUID(0x00000000) #define ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID ZMK_BT_SPLIT_UUID(0x00000001) #define ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID ZMK_BT_SPLIT_UUID(0x00000002) +#define ZMK_SPLIT_BT_CHAR_SENSOR_STATE_UUID ZMK_BT_SPLIT_UUID(0x00000003) diff --git a/app/src/sensors.c b/app/src/sensors.c index e339afe0..60f2bd2a 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -29,7 +29,7 @@ struct sensors_item_cfg { { \ .dev = DEVICE_DT_GET_OR_NULL(node), \ .trigger = {.type = SENSOR_TRIG_DATA_READY, .chan = SENSOR_CHAN_ROTATION}, \ - .config = &configs[idx] \ + .config = &configs[idx], .sensor_index = idx \ } #define SENSOR_ITEM(idx, _i) _SENSOR_ITEM(idx, ZMK_KEYMAP_SENSORS_BY_IDX(idx)) @@ -112,7 +112,7 @@ static void zmk_sensors_trigger_handler(const struct device *dev, int sensor_index = test_item - sensors; if (sensor_index < 0 || sensor_index >= ARRAY_SIZE(sensors)) { - LOG_ERR("Invalid sensor item triggered our callback"); + LOG_ERR("Invalid sensor item triggered our callback (%d)", sensor_index); return; } @@ -127,8 +127,6 @@ static void zmk_sensors_trigger_handler(const struct device *dev, static void zmk_sensors_init_item(uint8_t i) { LOG_DBG("Init sensor at index %d", i); - sensors[i].sensor_index = i; - if (!sensors[i].dev) { LOG_DBG("No local device for %d", i); return; diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index 8a5e9d35..b70d79e3 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -21,10 +21,12 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#include #include #include #include #include +#include static int start_scanning(void); @@ -41,6 +43,7 @@ struct peripheral_slot { struct bt_conn *conn; struct bt_gatt_discover_params discover_params; struct bt_gatt_subscribe_params subscribe_params; + struct bt_gatt_subscribe_params sensor_subscribe_params; struct bt_gatt_discover_params sub_discover_params; uint16_t run_behavior_handle; uint8_t position_state[POSITION_STATE_DATA_LEN]; @@ -165,6 +168,52 @@ int confirm_peripheral_slot_conn(struct bt_conn *conn) { return 0; } +#if ZMK_KEYMAP_HAS_SENSORS +K_MSGQ_DEFINE(peripheral_sensor_event_msgq, sizeof(struct zmk_sensor_event), + CONFIG_ZMK_SPLIT_BLE_CENTRAL_POSITION_QUEUE_SIZE, 4); + +void peripheral_sensor_event_work_callback(struct k_work *work) { + struct zmk_sensor_event ev; + while (k_msgq_get(&peripheral_sensor_event_msgq, &ev, K_NO_WAIT) == 0) { + LOG_DBG("Trigger sensor change for %d", ev.sensor_index); + ZMK_EVENT_RAISE(new_zmk_sensor_event(ev)); + } +} + +K_WORK_DEFINE(peripheral_sensor_event_work, peripheral_sensor_event_work_callback); + +static uint8_t split_central_sensor_notify_func(struct bt_conn *conn, + struct bt_gatt_subscribe_params *params, + const void *data, uint16_t length) { + if (!data) { + LOG_DBG("[UNSUBSCRIBED]"); + params->value_handle = 0U; + return BT_GATT_ITER_STOP; + } + + LOG_DBG("[SENSOR NOTIFICATION] data %p length %u", data, length); + + if (length < offsetof(struct sensor_event, channel_data)) { + LOG_WRN("Ignoring sensor notify with insufficient data length (%d)", length); + return BT_GATT_ITER_STOP; + } + + struct sensor_event sensor_event; + memcpy(&sensor_event, data, MIN(length, sizeof(sensor_event))); + struct zmk_sensor_event ev = { + .sensor_index = sensor_event.sensor_index, + .channel_data_size = MIN(sensor_event.channel_data_size, ZMK_SENSOR_EVENT_MAX_CHANNELS), + .timestamp = k_uptime_get()}; + + memcpy(ev.channel_data, sensor_event.channel_data, + sizeof(struct zmk_sensor_channel_data) * sensor_event.channel_data_size); + k_msgq_put(&peripheral_sensor_event_msgq, &ev, K_NO_WAIT); + k_work_submit(&peripheral_sensor_event_work); + + return BT_GATT_ITER_CONTINUE; +} +#endif /* ZMK_KEYMAP_HAS_SENSORS */ + static uint8_t split_central_notify_func(struct bt_conn *conn, struct bt_gatt_subscribe_params *params, const void *data, uint16_t length) { @@ -209,14 +258,8 @@ static uint8_t split_central_notify_func(struct bt_conn *conn, return BT_GATT_ITER_CONTINUE; } -static void split_central_subscribe(struct bt_conn *conn) { - struct peripheral_slot *slot = peripheral_slot_for_conn(conn); - if (slot == NULL) { - LOG_ERR("No peripheral state found for connection"); - return; - } - - int err = bt_gatt_subscribe(conn, &slot->subscribe_params); +static int split_central_subscribe(struct bt_conn *conn, struct bt_gatt_subscribe_params *params) { + int err = bt_gatt_subscribe(conn, params); switch (err) { case -EALREADY: LOG_DBG("[ALREADY SUBSCRIBED]"); @@ -228,6 +271,8 @@ static void split_central_subscribe(struct bt_conn *conn) { LOG_ERR("Subscribe failed (err %d)", err); break; } + + return err; } static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, @@ -250,9 +295,9 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, } LOG_DBG("[ATTRIBUTE] handle %u", attr->handle); + const struct bt_uuid *chrc_uuid = ((struct bt_gatt_chrc *)attr->user_data)->uuid; - if (bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID)) == 0) { + if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID)) == 0) { LOG_DBG("Found position state characteristic"); slot->discover_params.uuid = NULL; slot->discover_params.start_handle = attr->handle + 2; @@ -263,14 +308,33 @@ static uint8_t split_central_chrc_discovery_func(struct bt_conn *conn, slot->subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); slot->subscribe_params.notify = split_central_notify_func; slot->subscribe_params.value = BT_GATT_CCC_NOTIFY; - split_central_subscribe(conn); - } else if (bt_uuid_cmp(((struct bt_gatt_chrc *)attr->user_data)->uuid, - BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID)) == 0) { + split_central_subscribe(conn, &slot->subscribe_params); +#if ZMK_KEYMAP_HAS_SENSORS + } else if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_SENSOR_STATE_UUID)) == + 0) { + slot->discover_params.uuid = NULL; + slot->discover_params.start_handle = attr->handle + 2; + slot->discover_params.type = BT_GATT_DISCOVER_CHARACTERISTIC; + + slot->sensor_subscribe_params.disc_params = &slot->sub_discover_params; + slot->sensor_subscribe_params.end_handle = slot->discover_params.end_handle; + slot->sensor_subscribe_params.value_handle = bt_gatt_attr_value_handle(attr); + slot->sensor_subscribe_params.notify = split_central_sensor_notify_func; + slot->sensor_subscribe_params.value = BT_GATT_CCC_NOTIFY; + split_central_subscribe(conn, &slot->sensor_subscribe_params); +#endif /* ZMK_KEYMAP_HAS_SENSORS */ + } else if (bt_uuid_cmp(chrc_uuid, BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID)) == + 0) { LOG_DBG("Found run behavior handle"); + slot->discover_params.uuid = NULL; + slot->discover_params.start_handle = attr->handle + 2; slot->run_behavior_handle = bt_gatt_attr_value_handle(attr); } - bool subscribed = (slot->run_behavior_handle && slot->subscribe_params.value_handle); + bool subscribed = slot->run_behavior_handle && slot->subscribe_params.value_handle; +#if ZMK_KEYMAP_HAS_SENSORS + subscribed = subscribed && slot->sensor_subscribe_params.value_handle; +#endif /* ZMK_KEYMAP_HAS_SENSORS */ return subscribed ? BT_GATT_ITER_STOP : BT_GATT_ITER_CONTINUE; } diff --git a/app/src/split/bluetooth/service.c b/app/src/split/bluetooth/service.c index f7b0d587..620df53e 100644 --- a/app/src/split/bluetooth/service.c +++ b/app/src/split/bluetooth/service.c @@ -4,6 +4,7 @@ * SPDX-License-Identifier: MIT */ +#include #include #include #include @@ -20,6 +21,22 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include +#include +#include + +#if ZMK_KEYMAP_HAS_SENSORS +static struct sensor_event last_sensor_event; + +static ssize_t split_svc_sensor_state(struct bt_conn *conn, const struct bt_gatt_attr *attrs, + void *buf, uint16_t len, uint16_t offset) { + return bt_gatt_attr_read(conn, attrs, buf, len, offset, &last_sensor_event, + sizeof(last_sensor_event)); +} + +static void split_svc_sensor_state_ccc(const struct bt_gatt_attr *attr, uint16_t value) { + LOG_DBG("value %d", value); +} +#endif /* ZMK_KEYMAP_HAS_SENSORS */ #define POS_STATE_LEN 16 @@ -98,7 +115,14 @@ BT_GATT_SERVICE_DEFINE( BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE_ENCRYPT, NULL, split_svc_run_behavior, &behavior_run_payload), BT_GATT_DESCRIPTOR(BT_UUID_NUM_OF_DIGITALS, BT_GATT_PERM_READ, split_svc_num_of_positions, NULL, - &num_of_positions), ); + &num_of_positions), +#if ZMK_KEYMAP_HAS_SENSORS + BT_GATT_CHARACTERISTIC(BT_UUID_DECLARE_128(ZMK_SPLIT_BT_CHAR_SENSOR_STATE_UUID), + BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_READ_ENCRYPT, + split_svc_sensor_state, NULL, &last_sensor_event), + BT_GATT_CCC(split_svc_sensor_state_ccc, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), +#endif /* ZMK_KEYMAP_HAS_SENSORS */ +); K_THREAD_STACK_DEFINE(service_q_stack, CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE); @@ -151,6 +175,58 @@ int zmk_split_bt_position_released(uint8_t position) { return send_position_state(); } +#if ZMK_KEYMAP_HAS_SENSORS +K_MSGQ_DEFINE(sensor_state_msgq, sizeof(struct sensor_event), + CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE, 4); + +void send_sensor_state_callback(struct k_work *work) { + while (k_msgq_get(&sensor_state_msgq, &last_sensor_event, K_NO_WAIT) == 0) { + int err = bt_gatt_notify(NULL, &split_svc.attrs[8], &last_sensor_event, + sizeof(last_sensor_event)); + if (err) { + LOG_DBG("Error notifying %d", err); + } + } +}; + +K_WORK_DEFINE(service_sensor_notify_work, send_sensor_state_callback); + +int send_sensor_state(struct sensor_event ev) { + int err = k_msgq_put(&sensor_state_msgq, &ev, K_MSEC(100)); + if (err) { + // retry... + switch (err) { + case -EAGAIN: { + LOG_WRN("Sensor state message queue full, popping first message and queueing again"); + struct sensor_event discarded_state; + k_msgq_get(&sensor_state_msgq, &discarded_state, K_NO_WAIT); + return send_sensor_state(ev); + } + default: + LOG_WRN("Failed to queue sensor state to send (%d)", err); + return err; + } + } + + k_work_submit_to_queue(&service_work_q, &service_sensor_notify_work); + return 0; +} + +int zmk_split_bt_sensor_triggered(uint8_t sensor_index, + const struct zmk_sensor_channel_data channel_data[], + size_t channel_data_size) { + if (channel_data_size > ZMK_SENSOR_EVENT_MAX_CHANNELS) { + return -EINVAL; + } + + struct sensor_event ev = + (struct sensor_event){.sensor_index = sensor_index, .channel_data_size = channel_data_size}; + memcpy(ev.channel_data, channel_data, + channel_data_size * sizeof(struct zmk_sensor_channel_data)); + return send_sensor_state(ev); +} +#endif /* ZMK_KEYMAP_HAS_SENSORS */ + int service_init(const struct device *_arg) { static const struct k_work_queue_config queue_config = { .name = "Split Peripheral Notification Queue"}; diff --git a/app/src/split/bluetooth/split_listener.c b/app/src/split/bluetooth/split_listener.c index eb5398c4..9b680d2c 100644 --- a/app/src/split/bluetooth/split_listener.c +++ b/app/src/split/bluetooth/split_listener.c @@ -13,21 +13,35 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include +#include #include +#include #include int split_listener(const zmk_event_t *eh) { LOG_DBG(""); - const struct zmk_position_state_changed *ev = as_zmk_position_state_changed(eh); - if (ev != NULL) { - if (ev->state) { - return zmk_split_bt_position_pressed(ev->position); + const struct zmk_position_state_changed *pos_ev; + if ((pos_ev = as_zmk_position_state_changed(eh)) != NULL) { + if (pos_ev->state) { + return zmk_split_bt_position_pressed(pos_ev->position); } else { - return zmk_split_bt_position_released(ev->position); + return zmk_split_bt_position_released(pos_ev->position); } } + +#if ZMK_KEYMAP_HAS_SENSORS + const struct zmk_sensor_event *sensor_ev; + if ((sensor_ev = as_zmk_sensor_event(eh)) != NULL) { + return zmk_split_bt_sensor_triggered(sensor_ev->sensor_index, sensor_ev->channel_data, + sensor_ev->channel_data_size); + } +#endif /* ZMK_KEYMAP_HAS_SENSORS */ return ZMK_EV_EVENT_BUBBLE; } ZMK_LISTENER(split_listener, split_listener); -ZMK_SUBSCRIPTION(split_listener, zmk_position_state_changed); \ No newline at end of file +ZMK_SUBSCRIPTION(split_listener, zmk_position_state_changed); + +#if ZMK_KEYMAP_HAS_SENSORS +ZMK_SUBSCRIPTION(split_listener, zmk_sensor_event); +#endif /* ZMK_KEYMAP_HAS_SENSORS */ From dcb1f8f13528effc3e2ee3dadf9b385bf2394037 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Fri, 23 Jun 2023 07:28:27 +0000 Subject: [PATCH 416/494] fix(docs): Update docs about split encoder support --- docs/docs/features/encoders.md | 4 ---- docs/docs/intro.md | 9 ++++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/docs/docs/features/encoders.md b/docs/docs/features/encoders.md index 29906c90..0c493330 100644 --- a/docs/docs/features/encoders.md +++ b/docs/docs/features/encoders.md @@ -5,10 +5,6 @@ sidebar_label: Encoders Existing support for encoders in ZMK is focused around the five pin EC11 rotary encoder with push button design used in the majority of current keyboard and macropad designs. -:::note -Encoders are currently only support on the left/central sides of splits. For progress on this, see [#728](https://github.com/zmkfirmware/zmk/pull/728). -::: - ## Enabling EC11 Encoders To enable encoders for boards that have existing encoder support, uncomment the `CONFIG_EC11=y` and `CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y` lines in your board's .conf file in your `zmk-config/config` folder. Save and push your changes, then download and flash the new firmware. diff --git a/docs/docs/intro.md b/docs/docs/intro.md index 142dcafc..d65ac46e 100644 --- a/docs/docs/intro.md +++ b/docs/docs/intro.md @@ -23,11 +23,11 @@ ZMK is currently missing some features found in other popular firmware. This tab | Split Keyboard Support | ✅ | ✅ | ✅ | | [Keymaps and Layers](behaviors/layers.md) | ✅ | ✅ | ✅ | | [Hold-Tap](behaviors/hold-tap.md) (which includes [Mod-Tap](behaviors/mod-tap.md) and [Layer-Tap](behaviors/layers.md/#layer-tap)) | ✅ | ✅ | ✅ | -| [Tap-Dance](behaviors/tap-dance.md) | ✅ | ✅[^3] | ✅ | +| [Tap-Dance](behaviors/tap-dance.md) | ✅ | ✅[^2] | ✅ | | [Keyboard Codes](codes/index.mdx#keyboard) | ✅ | ✅ | ✅ | | [Media](codes/index.mdx#media-controls) & [Consumer](codes/index.mdx#consumer-controls) Codes | ✅ | ✅ | ✅ | -| [Encoders](features/encoders.md)[^1] | ✅ | ✅ | ✅ | -| [Display Support](features/displays.md)[^2] | 🚧 | 🚧 | ✅ | +| [Encoders](features/encoders.md) | ✅ | ✅ | ✅ | +| [Display Support](features/displays.md)[^1] | 🚧 | 🚧 | ✅ | | [RGB Underglow](features/underglow.md) | ✅ | ✅ | ✅ | | [Backlight](features/backlight.md) | ✅ | ✅ | ✅ | | One Shot Keys | ✅ | ✅ | ✅ | @@ -43,8 +43,7 @@ ZMK is currently missing some features found in other popular firmware. This tab | AVR/8 Bit | | | ✅ | | [Wide Range of ARM Chips Supported](https://docs.zephyrproject.org/latest/boards/index.html) | ✅ | | | -[^3]: Tap-Dances are limited to single and double-tap on BlueMicro -[^2]: Encoders are not currently supported on peripheral side splits. +[^2]: Tap-Dances are limited to single and double-tap on BlueMicro [^1]: OLEDs are currently proof of concept in ZMK. ## Code Of Conduct From a92a4967aa85f4ab19d36bcb81afc0420f2775d2 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 28 Jun 2023 19:26:33 +0000 Subject: [PATCH 417/494] fix(sensors): Only accept data once per behavior. * Don't accept data for the same behavior on multiple layers more than once, to avoid duplicate/extraneous triggers. --- app/include/zmk/keymap.h | 4 ++++ app/src/behaviors/behavior_sensor_rotate_common.c | 15 ++++++++------- app/src/behaviors/behavior_sensor_rotate_common.h | 5 +++-- app/src/keymap.c | 4 ---- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/app/include/zmk/keymap.h b/app/include/zmk/keymap.h index a47cd505..9ce140bf 100644 --- a/app/include/zmk/keymap.h +++ b/app/include/zmk/keymap.h @@ -8,6 +8,10 @@ #include +#define ZMK_LAYER_CHILD_LEN_PLUS_ONE(node) 1 + +#define ZMK_KEYMAP_LAYERS_LEN \ + (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0) + typedef uint32_t zmk_keymap_layers_state_t; uint8_t zmk_keymap_layer_default(); diff --git a/app/src/behaviors/behavior_sensor_rotate_common.c b/app/src/behaviors/behavior_sensor_rotate_common.c index 586cac3f..98b4aec1 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.c +++ b/app/src/behaviors/behavior_sensor_rotate_common.c @@ -28,7 +28,7 @@ int zmk_behavior_sensor_rotate_common_accept_data( if (value.val1 == 0) { triggers = value.val2; } else { - struct sensor_value remainder = data->remainder[sensor_index]; + struct sensor_value remainder = data->remainder[sensor_index][event.layer]; remainder.val1 += value.val1; remainder.val2 += value.val2; @@ -42,15 +42,16 @@ int zmk_behavior_sensor_rotate_common_accept_data( triggers = remainder.val1 / trigger_degrees; remainder.val1 %= trigger_degrees; - data->remainder[sensor_index] = remainder; + data->remainder[sensor_index][event.layer] = remainder; } LOG_DBG( "val1: %d, val2: %d, remainder: %d/%d triggers: %d inc keycode 0x%02X dec keycode 0x%02X", - value.val1, value.val2, data->remainder[sensor_index].val1, - data->remainder[sensor_index].val2, triggers, binding->param1, binding->param2); + value.val1, value.val2, data->remainder[sensor_index][event.layer].val1, + data->remainder[sensor_index][event.layer].val2, triggers, binding->param1, + binding->param2); - data->triggers[sensor_index] = triggers; + data->triggers[sensor_index][event.layer] = triggers; return 0; } @@ -64,11 +65,11 @@ int zmk_behavior_sensor_rotate_common_process(struct zmk_behavior_binding *bindi const int sensor_index = ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(event.position); if (mode != BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER) { - data->triggers[sensor_index] = 0; + data->triggers[sensor_index][event.layer] = 0; return ZMK_BEHAVIOR_TRANSPARENT; } - int triggers = data->triggers[sensor_index]; + int triggers = data->triggers[sensor_index][event.layer]; struct zmk_behavior_binding triggered_binding; if (triggers > 0) { diff --git a/app/src/behaviors/behavior_sensor_rotate_common.h b/app/src/behaviors/behavior_sensor_rotate_common.h index d354b679..c92ac3d5 100644 --- a/app/src/behaviors/behavior_sensor_rotate_common.h +++ b/app/src/behaviors/behavior_sensor_rotate_common.h @@ -6,6 +6,7 @@ #include #include +#include #include struct behavior_sensor_rotate_config { @@ -16,8 +17,8 @@ struct behavior_sensor_rotate_config { }; struct behavior_sensor_rotate_data { - struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN]; - int triggers[ZMK_KEYMAP_SENSORS_LEN]; + struct sensor_value remainder[ZMK_KEYMAP_SENSORS_LEN][ZMK_KEYMAP_LAYERS_LEN]; + int triggers[ZMK_KEYMAP_SENSORS_LEN][ZMK_KEYMAP_LAYERS_LEN]; }; int zmk_behavior_sensor_rotate_common_accept_data( diff --git a/app/src/keymap.c b/app/src/keymap.c index 020faf3f..bda69427 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -31,10 +31,6 @@ static uint8_t _zmk_keymap_layer_default = 0; #define DT_DRV_COMPAT zmk_keymap -#define LAYER_CHILD_LEN(node) 1 + -#define ZMK_KEYMAP_NODE DT_DRV_INST(0) -#define ZMK_KEYMAP_LAYERS_LEN (DT_INST_FOREACH_CHILD(0, LAYER_CHILD_LEN) 0) - #define BINDING_WITH_COMMA(idx, drv_inst) ZMK_KEYMAP_EXTRACT_BINDING(idx, drv_inst) #define TRANSFORMED_LAYER(node) \ From 185457bc1169176037aa281edb0a9bf485a70dbd Mon Sep 17 00:00:00 2001 From: Mikhail Stralenia Date: Tue, 29 Aug 2023 18:53:30 +0300 Subject: [PATCH 418/494] fix(shields): leeloo - proper encoder status for split encoders. --- app/boards/shields/leeloo/leeloo_common.dtsi | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/boards/shields/leeloo/leeloo_common.dtsi b/app/boards/shields/leeloo/leeloo_common.dtsi index 6ce93504..ef775cfb 100644 --- a/app/boards/shields/leeloo/leeloo_common.dtsi +++ b/app/boards/shields/leeloo/leeloo_common.dtsi @@ -51,6 +51,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <120>; + status = "disabled"; }; right_encoder: right_encoder { @@ -59,6 +60,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; steps = <120>; + status = "disabled"; }; sensors { @@ -87,4 +89,4 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) com-sequential; prechargep = <0x22>; }; -}; \ No newline at end of file +}; From fd4796583810b6fa42edcee7aa33fa9db4ba4a44 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Sep 2023 13:49:18 -0700 Subject: [PATCH 419/494] fix(docs): Remove diode-direction from direct GPIO driver --- docs/docs/config/kscan.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 787d5136..d240d79f 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -72,16 +72,15 @@ Applies to: `compatible = "zmk,kscan-gpio-direct"` Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-direct.yaml) -| Property | Type | Description | Default | -| ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ----------- | -| `label` | string | Unique label for the node | | -| `input-gpios` | GPIO array | Input GPIOs (one per key) | | -| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | -| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | -| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | -| `diode-direction` | string | The direction of the matrix diodes | `"row2col"` | -| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_DIRECT_POLLING` is enabled. | 10 | -| `toggle-mode` | bool | Use toggle switch mode. | n | +| Property | Type | Description | Default | +| ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `input-gpios` | GPIO array | Input GPIOs (one per key) | | +| `debounce-press-ms` | int | Debounce time for key press in milliseconds. Use 0 for eager debouncing. | 5 | +| `debounce-release-ms` | int | Debounce time for key release in milliseconds. | 5 | +| `debounce-scan-period-ms` | int | Time between reads in milliseconds when any key is pressed. | 1 | +| `poll-period-ms` | int | Time between reads in milliseconds when no key is pressed and `CONFIG_ZMK_KSCAN_DIRECT_POLLING` is enabled. | 10 | +| `toggle-mode` | bool | Use toggle switch mode. | n | By default, a switch will drain current through the internal pull up/down resistor whenever it is pressed. This is not ideal for a toggle switch, where the switch may be left in the "pressed" state for a long time. Enabling `toggle-mode` will make the driver flip between pull up and down as the switch is toggled to optimize for power. From 1e11e84d0d367a90d155df1d13824077f61bf158 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Sep 2023 14:44:37 -0700 Subject: [PATCH 420/494] fix(docs): Fix row/col comments in matrix examples --- docs/docs/config/kscan.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index d240d79f..5c70f4ba 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -296,9 +296,7 @@ Any keyboard which is not a grid of 1 unit keys will likely have some unused pos kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - rows = <5>; - columns = <4>; - // define the matrix... + // define row-gpios with 5 elements and col-gpios with 4... }; default_transform: matrix_transform { @@ -358,9 +356,7 @@ Consider a keyboard with a [duplex matrix](https://wiki.ai03.com/books/pcb-desig kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; - rows = <12>; - columns = <8>; - // define the matrix... + // define row-gpios with 12 elements and col-gpios with 8... }; default_transform: matrix_transform { From 3d938033b002c78ce24245e3cf37b7ba55876145 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Sep 2023 14:45:25 -0700 Subject: [PATCH 421/494] feat(docs): Note GPIO flags and add examples --- docs/docs/config/kscan.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 5c70f4ba..296cb4a1 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -86,6 +86,18 @@ By default, a switch will drain current through the internal pull up/down resist `toggle-mode` applies to all switches handled by the instance of the driver. To use a toggle switch with other, non-toggle, direct GPIO switches, create two instances of the direct GPIO driver, one with `toggle-mode` and the other without. Then, use a [composite driver](#composite-driver) to combine them. +Assuming the switches connect each GPIO pin to the ground, the [GPIO flags](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/gpio.html#api-reference) for the elements in `input-gpios` should be `(GPIO_ACTIVE_LOW | GPIO_PULL_UP)`: + +```devicetree + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + input-gpios + = <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&pro_micro 5 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; +``` + ## Matrix Driver Keyboard scan driver where keys are arranged on a matrix with one GPIO per row and column. @@ -122,6 +134,24 @@ The `diode-direction` property must be one of: | `"row2col"` | Diodes point from rows to columns (cathodes are connected to columns) | | `"col2row"` | Diodes point from columns to rows (cathodes are connected to rows) | +Given the `diode-direction`, the [GPIO flags](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/gpio.html#api-reference) for the elements in `row-` and `col-gpios` should be set appropriately. +The output pins (e.g. columns for `col2row`) should have the flag `GPIO_ACTIVE_HIGH`, and input pins (e.g. rows for `col2row`) should have the flags `(GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)`: + +```devicetree + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + diode-direction = "col2row"; + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + ; + row-gpios + = <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; +``` + ## Composite Driver Keyboard scan driver which combines multiple other keyboard scan drivers. From 369c7c1721861c9a0e5e47c6b1090abe8cfb0566 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Sep 2023 14:10:59 -0700 Subject: [PATCH 422/494] fix(docs): Correct default macro wait/tap ms --- docs/docs/behaviors/macros.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 0757e735..4836c205 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -111,7 +111,8 @@ bindings ### Wait Time -The wait time setting controls how long of a delay is introduced between behaviors in the `bindings` list. The initial wait time for a macro, 100ms by default, can +The wait time setting controls how long of a delay is introduced between behaviors in the `bindings` list. The initial wait time for a macro, +which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS`](../config/behaviors.md#macro) by default, can be set by assigning a value to the `wait-ms` property of the macro, e.g. `wait-ms = <20>;`. If you want to update the wait time at any point in the macro bindings list, use `¯o_wait_time`, e.g. `¯o_wait_time 30`. A full example: @@ -126,7 +127,8 @@ bindings ### Tap Time -The tap time setting controls how long a tapped behavior is held in the `bindings` list. The initial tap time for a macro, 100ms by default, can +The tap time setting controls how long a tapped behavior is held in the `bindings` list. The initial tap time for a macro, +which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_TAP_MS`](../config/behaviors.md#macro) by default, can be set by assigning a value to the `tap-ms` property of the macro, e.g. `tap-ms = <20>;`. If you want to update the tap time at any point in a macro bindings list, use `¯o_tap_time`, e.g. `¯o_tap_time 30`. A full example: From b20d3178b9d681f2b959cc7980d7252cda415189 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Sep 2023 14:11:30 -0700 Subject: [PATCH 423/494] feat(docs): Note devicetree limits re: macro bindings --- docs/docs/behaviors/macros.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 4836c205..377ce7fe 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -147,6 +147,8 @@ Macros use an internal queue to invoke each behavior in the bindings list when t To prevent issues with longer macros, you can change the size of this queue via the `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE` setting in your configuration, [typically through your `.conf` file](../config/index.md). For example, `CONFIG_ZMK_BEHAVIORS_QUEUE_SIZE=512` would allow your macro to type about 256 characters. +Another limit worth noting is that the maximum number of bindings you can pass to a `bindings` field in the [Devicetree](../config/index.md#devicetree-files) is 256, which also constrains how many behaviors can be invoked by a macro. + ## Parameterized Macros Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: From 4e18b879bdeab047e901856cf6a0cbf3a4855adc Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Sep 2023 15:26:00 -0700 Subject: [PATCH 424/494] feat(docs): Document persisted settings and debouncing --- docs/docs/behaviors/backlight.md | 6 ++++++ docs/docs/behaviors/bluetooth.md | 5 +++++ docs/docs/behaviors/outputs.md | 5 +++++ docs/docs/behaviors/power.md | 5 +++++ docs/docs/behaviors/underglow.md | 6 ++++++ 5 files changed, 27 insertions(+) diff --git a/docs/docs/behaviors/backlight.md b/docs/docs/behaviors/backlight.md index cb9a85a8..8c613fe6 100644 --- a/docs/docs/behaviors/backlight.md +++ b/docs/docs/behaviors/backlight.md @@ -36,6 +36,12 @@ Here is a table describing the action for each define: - Parameter #1: The backlight action define, e.g. `BL_TOG` or `BL_INC` - Parameter #2: Only applies to `BL_SET`and is the brightness value +:::note Backlight settings persistence +The backlight settings that are changed via the `&bl` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +They will also override the start values set by [`CONFIG_ZMK_BACKLIGHT_*_START` settings](../config/backlight.md#kconfig). +However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +::: + ### Examples 1. Toggle backlight on/off diff --git a/docs/docs/behaviors/bluetooth.md b/docs/docs/behaviors/bluetooth.md index 7c77c4ad..89496948 100644 --- a/docs/docs/behaviors/bluetooth.md +++ b/docs/docs/behaviors/bluetooth.md @@ -35,6 +35,11 @@ Here is a table describing the command for each define: | `BT_PRV` | Switch to the previous profile, cycling through to the last one when the beginning is reached. | | `BT_SEL` | Select the 0-indexed profile by number. Please note: this definition must include a number as an argument in the keymap to work correctly. eg. `BT_SEL 0` | +:::note Selected profile persistence +The profile that is selected by the `BT_SEL`/`BT_PRV`/`BT_NXT` actions will be saved to flash storage and hence persist across restarts and firmware flashes. +However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +::: + ## Bluetooth Behavior The bluetooth behavior completes an bluetooth action given on press. diff --git a/docs/docs/behaviors/outputs.md b/docs/docs/behaviors/outputs.md index 198d9acc..dad52be2 100644 --- a/docs/docs/behaviors/outputs.md +++ b/docs/docs/behaviors/outputs.md @@ -44,6 +44,11 @@ The output selection behavior changes the preferred output on press. - Reference: `&out` - Parameter #1: Command, e.g. `OUT_BLE` +:::note External power state persistence +The endpoint that is selected by the `&out` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +::: + ### Examples 1. Behavior binding to prefer sending keyboard output to USB diff --git a/docs/docs/behaviors/power.md b/docs/docs/behaviors/power.md index 80580609..11f92084 100644 --- a/docs/docs/behaviors/power.md +++ b/docs/docs/behaviors/power.md @@ -43,6 +43,11 @@ Here is a table describing the command for each define: - Reference: `&ext_power` - Parameter#1: Command, e.g `EP_ON` +:::note External power state persistence +The on/off state that is set by the `&ext_power` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +::: + ### Example: 1. Behavior binding to enable the external power diff --git a/docs/docs/behaviors/underglow.md b/docs/docs/behaviors/underglow.md index 52429e69..29f34c2a 100644 --- a/docs/docs/behaviors/underglow.md +++ b/docs/docs/behaviors/underglow.md @@ -55,6 +55,12 @@ Value Limits: ::: +:::note RGB settings persistence +The RGB settings that are changed via the `&rgb_ug` behavior will be saved to flash storage and hence persist across restarts and firmware flashes. +They will also override the start values set by [`CONFIG_ZMK_RGB_*_START` settings](../config/underglow.md#kconfig). +However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../config/system.md#general) milliseconds in order to reduce potential wear on the flash memory. +::: + ## Examples 1. Toggle underglow on/off From 544612c8c0929ff3089bcdb86f9ea8a2f77081eb Mon Sep 17 00:00:00 2001 From: Xudong Zheng <7pkvm5aw@slicealias.com> Date: Fri, 1 Sep 2023 23:32:17 -0400 Subject: [PATCH 425/494] fix(split): reserve peripheral slot before stopping scanning In the event that the peripheral MAC address does not match, this allows scanning to continue. --- app/src/split/bluetooth/central.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index b70d79e3..ccf1cc28 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -433,20 +433,22 @@ static int stop_scanning() { static bool split_central_eir_found(const bt_addr_le_t *addr) { LOG_DBG("Found the split service"); + // Reserve peripheral slot. Once the central has bonded to its peripherals, + // the peripheral MAC addresses will be validated internally and the slot + // reservation will fail if there is a mismatch. + int slot_idx = reserve_peripheral_slot(addr); + if (slot_idx < 0) { + LOG_INF("Unable to reserve peripheral slot (err %d)", slot_idx); + return false; + } + struct peripheral_slot *slot = &peripherals[slot_idx]; + // Stop scanning so we can connect to the peripheral device. int err = stop_scanning(); if (err < 0) { return false; } - int slot_idx = reserve_peripheral_slot(addr); - if (slot_idx < 0) { - LOG_ERR("Failed to reserve peripheral slot (err %d)", slot_idx); - return false; - } - - struct peripheral_slot *slot = &peripherals[slot_idx]; - LOG_DBG("Initiating new connnection"); struct bt_le_conn_param *param = BT_LE_CONN_PARAM(CONFIG_ZMK_SPLIT_BLE_PREF_INT, CONFIG_ZMK_SPLIT_BLE_PREF_INT, From ac0691471f1adb8336fb7eb5d01f18c988c5bad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF=E3=83=BC=E3=83=9A?= =?UTF-8?q?=E3=83=BC=E3=83=91=E3=83=BC?= <76888457+filterpaper@users.noreply.github.com> Date: Thu, 3 Aug 2023 10:26:34 +0800 Subject: [PATCH 426/494] feat(shields): Add Bluetooth bindings to kyria keymaps Bluetooth bindings are useful for handling pairings with hosts. This change adds the header and a few default commands as template for new users to work with. --- app/boards/shields/kyria/kyria.keymap | 20 +++++++++++++++-- app/boards/shields/kyria/kyria_rev2.keymap | 20 +++++++++++++++-- app/boards/shields/kyria/kyria_rev3.keymap | 26 +++++++++++++++++----- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/app/boards/shields/kyria/kyria.keymap b/app/boards/shields/kyria/kyria.keymap index 9a2163db..a11c1325 100644 --- a/app/boards/shields/kyria/kyria.keymap +++ b/app/boards/shields/kyria/kyria.keymap @@ -5,6 +5,7 @@ */ #include +#include #include / { @@ -15,15 +16,30 @@ // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | -// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | +// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | LAYER 1 | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &mo 1 &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + function_layer { +// --------------------------------------------------------------------------------------------------------------------------------- +// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | | +// | | | |BTSEL3|BTSEL4| | | | | | | | | +// | | | | | | | | | | | | | | | | | | | +// | | | | | | | | | | | | | + bindings = < + &trans &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans + &trans &trans &trans &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; }; diff --git a/app/boards/shields/kyria/kyria_rev2.keymap b/app/boards/shields/kyria/kyria_rev2.keymap index 9a2163db..a11c1325 100644 --- a/app/boards/shields/kyria/kyria_rev2.keymap +++ b/app/boards/shields/kyria/kyria_rev2.keymap @@ -5,6 +5,7 @@ */ #include +#include #include / { @@ -15,15 +16,30 @@ // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | -// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | +// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | LAYER 1 | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | bindings = < &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &mo 1 &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + function_layer { +// --------------------------------------------------------------------------------------------------------------------------------- +// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | | +// | | | |BTSEL3|BTSEL4| | | | | | | | | +// | | | | | | | | | | | | | | | | | | | +// | | | | | | | | | | | | | + bindings = < + &trans &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans + &trans &trans &trans &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; }; diff --git a/app/boards/shields/kyria/kyria_rev3.keymap b/app/boards/shields/kyria/kyria_rev3.keymap index d74757ca..ac2fc044 100644 --- a/app/boards/shields/kyria/kyria_rev3.keymap +++ b/app/boards/shields/kyria/kyria_rev3.keymap @@ -5,6 +5,7 @@ */ #include +#include #include /* Uncomment this block if using RGB @@ -23,13 +24,28 @@ // --------------------------------------------------------------------------------------------------------------------------------- // | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | - // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL | + // | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | LAYER 1 | L SHIFT | N | M | , | . | / | CTRL | // | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT | bindings = < - &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH - &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT - &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL - &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + &kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &mo 1 &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL + &kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + function_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | | + // | | | |BTSEL3|BTSEL4| | | | | | | | | + // | | | | | | | | | | | | | | | | | | | + // | | | | | | | | | | | | | + bindings = < + &trans &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans + &trans &trans &trans &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; From 3de23938d687badb346cd97f2e4003bc4357508c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 08:51:44 +0000 Subject: [PATCH 427/494] chore(deps): bump word-wrap from 1.2.3 to 1.2.4 in /docs Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/jonschlinkert/word-wrap/releases) - [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4) --- updated-dependencies: - dependency-name: word-wrap dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index b990f53c..3aec8dd5 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -15859,9 +15859,9 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "devOptional": true, "engines": { "node": ">=0.10.0" @@ -27353,9 +27353,9 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "devOptional": true }, "wrap-ansi": { From 8984e12f0d0442b15e6fd18dfd48666bc4cbceb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Aug 2023 05:10:14 +0000 Subject: [PATCH 428/494] chore(deps-dev): bump json-schema-to-typescript in /docs Bumps [json-schema-to-typescript](https://github.com/bcherny/json-schema-to-typescript) from 12.0.0 to 13.1.1. - [Changelog](https://github.com/bcherny/json-schema-to-typescript/blob/master/CHANGELOG.md) - [Commits](https://github.com/bcherny/json-schema-to-typescript/commits) --- updated-dependencies: - dependency-name: json-schema-to-typescript dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 14 +++++++------- docs/package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 3aec8dd5..38eae2b7 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -35,7 +35,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^12.0.0", + "json-schema-to-typescript": "^13.1.1", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", @@ -9163,9 +9163,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-to-typescript": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", - "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-13.1.1.tgz", + "integrity": "sha512-F3CYhtA7F3yPbb8vF7sFchk/2dnr1/yTKf8RcvoNpjnh67ZS/ZMH1ElLt5KHAtf2/bymiejLQQszszPWEeTdSw==", "dev": true, "dependencies": { "@bcherny/json-schema-ref-parser": "10.0.5-fork", @@ -22663,9 +22663,9 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-to-typescript": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-12.0.0.tgz", - "integrity": "sha512-Uk/BDIAo8vqepPBhM86UhNMHgCv7JulicNj/BgnQPHE1fGCoej0UTtcEYzXU/uk6lSvbZCf7pccW+dnNMrr5rg==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-13.1.1.tgz", + "integrity": "sha512-F3CYhtA7F3yPbb8vF7sFchk/2dnr1/yTKf8RcvoNpjnh67ZS/ZMH1ElLt5KHAtf2/bymiejLQQszszPWEeTdSw==", "dev": true, "requires": { "@bcherny/json-schema-ref-parser": "10.0.5-fork", diff --git a/docs/package.json b/docs/package.json index d82e54ec..9b38bef8 100644 --- a/docs/package.json +++ b/docs/package.json @@ -54,7 +54,7 @@ "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", "eslint-plugin-react": "^7.32.2", - "json-schema-to-typescript": "^12.0.0", + "json-schema-to-typescript": "^13.1.1", "mustache": "^4.2.0", "null-loader": "^4.0.0", "prebuild-webpack-plugin": "^1.1.1", From 647945d9f8c80b7de8df8f9dc54bdcf865d531ad Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 17 Jul 2023 07:20:45 -0700 Subject: [PATCH 429/494] feat(shields): Add splitkb.com Aurora Helix * Add new shield for splitkb.com Aurora Helix, supporting keys, encoder(s), displays, and RGB. --- .../splitkb_aurora_helix/Kconfig.defconfig | 53 ++++++++++ .../splitkb_aurora_helix/Kconfig.shield | 8 ++ .../boards/nice_nano.overlay | 46 +++++++++ .../boards/nice_nano_v2.overlay | 46 +++++++++ .../splitkb_aurora_helix.conf | 9 ++ .../splitkb_aurora_helix.dtsi | 79 +++++++++++++++ .../splitkb_aurora_helix.keymap | 96 +++++++++++++++++++ .../splitkb_aurora_helix.zmk.yml | 15 +++ .../splitkb_aurora_helix_left.overlay | 42 ++++++++ .../splitkb_aurora_helix_right.overlay | 46 +++++++++ 10 files changed, 440 insertions(+) create mode 100644 app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig create mode 100644 app/boards/shields/splitkb_aurora_helix/Kconfig.shield create mode 100644 app/boards/shields/splitkb_aurora_helix/boards/nice_nano.overlay create mode 100644 app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.conf create mode 100644 app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi create mode 100644 app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap create mode 100644 app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.zmk.yml create mode 100644 app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay create mode 100644 app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay diff --git a/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig b/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig new file mode 100644 index 00000000..6d7a5569 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig @@ -0,0 +1,53 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_SPLITKB_AURORA_HELIX_LEFT + +config ZMK_KEYBOARD_NAME + default "Aurora Helix" + +config ZMK_SPLIT_ROLE_CENTRAL + default y + +endif # SHIELD_SPLITKB_AURORA_HELIX_LEFT + +if SHIELD_SPLITKB_AURORA_HELIX_LEFT || SHIELD_SPLITKB_AURORA_HELIX_RIGHT + +config ZMK_SPLIT + default y + +config ZMK_RGB_UNDERGLOW + select WS2812_STRIP + select SPI + +if ZMK_DISPLAY + +config SSD1306 + default y + +config I2C + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LV_Z_VDB_SIZE + default 64 + +config LV_DPI_DEF + default 148 + +config LV_Z_BITS_PER_PIXEL + default 1 + +choice LV_COLOR_DEPTH + default LV_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif # SHIELD_SPLITKB_AURORA_HELIX_LEFT || SHIELD_SPLITKB_AURORA_HELIX_RIGHT diff --git a/app/boards/shields/splitkb_aurora_helix/Kconfig.shield b/app/boards/shields/splitkb_aurora_helix/Kconfig.shield new file mode 100644 index 00000000..c64ef879 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_SPLITKB_AURORA_HELIX_LEFT + def_bool $(shields_list_contains,splitkb_aurora_helix_left) + +config SHIELD_SPLITKB_AURORA_HELIX_RIGHT + def_bool $(shields_list_contains,splitkb_aurora_helix_right) diff --git a/app/boards/shields/splitkb_aurora_helix/boards/nice_nano.overlay b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..8f1629ce --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/boards/nice_nano_v2.overlay @@ -0,0 +1,46 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <6>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.conf b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.conf new file mode 100644 index 00000000..af482abc --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.conf @@ -0,0 +1,9 @@ +# Uncomment these two line to add support for encoders to your firmware +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment the following line to enable the OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment the following line to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi new file mode 100644 index 00000000..e580e87d --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.dtsi @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + + chosen { + zephyr,display = &oled; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <5>; + // | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | + // | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | + // | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | + // | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW25 | | SW25 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | + // | SW26 | SW27 | SW28 | SW29 | SW30 | SW31 | SW32 | | SW32 | SW31 | SW30 | SW29 | SW28 | SW27 | SW26 | + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; + + left_encoder: left_encoder { + compatible = "alps,ec11"; + label = "L_ENCODER"; + steps = <144>; + status = "disabled"; + + a-gpios = <&pro_micro 7 GPIO_PULL_UP>; + b-gpios = <&pro_micro 8 GPIO_PULL_UP>; + }; + + right_encoder: right_encoder { + compatible = "alps,ec11"; + label = "R_ENCODER"; + steps = <144>; + status = "disabled"; + + a-gpios = <&pro_micro 16 GPIO_PULL_UP>; + b-gpios = <&pro_micro 14 GPIO_PULL_UP>; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <36>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap new file mode 100644 index 00000000..edec8fec --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.keymap @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include + +#define DEFAULT 0 +#define LOWER 1 +#define RAISE 2 +#define ADJUST 3 + +/* Uncomment this block if using RGB +&led_strip { + chain-length = <6>; + // chain-length = <38>; // Uncomment if using both per-key and underglow LEDs + // chain-length = <32>; // Uncomment if using only per-key LEDs. +}; + */ + +/* NOTE: At the time of the creation of this keymap, there are no specified codes for 'eisuu' and 'kana' input in ZMK. +However, 'LANG1' and 'LANG2' are fully-functioning candidates for 'kana' and 'eisuu' input respectively. +As such, those are in use within the default layer at this time.*/ + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | + // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC | + // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | + // | SHIFT | Z | X | C | V | B | LBKT | | RBKT | N | M | , | . | / | RET | + // | ADJUST | ESC | ALT | LGUI | EISUU | LOWER | SPACE | | SPACE | RAISE | KANA | LEFT | DOWN | UP | RIGHT | + bindings = < + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp PERIOD &kp SLASH &kp RET + &mo ADJUST &kp ESC &kp LALT &kp LGUI &kp LANG2 &mo LOWER &kp SPACE &kp SPACE &mo RAISE &kp LANG1 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; + lower_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | | | | | | | | | | | | | | + // | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + // | | | | | | | | | _ | + | { | } | PIPE | + // | | | | | | | ( | | ) | | | | HOME | END | | + // | | | | | | | | | | | | | | | | + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &trans + &trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &trans &trans &trans &trans &trans &kp LPAR &kp RPAR &trans &trans &trans &kp HOME &kp END &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + }; + raise_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | | | | | | | | | | | | | | + // | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | + // | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + // | | F7 | F8 | F9 | F10 | F11 | | | | F12 | | PSCRN | PG_DN | PG_UP | | + // | | | | | | | | | | | | NEXT | VOL- | VOL+ | PLAY | + bindings = < + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL + &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &trans &trans &kp F12 &trans &kp PSCRN &kp PG_DN &kp PG_UP &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP + >; + }; + adjust_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | EP TOG | + // | BT CLR | BT SEL0 | BT SEL1 | BT SEL2 | BGT SEL3 | BT SEL4 | | RGB EFF+ | RGB HUE+ | RGB SAT+ | RGB SPD+ | RGB BRI+ | RGB TOG | + // | BT NXT | OUT TOG | OUT USB | OUT BLE | | | | RGB EFF- | RGB HUE- | RGB SAT- | RGB SPD- | RGB BRI- | | + // | BT PRV | | | | | | { | | } | | | | | | | + // | | | | | | | | | | | | | | | | + bindings = < + &kp GRAVE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &ext_power EP_TOG + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG + &bt BT_NXT &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &trans &rgb_ug RGB_EFR &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_SPD &rgb_ug RGB_BRD &trans + &bt BT_PRV &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + >; + }; + }; +}; diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.zmk.yml b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.zmk.yml new file mode 100644 index 00000000..d83c74ec --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix.zmk.yml @@ -0,0 +1,15 @@ +file_format: "1" +id: splitkb_aurora_helix +name: splitkb.com Aurora Helix +type: shield +url: https://splitkb.com/products/aurora-helix-pcb-kit +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder + - underglow +siblings: + - splitkb_aurora_helix_left + - splitkb_aurora_helix_right diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay new file mode 100644 index 00000000..c9830658 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_left.overlay @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_helix.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 21 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&left_encoder { + status = "okay"; +}; diff --git a/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay new file mode 100644 index 00000000..48572de9 --- /dev/null +++ b/app/boards/shields/splitkb_aurora_helix/splitkb_aurora_helix_right.overlay @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "splitkb_aurora_helix.dtsi" + +/ { + chosen { + zmk,kscan = &kscan; + }; + + kscan: kscan { + compatible = "zmk,kscan-gpio-matrix"; + + label = "KSCAN"; + diode-direction = "col2row"; + + row-gpios + = <&pro_micro 21 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + , <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)> + ; + + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 9 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 4 GPIO_ACTIVE_HIGH> + ; + }; +}; + +&right_encoder { + status = "okay"; +}; + +&default_transform { + col-offset = <7>; +}; From 3936298260699d88f8fb8c839991128ed0edfafa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 05:18:02 +0000 Subject: [PATCH 430/494] chore(deps-dev): bump eslint-plugin-react from 7.32.2 to 7.33.2 in /docs Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.32.2 to 7.33.2. - [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases) - [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.32.2...v7.33.2) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 992 +++++++++++++++++++++++++++++++++++++---- docs/package.json | 2 +- 2 files changed, 908 insertions(+), 86 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index 38eae2b7..ded7bf83 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -34,7 +34,7 @@ "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react": "^7.33.2", "json-schema-to-typescript": "^13.1.1", "mustache": "^4.2.0", "null-loader": "^4.0.0", @@ -4172,6 +4172,19 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -4235,11 +4248,40 @@ "get-intrinsic": "^1.1.3" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -4280,6 +4322,18 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", @@ -5750,9 +5804,9 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -6100,35 +6154,50 @@ } }, "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -6137,11 +6206,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, "node_modules/es-module-lexer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -6754,15 +6859,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -6772,7 +6878,7 @@ "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { @@ -7454,6 +7560,15 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", @@ -7651,12 +7766,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -7831,6 +7947,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globalyzer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", @@ -7862,6 +7993,18 @@ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -7986,6 +8129,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8553,12 +8707,12 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -8612,11 +8766,40 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -8771,6 +8954,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -8779,6 +8974,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8814,6 +9024,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -8941,6 +9160,15 @@ "node": ">=6" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -8994,11 +9222,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -9011,6 +9263,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", @@ -9063,6 +9328,18 @@ "node": ">=0.10.0" } }, + "node_modules/iterator.prototype": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz", + "integrity": "sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.3" + } + }, "node_modules/jest-util": { "version": "29.2.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", @@ -11088,9 +11365,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12794,6 +13071,26 @@ "node": ">=6.0.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -12824,14 +13121,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -13424,6 +13721,30 @@ "node": ">=6" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -14063,29 +14384,46 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14633,6 +14971,71 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -15839,6 +16242,72 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -19070,6 +19539,16 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -19118,11 +19597,34 @@ "get-intrinsic": "^1.1.3" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, + "asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -19141,6 +19643,12 @@ "postcss-value-parser": "^4.2.0" } }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "axios": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", @@ -20186,9 +20694,9 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -20448,35 +20956,72 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-iterator-helpers": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "dev": true, + "requires": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" } }, "es-module-lexer": { @@ -20484,6 +21029,17 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -20956,15 +21512,16 @@ } }, "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "requires": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -20974,7 +21531,7 @@ "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "dependencies": { @@ -21457,6 +22014,15 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", @@ -21587,12 +22153,13 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -21713,6 +22280,15 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globalyzer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", @@ -21738,6 +22314,15 @@ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -21837,6 +22422,11 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -22255,12 +22845,12 @@ "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" } @@ -22297,11 +22887,31 @@ "is-decimal": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -22392,11 +23002,29 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, + "is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -22419,6 +23047,12 @@ "is-path-inside": "^3.0.2" } }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -22498,6 +23132,12 @@ "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -22530,11 +23170,26 @@ "has-symbols": "^1.0.2" } }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -22544,6 +23199,16 @@ "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "is-whitespace-character": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", @@ -22582,6 +23247,18 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, + "iterator.prototype": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz", + "integrity": "sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ==", + "dev": true, + "requires": { + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.3" + } + }, "jest-util": { "version": "29.2.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.2.1.tgz", @@ -23966,9 +24643,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" }, "object-keys": { "version": "1.1.1", @@ -25142,6 +25819,20 @@ "minimatch": "^3.0.5" } }, + "reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -25169,14 +25860,14 @@ } }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, "regexpu-core": { @@ -25608,6 +26299,26 @@ "mri": "^1.1.0" } }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -26111,26 +26822,37 @@ "side-channel": "^1.0.4" } }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "stringify-entities": { @@ -26520,6 +27242,53 @@ } } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -27339,6 +28108,59 @@ "is-symbol": "^1.0.3" } }, + "which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "requires": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", diff --git a/docs/package.json b/docs/package.json index 9b38bef8..a3c3481d 100644 --- a/docs/package.json +++ b/docs/package.json @@ -53,7 +53,7 @@ "eslint": "^8.39.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-mdx": "^2.0.5", - "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react": "^7.33.2", "json-schema-to-typescript": "^13.1.1", "mustache": "^4.2.0", "null-loader": "^4.0.0", From 718500543b6d087ce8aac00caac173030b75be16 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 2 Sep 2023 01:45:12 -0700 Subject: [PATCH 431/494] feat(split): Use directed advertising. * Split centrals to scan with their identity so they receive direct advertising packets. * Split peripherals to use direct advertising if they have an existing bond to a split central. --- app/src/split/bluetooth/Kconfig | 1 + app/src/split/bluetooth/central.c | 4 ++- app/src/split/bluetooth/peripheral.c | 44 ++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 0610b667..5919010b 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -14,6 +14,7 @@ config ZMK_SPLIT_ROLE_CENTRAL select BT_CENTRAL select BT_GATT_CLIENT select BT_GATT_AUTO_DISCOVER_CCC + select BT_SCAN_WITH_IDENTITY if ZMK_SPLIT_ROLE_CENTRAL diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index ccf1cc28..860e89a5 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -511,8 +511,10 @@ static void split_central_device_found(const bt_addr_le_t *addr, int8_t rssi, ui LOG_DBG("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i", dev, type, ad->len, rssi); /* We're only interested in connectable events */ - if (type == BT_GAP_ADV_TYPE_ADV_IND || type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { + if (type == BT_GAP_ADV_TYPE_ADV_IND) { bt_data_parse(ad, split_central_eir_parse, (void *)addr); + } else if (type == BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { + split_central_eir_found(addr); } } diff --git a/app/src/split/bluetooth/peripheral.c b/app/src/split/bluetooth/peripheral.c index e053db8a..1d649f71 100644 --- a/app/src/split/bluetooth/peripheral.c +++ b/app/src/split/bluetooth/peripheral.c @@ -43,15 +43,49 @@ static const struct bt_data zmk_ble_ad[] = { static bool is_connected = false; -static int start_advertising() { - return bt_le_adv_start(BT_LE_ADV_CONN, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); +static void each_bond(const struct bt_bond_info *info, void *user_data) { + bt_addr_le_t *addr = (bt_addr_le_t *)user_data; + + if (bt_addr_le_cmp(&info->addr, BT_ADDR_LE_NONE) != 0) { + bt_addr_le_copy(addr, &info->addr); + } +} + +static int start_advertising(bool low_duty) { + bt_addr_le_t central_addr = bt_addr_le_none; + + bt_foreach_bond(BT_ID_DEFAULT, each_bond, ¢ral_addr); + + if (bt_addr_le_cmp(¢ral_addr, BT_ADDR_LE_NONE) != 0) { + struct bt_le_adv_param adv_param = low_duty ? *BT_LE_ADV_CONN_DIR_LOW_DUTY(¢ral_addr) + : *BT_LE_ADV_CONN_DIR(¢ral_addr); + return bt_le_adv_start(&adv_param, NULL, 0, NULL, 0); + } else { + return bt_le_adv_start(BT_LE_ADV_CONN, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); + } }; +static bool low_duty_advertising = false; + +static void advertising_cb(struct k_work *work) { + const int err = start_advertising(low_duty_advertising); + if (err < 0) { + LOG_ERR("Failed to start advertising (%d)", err); + } +} + +K_WORK_DEFINE(advertising_work, advertising_cb); + static void connected(struct bt_conn *conn, uint8_t err) { is_connected = (err == 0); ZMK_EVENT_RAISE(new_zmk_split_peripheral_status_changed( (struct zmk_split_peripheral_status_changed){.connected = is_connected})); + + if (err == BT_HCI_ERR_ADV_TIMEOUT) { + low_duty_advertising = true; + k_work_submit(&advertising_work); + } } static void disconnected(struct bt_conn *conn, uint8_t reason) { @@ -65,6 +99,9 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) { ZMK_EVENT_RAISE(new_zmk_split_peripheral_status_changed( (struct zmk_split_peripheral_status_changed){.connected = is_connected})); + + low_duty_advertising = false; + k_work_submit(&advertising_work); } static void security_changed(struct bt_conn *conn, bt_security_t level, enum bt_security_err err) { @@ -119,7 +156,8 @@ static int zmk_peripheral_ble_init(const struct device *_arg) { #else bt_conn_cb_register(&conn_callbacks); - start_advertising(); + low_duty_advertising = false; + k_work_submit(&advertising_work); #endif return 0; From 693875675fec96b46c687540ef46a17fa4132779 Mon Sep 17 00:00:00 2001 From: Nate Eagleson Date: Mon, 4 Sep 2023 19:59:59 -0400 Subject: [PATCH 432/494] fix(docs): Fix typo in caps-word.md (#1924) --- docs/docs/behaviors/caps-word.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md index e85d7eca..e5d862d7 100644 --- a/docs/docs/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -7,7 +7,7 @@ sidebar_label: Caps Word The caps word behavior behaves similar to a caps lock, but will automatically deactivate when any key not in a continue list is pressed, or if the caps word key is pressed again. For smaller keyboards using [mod-taps](/docs/behaviors/mod-tap), this can help avoid repeated alternating holds when typing words in all caps. -The modifiers are applied only to to the alphabetic (`A` to `Z`) keycodes, to avoid automatically appliying them to numeric values, etc. +The modifiers are applied only to to the alphabetic (`A` to `Z`) keycodes, to avoid automatically applying them to numeric values, etc. ### Behavior Binding From 8087fa3b2b8bb0590e7cf5de6d22b03acd9411a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 05:12:55 +0000 Subject: [PATCH 433/494] chore(deps): bump @fortawesome/fontawesome-svg-core in /docs Bumps [@fortawesome/fontawesome-svg-core](https://github.com/FortAwesome/Font-Awesome) from 6.4.0 to 6.4.2. - [Release notes](https://github.com/FortAwesome/Font-Awesome/releases) - [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md) - [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.4.0...6.4.2) --- updated-dependencies: - dependency-name: "@fortawesome/fontawesome-svg-core" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 34 +++++++++++++++++++++++++--------- docs/package.json | 2 +- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index ded7bf83..f17adc4b 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/fontawesome-svg-core": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.0", "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", @@ -2704,17 +2704,26 @@ } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", - "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", + "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.0" + "@fortawesome/fontawesome-common-types": "6.4.2" }, "engines": { "node": ">=6" } }, + "node_modules/@fortawesome/fontawesome-svg-core/node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", + "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@fortawesome/free-solid-svg-icons": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", @@ -18363,11 +18372,18 @@ "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" }, "@fortawesome/fontawesome-svg-core": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", - "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", + "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", "requires": { - "@fortawesome/fontawesome-common-types": "6.4.0" + "@fortawesome/fontawesome-common-types": "6.4.2" + }, + "dependencies": { + "@fortawesome/fontawesome-common-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", + "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==" + } } }, "@fortawesome/free-solid-svg-icons": { diff --git a/docs/package.json b/docs/package.json index a3c3481d..aa48af24 100644 --- a/docs/package.json +++ b/docs/package.json @@ -17,7 +17,7 @@ "dependencies": { "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", - "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/fontawesome-svg-core": "^6.4.2", "@fortawesome/free-solid-svg-icons": "^6.4.0", "@fortawesome/react-fontawesome": "^0.2.0", "@mdx-js/react": "^1.6.22", From f442776fe2bea2a3644d0767a2cf1e975c6d9b38 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 10 Jun 2023 17:41:22 -0700 Subject: [PATCH 434/494] feat(docs): Detail logging and note extra useful options --- docs/docs/development/usb-logging.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/docs/development/usb-logging.md b/docs/docs/development/usb-logging.md index 9a2980ae..87cd0e7d 100644 --- a/docs/docs/development/usb-logging.md +++ b/docs/docs/development/usb-logging.md @@ -20,13 +20,16 @@ It is recommended to only enable logging when needed, and not leaving it on by d ## Kconfig -The `CONFIG_ZMK_USB_LOGGING` KConfig value needs to be set, either by copy and pasting into the `app/prj.conf` file, or by running -`west build -t menuconfig` and manually enabling the setting in that UI at `ZMK -> Advanced -> USB Logging`. +The `CONFIG_ZMK_USB_LOGGING` Kconfig enables USB logging. This can be set at the keyboard level, typically in the `config/.conf` +file if you are using a [user config repository](user-setup.md). It can also be enabled at the ZMK level using the `app/prj.conf` file, or other +search locations described in the [configuration overview](config/index.md#config-file-locations). + +Logging can be further configured using Kconfig described in [the Zephyr documentation](https://docs.zephyrproject.org/3.2.0/services/logging/index.html). +For instance, setting `CONFIG_LOG_PROCESS_THREAD_STARTUP_DELAY_MS` to a large value such as `8000` might help catch issues that happen near keyboard +boot, before you can connect to view the logs. :::note -If you are debugging your own keyboard in your [user config repository](user-setup.md), use -`config/boards/shields//.conf` instead of `app/prj.conf`. In Github -Actions, you can search the `Kconfig file` build log to verify the options above have been enabled +In Github Actions, you can check the ` Kconfig file` step output to verify the options above have been enabled for you successfully. ::: From 7f9e9f8c64f3128c2c3e7af3f22ced665fe1b873 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Tue, 5 Sep 2023 22:23:44 -0700 Subject: [PATCH 435/494] fix(boards): Disable QSPI for Xiao BLE The GD25Q16 flash connected via QSPI seems to be causing issues with excessive battery use and inability to sleep. Since ZMK doesn't use it, disable it. Resolves #1901 --- app/boards/seeeduino_xiao_ble.overlay | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/boards/seeeduino_xiao_ble.overlay b/app/boards/seeeduino_xiao_ble.overlay index 51671a80..e6a5b62c 100644 --- a/app/boards/seeeduino_xiao_ble.overlay +++ b/app/boards/seeeduino_xiao_ble.overlay @@ -32,3 +32,6 @@ }; }; +&qspi { + status = "disabled"; +}; From eaeea4bdfa2d67c7faea8e5f77b638723ebfe5e9 Mon Sep 17 00:00:00 2001 From: Jeppe Klitgaard Date: Tue, 12 Sep 2023 08:32:09 +0200 Subject: [PATCH 436/494] feat(docs): Add missing `&kp` tip for `devicetree_unfixed.h` error --- docs/docs/troubleshooting.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/docs/troubleshooting.md b/docs/docs/troubleshooting.md index d47671bc..1418f327 100644 --- a/docs/docs/troubleshooting.md +++ b/docs/docs/troubleshooting.md @@ -58,10 +58,14 @@ A `devicetree_unfixed.h` error that follows with an "undeclared here" string ind In this example, the error string `DT_N_S_keymap_S_symbol_layer_P_bindings_IDX_12_PH_P_label` indicates a problem with the key binding in position `12` in the `symbol_layer` of the keymap. -:::note +:::info Key positions are numbered starting from `0` at the top left key on the keymap, incrementing horizontally, row by row. ::: +:::tip +A common mistake that leads to this error is to use [key press keycodes](behaviors/key-press.md) without the leading `&kp` binding. That is, having entries such as `SPACE` that should have been `&kp SPACE`. +::: + ### Split Keyboard Halves Unable to Pair Split keyboard halves pairing issue can be resolved by flashing a settings reset firmware to both controllers. You will first need to acquire the reset UF2 image file with one of the following options: From 690bc1bb44b1b62228900906cb308dc6f1a05eb8 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 2 Sep 2023 20:07:31 -0700 Subject: [PATCH 437/494] refactor: Move drivers into properly module. * Align our driver module layout to properly match Zephyr conventions, allowing proper CMake setup to amend the library for each type of driver. --- app/CMakeLists.txt | 2 +- app/Kconfig | 10 +++++++--- app/drivers/CMakeLists.txt | 7 ------- app/drivers/display/CMakeLists.txt | 4 ---- app/include/dt-bindings/zmk/kscan-mock.h | 9 --------- app/module/CMakeLists.txt | 3 +++ app/module/Kconfig | 2 ++ app/module/drivers/CMakeLists.txt | 7 +++++++ app/{ => module}/drivers/Kconfig | 0 app/module/drivers/display/CMakeLists.txt | 6 ++++++ app/{ => module}/drivers/display/Kconfig | 6 +++++- app/{ => module}/drivers/display/Kconfig.il0323 | 0 app/{ => module}/drivers/display/il0323.c | 0 app/{ => module}/drivers/display/il0323_regs.h | 0 app/{ => module}/drivers/gpio/CMakeLists.txt | 3 +-- app/{ => module}/drivers/gpio/Kconfig | 6 ++++-- app/{ => module}/drivers/gpio/Kconfig.595 | 1 - app/{ => module}/drivers/gpio/Kconfig.max7318 | 1 - app/{ => module}/drivers/gpio/gpio_595.c | 0 app/{ => module}/drivers/gpio/gpio_max7318.c | 0 app/{ => module}/drivers/kscan/CMakeLists.txt | 3 +-- app/{ => module}/drivers/kscan/Kconfig | 14 +++++++++----- app/{ => module}/drivers/kscan/debounce.c | 0 app/{ => module}/drivers/kscan/debounce.h | 0 app/{ => module}/drivers/kscan/kscan_composite.c | 0 app/{ => module}/drivers/kscan/kscan_gpio.c | 0 app/{ => module}/drivers/kscan/kscan_gpio.h | 0 app/{ => module}/drivers/kscan/kscan_gpio_demux.c | 0 app/{ => module}/drivers/kscan/kscan_gpio_direct.c | 0 app/{ => module}/drivers/kscan/kscan_gpio_matrix.c | 0 app/{ => module}/drivers/kscan/kscan_mock.c | 0 app/{ => module}/drivers/sensor/CMakeLists.txt | 0 app/{ => module}/drivers/sensor/Kconfig | 6 +++++- .../drivers/sensor/battery/CMakeLists.txt | 0 app/{ => module}/drivers/sensor/battery/Kconfig | 0 .../drivers/sensor/battery/battery_common.c | 0 .../drivers/sensor/battery/battery_common.h | 0 .../drivers/sensor/battery/battery_nrf_vddh.c | 0 .../sensor/battery/battery_voltage_divider.c | 0 .../drivers/sensor/ec11/CMakeLists.txt | 0 app/{ => module}/drivers/sensor/ec11/Kconfig | 0 app/{ => module}/drivers/sensor/ec11/ec11.c | 0 app/{ => module}/drivers/sensor/ec11/ec11.h | 0 .../drivers/sensor/ec11/ec11_trigger.c | 0 .../dts/bindings/display/gooddisplay,il0323.yaml | 0 .../dts/bindings/gpio/maxim,max7318.yaml | 0 .../dts/bindings/gpio/zmk,gpio-595.yaml | 0 .../dts/bindings/kscan/zmk,kscan-gpio-demux.yaml | 0 .../dts/bindings/kscan/zmk,kscan-gpio-direct.yaml | 0 .../dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml | 0 .../dts/bindings/sensor/alps,ec11.yaml | 0 .../dts/bindings/sensor/zmk,battery-nrf-vddh.yaml | 0 .../sensor/zmk,battery-voltage-divider.yaml | 0 .../include/dt-bindings/zmk/kscan_mock.h | 0 app/{drivers => module}/zephyr/module.yml | 2 ++ 55 files changed, 53 insertions(+), 39 deletions(-) delete mode 100644 app/drivers/CMakeLists.txt delete mode 100644 app/drivers/display/CMakeLists.txt delete mode 100644 app/include/dt-bindings/zmk/kscan-mock.h create mode 100644 app/module/CMakeLists.txt create mode 100644 app/module/Kconfig create mode 100644 app/module/drivers/CMakeLists.txt rename app/{ => module}/drivers/Kconfig (100%) create mode 100644 app/module/drivers/display/CMakeLists.txt rename app/{ => module}/drivers/display/Kconfig (58%) rename app/{ => module}/drivers/display/Kconfig.il0323 (100%) rename app/{ => module}/drivers/display/il0323.c (100%) rename app/{ => module}/drivers/display/il0323_regs.h (100%) rename app/{ => module}/drivers/gpio/CMakeLists.txt (65%) rename app/{ => module}/drivers/gpio/Kconfig (52%) rename app/{ => module}/drivers/gpio/Kconfig.595 (95%) rename app/{ => module}/drivers/gpio/Kconfig.max7318 (95%) rename app/{ => module}/drivers/gpio/gpio_595.c (100%) rename app/{ => module}/drivers/gpio/gpio_max7318.c (100%) rename app/{ => module}/drivers/kscan/CMakeLists.txt (85%) rename app/{ => module}/drivers/kscan/Kconfig (94%) rename app/{ => module}/drivers/kscan/debounce.c (100%) rename app/{ => module}/drivers/kscan/debounce.h (100%) rename app/{ => module}/drivers/kscan/kscan_composite.c (100%) rename app/{ => module}/drivers/kscan/kscan_gpio.c (100%) rename app/{ => module}/drivers/kscan/kscan_gpio.h (100%) rename app/{ => module}/drivers/kscan/kscan_gpio_demux.c (100%) rename app/{ => module}/drivers/kscan/kscan_gpio_direct.c (100%) rename app/{ => module}/drivers/kscan/kscan_gpio_matrix.c (100%) rename app/{ => module}/drivers/kscan/kscan_mock.c (100%) rename app/{ => module}/drivers/sensor/CMakeLists.txt (100%) rename app/{ => module}/drivers/sensor/Kconfig (67%) rename app/{ => module}/drivers/sensor/battery/CMakeLists.txt (100%) rename app/{ => module}/drivers/sensor/battery/Kconfig (100%) rename app/{ => module}/drivers/sensor/battery/battery_common.c (100%) rename app/{ => module}/drivers/sensor/battery/battery_common.h (100%) rename app/{ => module}/drivers/sensor/battery/battery_nrf_vddh.c (100%) rename app/{ => module}/drivers/sensor/battery/battery_voltage_divider.c (100%) rename app/{ => module}/drivers/sensor/ec11/CMakeLists.txt (100%) rename app/{ => module}/drivers/sensor/ec11/Kconfig (100%) rename app/{ => module}/drivers/sensor/ec11/ec11.c (100%) rename app/{ => module}/drivers/sensor/ec11/ec11.h (100%) rename app/{ => module}/drivers/sensor/ec11/ec11_trigger.c (100%) rename app/{ => module}/dts/bindings/display/gooddisplay,il0323.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/gpio/maxim,max7318.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/gpio/zmk,gpio-595.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/sensor/alps,ec11.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml (100%) rename app/{drivers/zephyr => module}/dts/bindings/sensor/zmk,battery-voltage-divider.yaml (100%) rename app/{ => module}/include/dt-bindings/zmk/kscan_mock.h (100%) rename app/{drivers => module}/zephyr/module.yml (56%) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index efa34905..29944753 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -8,7 +8,7 @@ list(APPEND DTS_ROOT ${CMAKE_SOURCE_DIR}/drivers/zephyr) set(ZephyrBuildConfiguration_ROOT ${CMAKE_SOURCE_DIR}/cmake) list(APPEND ZEPHYR_EXTRA_MODULES - ${CMAKE_CURRENT_SOURCE_DIR}/drivers + ${CMAKE_CURRENT_SOURCE_DIR}/module ) # Find Zephyr. This also loads Zephyr's build system. diff --git a/app/Kconfig b/app/Kconfig index 89a128b5..0dd9316a 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -403,14 +403,18 @@ endif #Initialization Priorities endmenu -menu "KSCAN Settings" +menuconfig ZMK_KSCAN + bool "ZMK KScan Integration" + default y + select KSCAN + +if ZMK_KSCAN config ZMK_KSCAN_EVENT_QUEUE_SIZE int "Size of the event queue for KSCAN events to buffer events" default 4 -#KSCAN Settings -endmenu +endif # ZMK_KSCAN menu "Logging" diff --git a/app/drivers/CMakeLists.txt b/app/drivers/CMakeLists.txt deleted file mode 100644 index 44d69ac3..00000000 --- a/app/drivers/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) 2020 The ZMK Contributors -# SPDX-License-Identifier: MIT - -add_subdirectory_ifdef(CONFIG_ZMK_DRIVERS_GPIO gpio) -add_subdirectory(kscan) -add_subdirectory(sensor) -add_subdirectory(display) diff --git a/app/drivers/display/CMakeLists.txt b/app/drivers/display/CMakeLists.txt deleted file mode 100644 index d5e83c1d..00000000 --- a/app/drivers/display/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2021 The ZMK Contributors -# SPDX-License-Identifier: MIT - -zephyr_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file diff --git a/app/include/dt-bindings/zmk/kscan-mock.h b/app/include/dt-bindings/zmk/kscan-mock.h deleted file mode 100644 index 4ed666c6..00000000 --- a/app/include/dt-bindings/zmk/kscan-mock.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Copyright (c) 2020 The ZMK Contributors - * - * SPDX-License-Identifier: MIT - */ - -#warning "kscan-mock.h has been deprecated and superseded by kscan_mock.h" - -#include "kscan_mock.h" \ No newline at end of file diff --git a/app/module/CMakeLists.txt b/app/module/CMakeLists.txt new file mode 100644 index 00000000..1c140d33 --- /dev/null +++ b/app/module/CMakeLists.txt @@ -0,0 +1,3 @@ +zephyr_include_directories(include) + +add_subdirectory(drivers) \ No newline at end of file diff --git a/app/module/Kconfig b/app/module/Kconfig new file mode 100644 index 00000000..cb2ae20c --- /dev/null +++ b/app/module/Kconfig @@ -0,0 +1,2 @@ + +rsource "drivers/Kconfig" \ No newline at end of file diff --git a/app/module/drivers/CMakeLists.txt b/app/module/drivers/CMakeLists.txt new file mode 100644 index 00000000..5281c3dc --- /dev/null +++ b/app/module/drivers/CMakeLists.txt @@ -0,0 +1,7 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +add_subdirectory_ifdef(CONFIG_GPIO gpio) +add_subdirectory_ifdef(CONFIG_KSCAN kscan) +add_subdirectory_ifdef(CONFIG_SENSOR sensor) +add_subdirectory_ifdef(CONFIG_DISPLAY display) diff --git a/app/drivers/Kconfig b/app/module/drivers/Kconfig similarity index 100% rename from app/drivers/Kconfig rename to app/module/drivers/Kconfig diff --git a/app/module/drivers/display/CMakeLists.txt b/app/module/drivers/display/CMakeLists.txt new file mode 100644 index 00000000..6fc98c95 --- /dev/null +++ b/app/module/drivers/display/CMakeLists.txt @@ -0,0 +1,6 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +zephyr_library_amend() + +zephyr_library_sources_ifdef(CONFIG_IL0323 il0323.c) \ No newline at end of file diff --git a/app/drivers/display/Kconfig b/app/module/drivers/display/Kconfig similarity index 58% rename from app/drivers/display/Kconfig rename to app/module/drivers/display/Kconfig index efa064d4..d70aff7c 100644 --- a/app/drivers/display/Kconfig +++ b/app/module/drivers/display/Kconfig @@ -1,4 +1,8 @@ # Copyright (c) 2021 The ZMK Contributors # SPDX-License-Identifier: MIT -rsource "Kconfig.il0323" \ No newline at end of file +if DISPLAY + +rsource "Kconfig.il0323" + +endif # DISPLAY \ No newline at end of file diff --git a/app/drivers/display/Kconfig.il0323 b/app/module/drivers/display/Kconfig.il0323 similarity index 100% rename from app/drivers/display/Kconfig.il0323 rename to app/module/drivers/display/Kconfig.il0323 diff --git a/app/drivers/display/il0323.c b/app/module/drivers/display/il0323.c similarity index 100% rename from app/drivers/display/il0323.c rename to app/module/drivers/display/il0323.c diff --git a/app/drivers/display/il0323_regs.h b/app/module/drivers/display/il0323_regs.h similarity index 100% rename from app/drivers/display/il0323_regs.h rename to app/module/drivers/display/il0323_regs.h diff --git a/app/drivers/gpio/CMakeLists.txt b/app/module/drivers/gpio/CMakeLists.txt similarity index 65% rename from app/drivers/gpio/CMakeLists.txt rename to app/module/drivers/gpio/CMakeLists.txt index 0756ed38..b5647e87 100644 --- a/app/drivers/gpio/CMakeLists.txt +++ b/app/module/drivers/gpio/CMakeLists.txt @@ -1,8 +1,7 @@ # Copyright (c) 2022 The ZMK Contributors # SPDX-License-Identifier: MIT -zephyr_library_named(zmk__drivers__gpio) -zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) +zephyr_library_amend() zephyr_library_sources_ifdef(CONFIG_GPIO_595 gpio_595.c) zephyr_library_sources_ifdef(CONFIG_GPIO_MAX7318 gpio_max7318.c) diff --git a/app/drivers/gpio/Kconfig b/app/module/drivers/gpio/Kconfig similarity index 52% rename from app/drivers/gpio/Kconfig rename to app/module/drivers/gpio/Kconfig index 54b30590..a6c7b4a1 100644 --- a/app/drivers/gpio/Kconfig +++ b/app/module/drivers/gpio/Kconfig @@ -1,5 +1,7 @@ -menuconfig ZMK_DRIVERS_GPIO - bool "GPIO" + +if GPIO rsource "Kconfig.max7318" rsource "Kconfig.595" + +endif # GPIO \ No newline at end of file diff --git a/app/drivers/gpio/Kconfig.595 b/app/module/drivers/gpio/Kconfig.595 similarity index 95% rename from app/drivers/gpio/Kconfig.595 rename to app/module/drivers/gpio/Kconfig.595 index b4b6bdcc..7ebdc0cc 100644 --- a/app/drivers/gpio/Kconfig.595 +++ b/app/module/drivers/gpio/Kconfig.595 @@ -10,7 +10,6 @@ menuconfig GPIO_595 default $(dt_compat_enabled,$(DT_COMPAT_ZMK_GPIO_595)) depends on SPI select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO help Enable driver for 595 shift register chip using SPI. diff --git a/app/drivers/gpio/Kconfig.max7318 b/app/module/drivers/gpio/Kconfig.max7318 similarity index 95% rename from app/drivers/gpio/Kconfig.max7318 rename to app/module/drivers/gpio/Kconfig.max7318 index d572b970..b54e1dba 100644 --- a/app/drivers/gpio/Kconfig.max7318 +++ b/app/module/drivers/gpio/Kconfig.max7318 @@ -10,7 +10,6 @@ menuconfig GPIO_MAX7318 default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX7318)) depends on I2C select HAS_DTS_GPIO - select ZMK_DRIVERS_GPIO help Enable driver for MAX7318 I2C-based GPIO chip. diff --git a/app/drivers/gpio/gpio_595.c b/app/module/drivers/gpio/gpio_595.c similarity index 100% rename from app/drivers/gpio/gpio_595.c rename to app/module/drivers/gpio/gpio_595.c diff --git a/app/drivers/gpio/gpio_max7318.c b/app/module/drivers/gpio/gpio_max7318.c similarity index 100% rename from app/drivers/gpio/gpio_max7318.c rename to app/module/drivers/gpio/gpio_max7318.c diff --git a/app/drivers/kscan/CMakeLists.txt b/app/module/drivers/kscan/CMakeLists.txt similarity index 85% rename from app/drivers/kscan/CMakeLists.txt rename to app/module/drivers/kscan/CMakeLists.txt index 8fc7ed58..0bdcd90e 100644 --- a/app/drivers/kscan/CMakeLists.txt +++ b/app/module/drivers/kscan/CMakeLists.txt @@ -1,8 +1,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -zephyr_library_named(zmk__drivers__kscan) -zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) +zephyr_library_amend() zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER debounce.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio.c) diff --git a/app/drivers/kscan/Kconfig b/app/module/drivers/kscan/Kconfig similarity index 94% rename from app/drivers/kscan/Kconfig rename to app/module/drivers/kscan/Kconfig index 1d165669..e67c9aa8 100644 --- a/app/drivers/kscan/Kconfig +++ b/app/module/drivers/kscan/Kconfig @@ -7,6 +7,8 @@ DT_COMPAT_ZMK_KSCAN_GPIO_DIRECT := zmk,kscan-gpio-direct DT_COMPAT_ZMK_KSCAN_GPIO_MATRIX := zmk,kscan-gpio-matrix DT_COMPAT_ZMK_KSCAN_MOCK := zmk,kscan-mock +if KSCAN + config ZMK_KSCAN_COMPOSITE_DRIVER bool default $(dt_compat_enabled,$(DT_COMPAT_ZMK_KSCAN_COMPOSITE)) @@ -87,8 +89,10 @@ config ZMK_KSCAN_DEBOUNCE_RELEASE_MS endif -config ZMK_KSCAN_INIT_PRIORITY - int "Keyboard scan driver init priority" - default 40 - help - Keyboard scan device driver initialization priority. +# config ZMK_KSCAN_INIT_PRIORITY +# int "Keyboard scan driver init priority" +# default 40 +# help +# Keyboard scan device driver initialization priority. + +endif # KSCAN diff --git a/app/drivers/kscan/debounce.c b/app/module/drivers/kscan/debounce.c similarity index 100% rename from app/drivers/kscan/debounce.c rename to app/module/drivers/kscan/debounce.c diff --git a/app/drivers/kscan/debounce.h b/app/module/drivers/kscan/debounce.h similarity index 100% rename from app/drivers/kscan/debounce.h rename to app/module/drivers/kscan/debounce.h diff --git a/app/drivers/kscan/kscan_composite.c b/app/module/drivers/kscan/kscan_composite.c similarity index 100% rename from app/drivers/kscan/kscan_composite.c rename to app/module/drivers/kscan/kscan_composite.c diff --git a/app/drivers/kscan/kscan_gpio.c b/app/module/drivers/kscan/kscan_gpio.c similarity index 100% rename from app/drivers/kscan/kscan_gpio.c rename to app/module/drivers/kscan/kscan_gpio.c diff --git a/app/drivers/kscan/kscan_gpio.h b/app/module/drivers/kscan/kscan_gpio.h similarity index 100% rename from app/drivers/kscan/kscan_gpio.h rename to app/module/drivers/kscan/kscan_gpio.h diff --git a/app/drivers/kscan/kscan_gpio_demux.c b/app/module/drivers/kscan/kscan_gpio_demux.c similarity index 100% rename from app/drivers/kscan/kscan_gpio_demux.c rename to app/module/drivers/kscan/kscan_gpio_demux.c diff --git a/app/drivers/kscan/kscan_gpio_direct.c b/app/module/drivers/kscan/kscan_gpio_direct.c similarity index 100% rename from app/drivers/kscan/kscan_gpio_direct.c rename to app/module/drivers/kscan/kscan_gpio_direct.c diff --git a/app/drivers/kscan/kscan_gpio_matrix.c b/app/module/drivers/kscan/kscan_gpio_matrix.c similarity index 100% rename from app/drivers/kscan/kscan_gpio_matrix.c rename to app/module/drivers/kscan/kscan_gpio_matrix.c diff --git a/app/drivers/kscan/kscan_mock.c b/app/module/drivers/kscan/kscan_mock.c similarity index 100% rename from app/drivers/kscan/kscan_mock.c rename to app/module/drivers/kscan/kscan_mock.c diff --git a/app/drivers/sensor/CMakeLists.txt b/app/module/drivers/sensor/CMakeLists.txt similarity index 100% rename from app/drivers/sensor/CMakeLists.txt rename to app/module/drivers/sensor/CMakeLists.txt diff --git a/app/drivers/sensor/Kconfig b/app/module/drivers/sensor/Kconfig similarity index 67% rename from app/drivers/sensor/Kconfig rename to app/module/drivers/sensor/Kconfig index a828f6c6..6a8ac07e 100644 --- a/app/drivers/sensor/Kconfig +++ b/app/module/drivers/sensor/Kconfig @@ -1,5 +1,9 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT +if SENSOR + rsource "battery/Kconfig" -rsource "ec11/Kconfig" \ No newline at end of file +rsource "ec11/Kconfig" + +endif # SENSOR \ No newline at end of file diff --git a/app/drivers/sensor/battery/CMakeLists.txt b/app/module/drivers/sensor/battery/CMakeLists.txt similarity index 100% rename from app/drivers/sensor/battery/CMakeLists.txt rename to app/module/drivers/sensor/battery/CMakeLists.txt diff --git a/app/drivers/sensor/battery/Kconfig b/app/module/drivers/sensor/battery/Kconfig similarity index 100% rename from app/drivers/sensor/battery/Kconfig rename to app/module/drivers/sensor/battery/Kconfig diff --git a/app/drivers/sensor/battery/battery_common.c b/app/module/drivers/sensor/battery/battery_common.c similarity index 100% rename from app/drivers/sensor/battery/battery_common.c rename to app/module/drivers/sensor/battery/battery_common.c diff --git a/app/drivers/sensor/battery/battery_common.h b/app/module/drivers/sensor/battery/battery_common.h similarity index 100% rename from app/drivers/sensor/battery/battery_common.h rename to app/module/drivers/sensor/battery/battery_common.h diff --git a/app/drivers/sensor/battery/battery_nrf_vddh.c b/app/module/drivers/sensor/battery/battery_nrf_vddh.c similarity index 100% rename from app/drivers/sensor/battery/battery_nrf_vddh.c rename to app/module/drivers/sensor/battery/battery_nrf_vddh.c diff --git a/app/drivers/sensor/battery/battery_voltage_divider.c b/app/module/drivers/sensor/battery/battery_voltage_divider.c similarity index 100% rename from app/drivers/sensor/battery/battery_voltage_divider.c rename to app/module/drivers/sensor/battery/battery_voltage_divider.c diff --git a/app/drivers/sensor/ec11/CMakeLists.txt b/app/module/drivers/sensor/ec11/CMakeLists.txt similarity index 100% rename from app/drivers/sensor/ec11/CMakeLists.txt rename to app/module/drivers/sensor/ec11/CMakeLists.txt diff --git a/app/drivers/sensor/ec11/Kconfig b/app/module/drivers/sensor/ec11/Kconfig similarity index 100% rename from app/drivers/sensor/ec11/Kconfig rename to app/module/drivers/sensor/ec11/Kconfig diff --git a/app/drivers/sensor/ec11/ec11.c b/app/module/drivers/sensor/ec11/ec11.c similarity index 100% rename from app/drivers/sensor/ec11/ec11.c rename to app/module/drivers/sensor/ec11/ec11.c diff --git a/app/drivers/sensor/ec11/ec11.h b/app/module/drivers/sensor/ec11/ec11.h similarity index 100% rename from app/drivers/sensor/ec11/ec11.h rename to app/module/drivers/sensor/ec11/ec11.h diff --git a/app/drivers/sensor/ec11/ec11_trigger.c b/app/module/drivers/sensor/ec11/ec11_trigger.c similarity index 100% rename from app/drivers/sensor/ec11/ec11_trigger.c rename to app/module/drivers/sensor/ec11/ec11_trigger.c diff --git a/app/dts/bindings/display/gooddisplay,il0323.yaml b/app/module/dts/bindings/display/gooddisplay,il0323.yaml similarity index 100% rename from app/dts/bindings/display/gooddisplay,il0323.yaml rename to app/module/dts/bindings/display/gooddisplay,il0323.yaml diff --git a/app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml b/app/module/dts/bindings/gpio/maxim,max7318.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/gpio/maxim,max7318.yaml rename to app/module/dts/bindings/gpio/maxim,max7318.yaml diff --git a/app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml b/app/module/dts/bindings/gpio/zmk,gpio-595.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/gpio/zmk,gpio-595.yaml rename to app/module/dts/bindings/gpio/zmk,gpio-595.yaml diff --git a/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml b/app/module/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml rename to app/module/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml diff --git a/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml b/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml rename to app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml diff --git a/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml b/app/module/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml rename to app/module/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml diff --git a/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml b/app/module/dts/bindings/sensor/alps,ec11.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml rename to app/module/dts/bindings/sensor/alps,ec11.yaml diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml b/app/module/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml rename to app/module/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml diff --git a/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml b/app/module/dts/bindings/sensor/zmk,battery-voltage-divider.yaml similarity index 100% rename from app/drivers/zephyr/dts/bindings/sensor/zmk,battery-voltage-divider.yaml rename to app/module/dts/bindings/sensor/zmk,battery-voltage-divider.yaml diff --git a/app/include/dt-bindings/zmk/kscan_mock.h b/app/module/include/dt-bindings/zmk/kscan_mock.h similarity index 100% rename from app/include/dt-bindings/zmk/kscan_mock.h rename to app/module/include/dt-bindings/zmk/kscan_mock.h diff --git a/app/drivers/zephyr/module.yml b/app/module/zephyr/module.yml similarity index 56% rename from app/drivers/zephyr/module.yml rename to app/module/zephyr/module.yml index 0b660594..219b2cfd 100644 --- a/app/drivers/zephyr/module.yml +++ b/app/module/zephyr/module.yml @@ -1,3 +1,5 @@ build: cmake: . kconfig: Kconfig + settings: + dts_root: . From c28ef1b61e9feb748ff0823f7f226d67e14fd3aa Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Sat, 2 Sep 2023 20:28:47 -0700 Subject: [PATCH 438/494] refactor(drivers): Use proper init stage/priority. * Avoid APPLICATION stage and use the proper earlier stage for kscan drivers. --- app/module/drivers/kscan/Kconfig | 6 ------ app/module/drivers/kscan/kscan_composite.c | 2 +- app/module/drivers/kscan/kscan_gpio_demux.c | 2 +- app/module/drivers/kscan/kscan_gpio_direct.c | 2 +- app/module/drivers/kscan/kscan_gpio_matrix.c | 2 +- app/module/drivers/kscan/kscan_mock.c | 4 ++-- 6 files changed, 6 insertions(+), 12 deletions(-) diff --git a/app/module/drivers/kscan/Kconfig b/app/module/drivers/kscan/Kconfig index e67c9aa8..60b5df3b 100644 --- a/app/module/drivers/kscan/Kconfig +++ b/app/module/drivers/kscan/Kconfig @@ -89,10 +89,4 @@ config ZMK_KSCAN_DEBOUNCE_RELEASE_MS endif -# config ZMK_KSCAN_INIT_PRIORITY -# int "Keyboard scan driver init priority" -# default 40 -# help -# Keyboard scan device driver initialization priority. - endif # KSCAN diff --git a/app/module/drivers/kscan/kscan_composite.c b/app/module/drivers/kscan/kscan_composite.c index 9909a4cf..97311ef8 100644 --- a/app/module/drivers/kscan/kscan_composite.c +++ b/app/module/drivers/kscan/kscan_composite.c @@ -109,4 +109,4 @@ static const struct kscan_composite_config kscan_composite_config = {}; static struct kscan_composite_data kscan_composite_data; DEVICE_DT_INST_DEFINE(0, kscan_composite_init, NULL, &kscan_composite_data, &kscan_composite_config, - APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &mock_driver_api); + POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, &mock_driver_api); diff --git a/app/module/drivers/kscan/kscan_gpio_demux.c b/app/module/drivers/kscan/kscan_gpio_demux.c index 812a899d..2cbe116d 100644 --- a/app/module/drivers/kscan/kscan_gpio_demux.c +++ b/app/module/drivers/kscan/kscan_gpio_demux.c @@ -201,7 +201,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); }; \ \ DEVICE_DT_INST_DEFINE(n, kscan_gpio_init_##n, NULL, &kscan_gpio_data_##n, \ - &kscan_gpio_config_##n, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY, \ + &kscan_gpio_config_##n, POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, \ &gpio_driver_api_##n); DT_INST_FOREACH_STATUS_OKAY(GPIO_INST_INIT) diff --git a/app/module/drivers/kscan/kscan_gpio_direct.c b/app/module/drivers/kscan/kscan_gpio_direct.c index d43d716b..c0990887 100644 --- a/app/module/drivers/kscan/kscan_gpio_direct.c +++ b/app/module/drivers/kscan/kscan_gpio_direct.c @@ -354,7 +354,7 @@ static const struct kscan_driver_api kscan_direct_api = { }; \ \ DEVICE_DT_INST_DEFINE(n, &kscan_direct_init, NULL, &kscan_direct_data_##n, \ - &kscan_direct_config_##n, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY, \ + &kscan_direct_config_##n, POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, \ &kscan_direct_api); DT_INST_FOREACH_STATUS_OKAY(KSCAN_DIRECT_INIT); diff --git a/app/module/drivers/kscan/kscan_gpio_matrix.c b/app/module/drivers/kscan/kscan_gpio_matrix.c index b8e72044..309da204 100644 --- a/app/module/drivers/kscan/kscan_gpio_matrix.c +++ b/app/module/drivers/kscan/kscan_gpio_matrix.c @@ -465,7 +465,7 @@ static const struct kscan_driver_api kscan_matrix_api = { }; \ \ DEVICE_DT_INST_DEFINE(n, &kscan_matrix_init, NULL, &kscan_matrix_data_##n, \ - &kscan_matrix_config_##n, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY, \ + &kscan_matrix_config_##n, POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, \ &kscan_matrix_api); DT_INST_FOREACH_STATUS_OKAY(KSCAN_MATRIX_INIT); diff --git a/app/module/drivers/kscan/kscan_mock.c b/app/module/drivers/kscan/kscan_mock.c index 57862b0d..604e164c 100644 --- a/app/module/drivers/kscan/kscan_mock.c +++ b/app/module/drivers/kscan/kscan_mock.c @@ -89,7 +89,7 @@ static int kscan_mock_configure(const struct device *dev, kscan_callback_t callb static const struct kscan_mock_config_##n kscan_mock_config_##n = { \ .events = DT_INST_PROP(n, events), .exit_after = DT_INST_PROP(n, exit_after)}; \ DEVICE_DT_INST_DEFINE(n, kscan_mock_init_##n, NULL, &kscan_mock_data_##n, \ - &kscan_mock_config_##n, APPLICATION, \ - CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, &mock_driver_api_##n); + &kscan_mock_config_##n, POST_KERNEL, CONFIG_KSCAN_INIT_PRIORITY, \ + &mock_driver_api_##n); DT_INST_FOREACH_STATUS_OKAY(MOCK_INST_INIT) From 0ca7f69b6d21f0e24555d635a017459a8ed0fe43 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 11 Sep 2023 21:56:37 -0700 Subject: [PATCH 439/494] refactor: Promote debounce to exposed mod lib. * Promote previously local debounce code from kscan drivers to exposed module lib, for use with other drivers as needed. * Refactor existing kscan driver to new "public" API. --- app/module/CMakeLists.txt | 3 ++- app/module/Kconfig | 3 ++- app/module/drivers/kscan/CMakeLists.txt | 1 - app/module/drivers/kscan/Kconfig | 1 + app/module/drivers/kscan/kscan_gpio_direct.c | 21 ++++++++++--------- app/module/drivers/kscan/kscan_gpio_matrix.c | 21 ++++++++++--------- .../{drivers/kscan => include/zmk}/debounce.h | 14 ++++++------- app/module/lib/CMakeLists.txt | 2 ++ app/module/lib/Kconfig | 2 ++ app/module/lib/zmk_debounce/CMakeLists.txt | 3 +++ app/module/lib/zmk_debounce/Kconfig | 3 +++ .../kscan => lib/zmk_debounce}/debounce.c | 20 +++++++++--------- 12 files changed, 54 insertions(+), 40 deletions(-) rename app/module/{drivers/kscan => include/zmk}/debounce.h (73%) create mode 100644 app/module/lib/CMakeLists.txt create mode 100644 app/module/lib/Kconfig create mode 100644 app/module/lib/zmk_debounce/CMakeLists.txt create mode 100644 app/module/lib/zmk_debounce/Kconfig rename app/module/{drivers/kscan => lib/zmk_debounce}/debounce.c (62%) diff --git a/app/module/CMakeLists.txt b/app/module/CMakeLists.txt index 1c140d33..db886ac6 100644 --- a/app/module/CMakeLists.txt +++ b/app/module/CMakeLists.txt @@ -1,3 +1,4 @@ zephyr_include_directories(include) -add_subdirectory(drivers) \ No newline at end of file +add_subdirectory(drivers) +add_subdirectory(lib) \ No newline at end of file diff --git a/app/module/Kconfig b/app/module/Kconfig index cb2ae20c..52c01315 100644 --- a/app/module/Kconfig +++ b/app/module/Kconfig @@ -1,2 +1,3 @@ -rsource "drivers/Kconfig" \ No newline at end of file +rsource "drivers/Kconfig" +rsource "lib/Kconfig" \ No newline at end of file diff --git a/app/module/drivers/kscan/CMakeLists.txt b/app/module/drivers/kscan/CMakeLists.txt index 0bdcd90e..7ae9524c 100644 --- a/app/module/drivers/kscan/CMakeLists.txt +++ b/app/module/drivers/kscan/CMakeLists.txt @@ -3,7 +3,6 @@ zephyr_library_amend() -zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER debounce.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DRIVER kscan_gpio.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_MATRIX kscan_gpio_matrix.c) zephyr_library_sources_ifdef(CONFIG_ZMK_KSCAN_GPIO_DIRECT kscan_gpio_direct.c) diff --git a/app/module/drivers/kscan/Kconfig b/app/module/drivers/kscan/Kconfig index 60b5df3b..6f60b3f9 100644 --- a/app/module/drivers/kscan/Kconfig +++ b/app/module/drivers/kscan/Kconfig @@ -16,6 +16,7 @@ config ZMK_KSCAN_COMPOSITE_DRIVER config ZMK_KSCAN_GPIO_DRIVER bool select GPIO + select ZMK_DEBOUNCE config ZMK_KSCAN_GPIO_DEMUX bool diff --git a/app/module/drivers/kscan/kscan_gpio_direct.c b/app/module/drivers/kscan/kscan_gpio_direct.c index c0990887..5b227784 100644 --- a/app/module/drivers/kscan/kscan_gpio_direct.c +++ b/app/module/drivers/kscan/kscan_gpio_direct.c @@ -4,7 +4,6 @@ * SPDX-License-Identifier: MIT */ -#include "debounce.h" #include "kscan_gpio.h" #include @@ -15,6 +14,8 @@ #include #include +#include + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define DT_DRV_COMPAT zmk_kscan_gpio_direct @@ -61,11 +62,11 @@ struct kscan_direct_data { /** Timestamp of the current or scheduled scan. */ int64_t scan_time; /** Current state of the inputs as an array of length config->inputs.len */ - struct debounce_state *pin_state; + struct zmk_debounce_state *pin_state; }; struct kscan_direct_config { - struct debounce_config debounce_config; + struct zmk_debounce_config debounce_config; int32_t debounce_scan_period_ms; int32_t poll_period_ms; bool toggle_mode; @@ -182,8 +183,8 @@ static int kscan_direct_read(const struct device *dev) { return active; } - debounce_update(&data->pin_state[gpio->index], active, config->debounce_scan_period_ms, - &config->debounce_config); + zmk_debounce_update(&data->pin_state[gpio->index], active, config->debounce_scan_period_ms, + &config->debounce_config); } // Process the new state. @@ -191,10 +192,10 @@ static int kscan_direct_read(const struct device *dev) { for (int i = 0; i < data->inputs.len; i++) { const struct kscan_gpio *gpio = &data->inputs.gpios[i]; - struct debounce_state *state = &data->pin_state[gpio->index]; + struct zmk_debounce_state *state = &data->pin_state[gpio->index]; - if (debounce_get_changed(state)) { - const bool pressed = debounce_is_pressed(state); + if (zmk_debounce_get_changed(state)) { + const bool pressed = zmk_debounce_is_pressed(state); LOG_DBG("Sending event at 0,%i state %s", gpio->index, pressed ? "on" : "off"); data->callback(dev, 0, gpio->index, pressed); @@ -203,7 +204,7 @@ static int kscan_direct_read(const struct device *dev) { } } - continue_scan = continue_scan || debounce_is_active(state); + continue_scan = continue_scan || zmk_debounce_is_active(state); } if (continue_scan) { @@ -332,7 +333,7 @@ static const struct kscan_driver_api kscan_direct_api = { static struct kscan_gpio kscan_direct_inputs_##n[] = { \ LISTIFY(INST_INPUTS_LEN(n), KSCAN_DIRECT_INPUT_CFG_INIT, (, ), n)}; \ \ - static struct debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ + static struct zmk_debounce_state kscan_direct_state_##n[INST_INPUTS_LEN(n)]; \ \ COND_INTERRUPTS( \ (static struct kscan_direct_irq_callback kscan_direct_irqs_##n[INST_INPUTS_LEN(n)];)) \ diff --git a/app/module/drivers/kscan/kscan_gpio_matrix.c b/app/module/drivers/kscan/kscan_gpio_matrix.c index 309da204..0d8a3190 100644 --- a/app/module/drivers/kscan/kscan_gpio_matrix.c +++ b/app/module/drivers/kscan/kscan_gpio_matrix.c @@ -4,7 +4,6 @@ * SPDX-License-Identifier: MIT */ -#include "debounce.h" #include "kscan_gpio.h" #include @@ -16,6 +15,8 @@ #include #include +#include + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #define DT_DRV_COMPAT zmk_kscan_gpio_matrix @@ -80,12 +81,12 @@ struct kscan_matrix_data { * Current state of the matrix as a flattened 2D array of length * (config->rows * config->cols) */ - struct debounce_state *matrix_state; + struct zmk_debounce_state *matrix_state; }; struct kscan_matrix_config { struct kscan_gpio_list outputs; - struct debounce_config debounce_config; + struct zmk_debounce_config debounce_config; size_t rows; size_t cols; int32_t debounce_scan_period_ms; @@ -242,8 +243,8 @@ static int kscan_matrix_read(const struct device *dev) { return active; } - debounce_update(&data->matrix_state[index], active, config->debounce_scan_period_ms, - &config->debounce_config); + zmk_debounce_update(&data->matrix_state[index], active, config->debounce_scan_period_ms, + &config->debounce_config); } err = gpio_pin_set_dt(&out_gpio->spec, 0); @@ -263,16 +264,16 @@ static int kscan_matrix_read(const struct device *dev) { for (int r = 0; r < config->rows; r++) { for (int c = 0; c < config->cols; c++) { const int index = state_index_rc(config, r, c); - struct debounce_state *state = &data->matrix_state[index]; + struct zmk_debounce_state *state = &data->matrix_state[index]; - if (debounce_get_changed(state)) { - const bool pressed = debounce_is_pressed(state); + if (zmk_debounce_get_changed(state)) { + const bool pressed = zmk_debounce_is_pressed(state); LOG_DBG("Sending event at %i,%i state %s", r, c, pressed ? "on" : "off"); data->callback(dev, r, c, pressed); } - continue_scan = continue_scan || debounce_is_active(state); + continue_scan = continue_scan || zmk_debounce_is_active(state); } } @@ -438,7 +439,7 @@ static const struct kscan_driver_api kscan_matrix_api = { static struct kscan_gpio kscan_matrix_cols_##n[] = { \ LISTIFY(INST_COLS_LEN(n), KSCAN_GPIO_COL_CFG_INIT, (, ), n)}; \ \ - static struct debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ + static struct zmk_debounce_state kscan_matrix_state_##n[INST_MATRIX_LEN(n)]; \ \ COND_INTERRUPTS( \ (static struct kscan_matrix_irq_callback kscan_matrix_irqs_##n[INST_INPUTS_LEN(n)];)) \ diff --git a/app/module/drivers/kscan/debounce.h b/app/module/include/zmk/debounce.h similarity index 73% rename from app/module/drivers/kscan/debounce.h rename to app/module/include/zmk/debounce.h index 6e9faa66..afa775a0 100644 --- a/app/module/drivers/kscan/debounce.h +++ b/app/module/include/zmk/debounce.h @@ -13,13 +13,13 @@ #define DEBOUNCE_COUNTER_BITS 14 #define DEBOUNCE_COUNTER_MAX BIT_MASK(DEBOUNCE_COUNTER_BITS) -struct debounce_state { +struct zmk_debounce_state { bool pressed : 1; bool changed : 1; uint16_t counter : DEBOUNCE_COUNTER_BITS; }; -struct debounce_config { +struct zmk_debounce_config { /** Duration a switch must be pressed to latch as pressed. */ uint32_t debounce_press_ms; /** Duration a switch must be released to latch as released. */ @@ -34,23 +34,23 @@ struct debounce_config { * @param elapsed_ms Time elapsed since the previous update in milliseconds. * @param config Debounce settings. */ -void debounce_update(struct debounce_state *state, const bool active, const int elapsed_ms, - const struct debounce_config *config); +void zmk_debounce_update(struct zmk_debounce_state *state, const bool active, const int elapsed_ms, + const struct zmk_debounce_config *config); /** * @returns whether the switch is either latched as pressed or it is potentially * pressed but the debouncer has not yet made a decision. If this returns true, * the kscan driver should continue to poll quickly. */ -bool debounce_is_active(const struct debounce_state *state); +bool zmk_debounce_is_active(const struct zmk_debounce_state *state); /** * @returns whether the switch is latched as pressed. */ -bool debounce_is_pressed(const struct debounce_state *state); +bool zmk_debounce_is_pressed(const struct zmk_debounce_state *state); /** * @returns whether the pressed state of the switch changed in the last call to * debounce_update. */ -bool debounce_get_changed(const struct debounce_state *state); +bool zmk_debounce_get_changed(const struct zmk_debounce_state *state); diff --git a/app/module/lib/CMakeLists.txt b/app/module/lib/CMakeLists.txt new file mode 100644 index 00000000..146b3637 --- /dev/null +++ b/app/module/lib/CMakeLists.txt @@ -0,0 +1,2 @@ + +add_subdirectory_ifdef(CONFIG_ZMK_DEBOUNCE zmk_debounce) \ No newline at end of file diff --git a/app/module/lib/Kconfig b/app/module/lib/Kconfig new file mode 100644 index 00000000..8f2f0601 --- /dev/null +++ b/app/module/lib/Kconfig @@ -0,0 +1,2 @@ + +rsource "zmk_debounce/Kconfig" \ No newline at end of file diff --git a/app/module/lib/zmk_debounce/CMakeLists.txt b/app/module/lib/zmk_debounce/CMakeLists.txt new file mode 100644 index 00000000..0a65dde1 --- /dev/null +++ b/app/module/lib/zmk_debounce/CMakeLists.txt @@ -0,0 +1,3 @@ + +zephyr_library() +zephyr_library_sources(debounce.c) \ No newline at end of file diff --git a/app/module/lib/zmk_debounce/Kconfig b/app/module/lib/zmk_debounce/Kconfig new file mode 100644 index 00000000..cd0321e8 --- /dev/null +++ b/app/module/lib/zmk_debounce/Kconfig @@ -0,0 +1,3 @@ + +config ZMK_DEBOUNCE + bool "Debounce Support" \ No newline at end of file diff --git a/app/module/drivers/kscan/debounce.c b/app/module/lib/zmk_debounce/debounce.c similarity index 62% rename from app/module/drivers/kscan/debounce.c rename to app/module/lib/zmk_debounce/debounce.c index b3878226..6f4885b7 100644 --- a/app/module/drivers/kscan/debounce.c +++ b/app/module/lib/zmk_debounce/debounce.c @@ -4,14 +4,14 @@ * SPDX-License-Identifier: MIT */ -#include "debounce.h" +#include -static uint32_t get_threshold(const struct debounce_state *state, - const struct debounce_config *config) { +static uint32_t get_threshold(const struct zmk_debounce_state *state, + const struct zmk_debounce_config *config) { return state->pressed ? config->debounce_release_ms : config->debounce_press_ms; } -static void increment_counter(struct debounce_state *state, const int elapsed_ms) { +static void increment_counter(struct zmk_debounce_state *state, const int elapsed_ms) { if (state->counter + elapsed_ms > DEBOUNCE_COUNTER_MAX) { state->counter = DEBOUNCE_COUNTER_MAX; } else { @@ -19,7 +19,7 @@ static void increment_counter(struct debounce_state *state, const int elapsed_ms } } -static void decrement_counter(struct debounce_state *state, const int elapsed_ms) { +static void decrement_counter(struct zmk_debounce_state *state, const int elapsed_ms) { if (state->counter < elapsed_ms) { state->counter = 0; } else { @@ -27,8 +27,8 @@ static void decrement_counter(struct debounce_state *state, const int elapsed_ms } } -void debounce_update(struct debounce_state *state, const bool active, const int elapsed_ms, - const struct debounce_config *config) { +void zmk_debounce_update(struct zmk_debounce_state *state, const bool active, const int elapsed_ms, + const struct zmk_debounce_config *config) { // This uses a variation of the integrator debouncing described at // https://www.kennethkuhn.com/electronics/debounce.c // Every update where "active" does not match the current state, we increment @@ -53,10 +53,10 @@ void debounce_update(struct debounce_state *state, const bool active, const int state->changed = true; } -bool debounce_is_active(const struct debounce_state *state) { +bool zmk_debounce_is_active(const struct zmk_debounce_state *state) { return state->pressed || state->counter > 0; } -bool debounce_is_pressed(const struct debounce_state *state) { return state->pressed; } +bool zmk_debounce_is_pressed(const struct zmk_debounce_state *state) { return state->pressed; } -bool debounce_get_changed(const struct debounce_state *state) { return state->changed; } \ No newline at end of file +bool zmk_debounce_get_changed(const struct zmk_debounce_state *state) { return state->changed; } \ No newline at end of file From 28ce23d4891eee3a1ef0a0d8187afe233d05cf81 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Thu, 14 Sep 2023 23:43:47 -0700 Subject: [PATCH 440/494] chore(tests): Move to proper header name. --- app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap | 2 +- app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap | 2 +- app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap | 2 +- app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap | 2 +- app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap | 2 +- app/tests/combo/layer-filter-0/native_posix_64.keymap | 2 +- app/tests/combo/layer-filter-1/native_posix_64.keymap | 2 +- app/tests/combo/multiple-timeouts/native_posix_64.keymap | 2 +- app/tests/combo/overlapping-combos-0/native_posix_64.keymap | 2 +- app/tests/combo/overlapping-combos-1/native_posix_64.keymap | 2 +- app/tests/combo/overlapping-combos-2/native_posix_64.keymap | 2 +- app/tests/combo/overlapping-combos-3/native_posix_64.keymap | 2 +- .../combo/partially-overlapping-combos/native_posix_64.keymap | 2 +- .../press-release-long-combo-complete/native_posix_64.keymap | 2 +- .../press-release-long-combo-incomplete/native_posix_64.keymap | 2 +- .../native_posix_64.keymap | 2 +- app/tests/combo/press-release/native_posix_64.keymap | 2 +- app/tests/combo/press-timeout/native_posix_64.keymap | 2 +- .../press1-press2-release1-release2/native_posix_64.keymap | 2 +- .../press1-press2-release2-release1/native_posix_64.keymap | 2 +- .../press1-release1-press2-release2/native_posix_64.keymap | 2 +- app/tests/combo/slowrelease-disabled/native_posix_64.keymap | 2 +- app/tests/combo/slowrelease-enabled/native_posix_64.keymap | 2 +- app/tests/gresc/gresc-press-release/native_posix_64.keymap | 2 +- app/tests/gresc/gresc-two-instances/native_posix_64.keymap | 2 +- .../kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap | 2 +- app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap | 2 +- .../sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap | 2 +- app/tests/to-layer/behavior_keymap.dtsi | 2 +- app/tests/to-layer/normal/native_posix_64.keymap | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap index e6754b71..3438f9bc 100644 --- a/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-0/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include &mt { flavor = "hold-preferred"; diff --git a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap index 95382432..9120e8c3 100644 --- a/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-1/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include &mt { flavor = "hold-preferred"; diff --git a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap index d6d187e2..a227fe4c 100644 --- a/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-2/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include &mt { flavor = "hold-preferred"; diff --git a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap index f1c7eee7..4fbf2407 100644 --- a/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-3/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include &mt { flavor = "hold-preferred"; diff --git a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap index 134b77df..59f4391f 100644 --- a/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap +++ b/app/tests/combo/combos-and-holdtaps-4/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include #define ZMK_COMBO(name, combo_bindings, keypos, combo_term) \ diff --git a/app/tests/combo/layer-filter-0/native_posix_64.keymap b/app/tests/combo/layer-filter-0/native_posix_64.keymap index 8d94872b..68077849 100644 --- a/app/tests/combo/layer-filter-0/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-0/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* it is useful to set timeout to a large value when attaching a debugger. */ #define TIMEOUT (60*60*1000) diff --git a/app/tests/combo/layer-filter-1/native_posix_64.keymap b/app/tests/combo/layer-filter-1/native_posix_64.keymap index 96eccea4..a11b86ad 100644 --- a/app/tests/combo/layer-filter-1/native_posix_64.keymap +++ b/app/tests/combo/layer-filter-1/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* it is useful to set timeout to a large value when attaching a debugger. */ #define TIMEOUT (60*60*1000) diff --git a/app/tests/combo/multiple-timeouts/native_posix_64.keymap b/app/tests/combo/multiple-timeouts/native_posix_64.keymap index d2176390..a2edc32f 100644 --- a/app/tests/combo/multiple-timeouts/native_posix_64.keymap +++ b/app/tests/combo/multiple-timeouts/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap index e8284665..e89a3f22 100644 --- a/app/tests/combo/overlapping-combos-0/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-0/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* combo 0 timeout inf diff --git a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap index a695a388..4b0166be 100644 --- a/app/tests/combo/overlapping-combos-1/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-1/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* combo 01 timeout 50 diff --git a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap index 6bf0e710..5c38bcfc 100644 --- a/app/tests/combo/overlapping-combos-2/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-2/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* combo 01 timeout 100 diff --git a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap index 0a2f5ee1..48e3397f 100644 --- a/app/tests/combo/overlapping-combos-3/native_posix_64.keymap +++ b/app/tests/combo/overlapping-combos-3/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* combo 12 timeout 100 diff --git a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap index 900c4af3..55e8f1e7 100644 --- a/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap +++ b/app/tests/combo/partially-overlapping-combos/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap index dac0bd5c..da2e9483 100644 --- a/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-complete/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap index 19bad1d0..b1494cec 100644 --- a/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-incomplete/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap index 2eb6271e..87692864 100644 --- a/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap +++ b/app/tests/combo/press-release-long-combo-wrong-last-key/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press-release/native_posix_64.keymap b/app/tests/combo/press-release/native_posix_64.keymap index 6bd432f9..26cd241b 100644 --- a/app/tests/combo/press-release/native_posix_64.keymap +++ b/app/tests/combo/press-release/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press-timeout/native_posix_64.keymap b/app/tests/combo/press-timeout/native_posix_64.keymap index 6ca6487b..a71de45a 100644 --- a/app/tests/combo/press-timeout/native_posix_64.keymap +++ b/app/tests/combo/press-timeout/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap index 9a395a41..2e0a67a3 100644 --- a/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release1-release2/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap index 86ca3931..8d4838eb 100644 --- a/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap +++ b/app/tests/combo/press1-press2-release2-release1/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap index 65089578..9c75e570 100644 --- a/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap +++ b/app/tests/combo/press1-release1-press2-release2/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap index 832e9705..46b35be0 100644 --- a/app/tests/combo/slowrelease-disabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-disabled/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap index 7fdb012e..d64876da 100644 --- a/app/tests/combo/slowrelease-enabled/native_posix_64.keymap +++ b/app/tests/combo/slowrelease-enabled/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { diff --git a/app/tests/gresc/gresc-press-release/native_posix_64.keymap b/app/tests/gresc/gresc-press-release/native_posix_64.keymap index 5e3fac42..c472dd6d 100644 --- a/app/tests/gresc/gresc-press-release/native_posix_64.keymap +++ b/app/tests/gresc/gresc-press-release/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { keymap { diff --git a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap index 18f94da5..14adcf45 100644 --- a/app/tests/gresc/gresc-two-instances/native_posix_64.keymap +++ b/app/tests/gresc/gresc-two-instances/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* This test checks nothing breaks if two grave-escapes are pressed at the same time. diff --git a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap index 621945a8..72b218f5 100644 --- a/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap +++ b/app/tests/modifiers/explicit/kp-hyper-dn-a-dn-a-up-hyper-up/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include &kscan { diff --git a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap index 23ceeeb6..bafdbe38 100644 --- a/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap +++ b/app/tests/sticky-keys/10-sl-sl-kp/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* sticky layers should quick-release. diff --git a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap index 39020751..38c8fb4c 100644 --- a/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap +++ b/app/tests/sticky-keys/2-sl-dn-up-kcdn-kcup/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include /* sticky layers should quick-release. diff --git a/app/tests/to-layer/behavior_keymap.dtsi b/app/tests/to-layer/behavior_keymap.dtsi index 663e897d..7dc857fe 100644 --- a/app/tests/to-layer/behavior_keymap.dtsi +++ b/app/tests/to-layer/behavior_keymap.dtsi @@ -1,6 +1,6 @@ #include #include -#include +#include / { keymap { diff --git a/app/tests/to-layer/normal/native_posix_64.keymap b/app/tests/to-layer/normal/native_posix_64.keymap index 4cb23809..6ccc9088 100644 --- a/app/tests/to-layer/normal/native_posix_64.keymap +++ b/app/tests/to-layer/normal/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include #include "../behavior_keymap.dtsi" // Press key A From 8abc449cc29ef35ffd5770e9f7680348b8c708f7 Mon Sep 17 00:00:00 2001 From: zhiayang <500236+zhiayang@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:04:03 -0400 Subject: [PATCH 441/494] feat(drivers): add driver for MAX17048 fuel gauge Add driver for MAX17048 fuel gauge for battery reporting. --- app/module/drivers/sensor/CMakeLists.txt | 3 +- app/module/drivers/sensor/Kconfig | 3 +- .../drivers/sensor/max17048/CMakeLists.txt | 9 + app/module/drivers/sensor/max17048/Kconfig | 23 ++ app/module/drivers/sensor/max17048/max17048.c | 222 ++++++++++++++++++ app/module/drivers/sensor/max17048/max17048.h | 41 ++++ .../dts/bindings/sensor/maxim,max17048.yml | 12 + 7 files changed, 311 insertions(+), 2 deletions(-) create mode 100644 app/module/drivers/sensor/max17048/CMakeLists.txt create mode 100644 app/module/drivers/sensor/max17048/Kconfig create mode 100644 app/module/drivers/sensor/max17048/max17048.c create mode 100644 app/module/drivers/sensor/max17048/max17048.h create mode 100644 app/module/dts/bindings/sensor/maxim,max17048.yml diff --git a/app/module/drivers/sensor/CMakeLists.txt b/app/module/drivers/sensor/CMakeLists.txt index b549320f..9654600a 100644 --- a/app/module/drivers/sensor/CMakeLists.txt +++ b/app/module/drivers/sensor/CMakeLists.txt @@ -2,4 +2,5 @@ # SPDX-License-Identifier: MIT add_subdirectory_ifdef(CONFIG_ZMK_BATTERY battery) -add_subdirectory_ifdef(CONFIG_EC11 ec11) \ No newline at end of file +add_subdirectory_ifdef(CONFIG_EC11 ec11) +add_subdirectory_ifdef(CONFIG_MAX17048 max17048) diff --git a/app/module/drivers/sensor/Kconfig b/app/module/drivers/sensor/Kconfig index 6a8ac07e..ad570c58 100644 --- a/app/module/drivers/sensor/Kconfig +++ b/app/module/drivers/sensor/Kconfig @@ -5,5 +5,6 @@ if SENSOR rsource "battery/Kconfig" rsource "ec11/Kconfig" +rsource "max17048/Kconfig" -endif # SENSOR \ No newline at end of file +endif # SENSOR diff --git a/app/module/drivers/sensor/max17048/CMakeLists.txt b/app/module/drivers/sensor/max17048/CMakeLists.txt new file mode 100644 index 00000000..e895fa11 --- /dev/null +++ b/app/module/drivers/sensor/max17048/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +zephyr_include_directories(.) + +zephyr_library() + +zephyr_library_sources_ifdef(CONFIG_MAX17048 max17048.c) +zephyr_library_sources_ifndef(CONFIG_MAX17048 ${ZEPHYR_BASE}/misc/empty_file.c) diff --git a/app/module/drivers/sensor/max17048/Kconfig b/app/module/drivers/sensor/max17048/Kconfig new file mode 100644 index 00000000..8a7ec16e --- /dev/null +++ b/app/module/drivers/sensor/max17048/Kconfig @@ -0,0 +1,23 @@ +# Copyright (c) 2022 The ZMK Contributors +# SPDX-License-Identifier: MIT + +DT_COMPAT_MAXIM_MAX17048 := maxim,max17048 + +menuconfig MAX17048 + bool "MAX17048/9 I2C-based Fuel Gauge" + default $(dt_compat_enabled,$(DT_COMPAT_MAXIM_MAX17048)) + depends on I2C + select ZMK_BATTERY + help + Enable driver for MAX17048/9 I2C-based Fuel Gauge. Supports measuring + battery voltage and state-of-charge. + +if MAX17048 + +config SENSOR_MAX17048_INIT_PRIORITY + int "Init priority" + default 75 + help + Device driver initialization priority. + +endif #MAX17048 diff --git a/app/module/drivers/sensor/max17048/max17048.c b/app/module/drivers/sensor/max17048/max17048.c new file mode 100644 index 00000000..24cfe093 --- /dev/null +++ b/app/module/drivers/sensor/max17048/max17048.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT maxim_max17048 + +#include +#include +#include +#include +#include +#include + +#include "max17048.h" + +#define LOG_LEVEL CONFIG_SENSOR_LOG_LEVEL +#include +LOG_MODULE_REGISTER(sensor_max17048); + +static int read_register(const struct device *dev, uint8_t reg, uint16_t *value) { + + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + struct max17048_config *config = (struct max17048_config *)dev->config; + + uint8_t data[2] = {0}; + int ret = i2c_burst_read_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); + if (ret != 0) { + LOG_DBG("i2c_write_read FAIL %d\n", ret); + return ret; + } + + // the register values are returned in big endian (MSB first) + *value = sys_get_be16(data); + return 0; +} + +static int write_register(const struct device *dev, uint8_t reg, uint16_t value) { + + if (k_is_in_isr()) { + return -EWOULDBLOCK; + } + + struct max17048_config *config = (struct max17048_config *)dev->config; + + uint8_t data[2] = {0}; + sys_put_be16(value, &data[0]); + + return i2c_burst_write_dt(&config->i2c_bus, reg, &data[0], sizeof(data)); +} + +static int set_rcomp_value(const struct device *dev, uint8_t rcomp_value) { + + struct max17048_drv_data *const drv_data = (struct max17048_drv_data *const)dev->data; + k_sem_take(&drv_data->lock, K_FOREVER); + + uint16_t tmp = 0; + int err = read_register(dev, REG_CONFIG, &tmp); + if (err != 0) { + goto done; + } + + tmp = ((uint16_t)rcomp_value << 8) | (tmp & 0xFF); + err = write_register(dev, REG_CONFIG, tmp); + if (err != 0) { + goto done; + } + + LOG_DBG("set RCOMP to %d", rcomp_value); + +done: + k_sem_give(&drv_data->lock); + return err; +} + +static int set_sleep_enabled(const struct device *dev, bool sleep) { + + struct max17048_drv_data *const drv_data = (struct max17048_drv_data *const)dev->data; + k_sem_take(&drv_data->lock, K_FOREVER); + + uint16_t tmp = 0; + int err = read_register(dev, REG_CONFIG, &tmp); + if (err != 0) { + goto done; + } + + if (sleep) { + tmp |= 0x80; + } else { + tmp &= ~0x0080; + } + + err = write_register(dev, REG_CONFIG, tmp); + if (err != 0) { + goto done; + } + + LOG_DBG("sleep mode %s", sleep ? "enabled" : "disabled"); + +done: + k_sem_give(&drv_data->lock); + return err; +} + +static int max17048_sample_fetch(const struct device *dev, enum sensor_channel chan) { + + struct max17048_drv_data *const drv_data = dev->data; + k_sem_take(&drv_data->lock, K_FOREVER); + + int err = 0; + + if (chan == SENSOR_CHAN_GAUGE_STATE_OF_CHARGE || chan == SENSOR_CHAN_ALL) { + err = read_register(dev, REG_STATE_OF_CHARGE, &drv_data->raw_state_of_charge); + if (err != 0) { + LOG_WRN("failed to read state-of-charge: %d", err); + goto done; + } + LOG_DBG("read soc: %d", drv_data->raw_state_of_charge); + + } else if (chan == SENSOR_CHAN_GAUGE_VOLTAGE || chan == SENSOR_CHAN_ALL) { + err = read_register(dev, REG_VCELL, &drv_data->raw_vcell); + if (err != 0) { + LOG_WRN("failed to read vcell: %d", err); + goto done; + } + LOG_DBG("read vcell: %d", drv_data->raw_vcell); + + } else { + LOG_DBG("unsupported channel %d", chan); + err = -ENOTSUP; + } + +done: + k_sem_give(&drv_data->lock); + return err; +} + +static int max17048_channel_get(const struct device *dev, enum sensor_channel chan, + struct sensor_value *val) { + int err = 0; + + struct max17048_drv_data *const drv_data = dev->data; + k_sem_take(&drv_data->lock, K_FOREVER); + + struct max17048_drv_data *const data = dev->data; + unsigned int tmp = 0; + + switch (chan) { + case SENSOR_CHAN_GAUGE_VOLTAGE: + // 1250 / 16 = 78.125 + tmp = data->raw_vcell * 1250 / 16; + val->val1 = tmp / 1000000; + val->val2 = tmp % 1000000; + break; + + case SENSOR_CHAN_GAUGE_STATE_OF_CHARGE: + val->val1 = (data->raw_state_of_charge >> 8); + val->val2 = (data->raw_state_of_charge & 0xFF) * 1000000 / 256; + break; + + default: + err = -ENOTSUP; + break; + } + + k_sem_give(&drv_data->lock); + return err; +} + +static int max17048_init(const struct device *dev) { + struct max17048_drv_data *drv_data = dev->data; + const struct max17048_config *config = dev->config; + + if (!device_is_ready(config->i2c_bus.bus)) { + LOG_WRN("i2c bus not ready!"); + return -EINVAL; + } + + uint16_t ic_version = 0; + int err = read_register(dev, REG_VERSION, &ic_version); + if (err != 0) { + LOG_WRN("could not get IC version!"); + return err; + } + + // the functions below need the semaphore, so initialise it here + k_sem_init(&drv_data->lock, 1, 1); + + // bring the device out of sleep + set_sleep_enabled(dev, false); + + // set the default rcomp value -- 0x97, as stated in the datasheet + set_rcomp_value(dev, 0x97); + + LOG_INF("device initialised at 0x%x (version %d)", config->i2c_bus.addr, ic_version); + + return 0; +} + +static const struct sensor_driver_api max17048_api_table = {.sample_fetch = max17048_sample_fetch, + .channel_get = max17048_channel_get}; + +#define MAX17048_INIT(inst) \ + static struct max17048_config max17048_##inst##_config = {.i2c_bus = \ + I2C_DT_SPEC_INST_GET(inst)}; \ + \ + static struct max17048_drv_data max17048_##inst##_drvdata = { \ + .raw_state_of_charge = 0, \ + .raw_charge_rate = 0, \ + .raw_vcell = 0, \ + }; \ + \ + /* This has to init after SPI master */ \ + DEVICE_DT_INST_DEFINE(inst, max17048_init, NULL, &max17048_##inst##_drvdata, \ + &max17048_##inst##_config, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, \ + &max17048_api_table); + +DT_INST_FOREACH_STATUS_OKAY(MAX17048_INIT) diff --git a/app/module/drivers/sensor/max17048/max17048.h b/app/module/drivers/sensor/max17048/max17048.h new file mode 100644 index 00000000..984f5c70 --- /dev/null +++ b/app/module/drivers/sensor/max17048/max17048.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define REG_VCELL 0x02 +#define REG_STATE_OF_CHARGE 0x04 +#define REG_MODE 0x06 +#define REG_VERSION 0x08 +#define REG_HIBERNATE 0x0A +#define REG_CONFIG 0x0C +#define REG_VALERT 0x14 +#define REG_CHARGE_RATE 0x16 +#define REG_VRESET 0x18 +#define REG_STATUS 0x1A + +struct max17048_config { + struct i2c_dt_spec i2c_bus; +}; + +struct max17048_drv_data { + struct k_sem lock; + + uint16_t raw_state_of_charge; + uint16_t raw_charge_rate; + uint16_t raw_vcell; +}; + +#ifdef __cplusplus +} +#endif diff --git a/app/module/dts/bindings/sensor/maxim,max17048.yml b/app/module/dts/bindings/sensor/maxim,max17048.yml new file mode 100644 index 00000000..786f4b86 --- /dev/null +++ b/app/module/dts/bindings/sensor/maxim,max17048.yml @@ -0,0 +1,12 @@ +# +# Copyright (c) 2022 The ZMK Contributors +# +# SPDX-License-Identifier: MIT +# + +description: > + This is a representation of the Maxim max17048 I2C Fuel Gauge. + +compatible: "maxim,max17048" + +include: [i2c-device.yaml] From 07c82836e032ee4db64098e3b0aa26295b29b989 Mon Sep 17 00:00:00 2001 From: ClicketySplit <101202583+ClicketySplit@users.noreply.github.com> Date: Thu, 28 Sep 2023 09:54:08 -0600 Subject: [PATCH 442/494] fix(shields): Leeloo-Micro set status disabled for encoders. --- app/boards/shields/leeloo_micro/leeloo_micro.dtsi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/boards/shields/leeloo_micro/leeloo_micro.dtsi b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi index afe16dfa..ab68a615 100644 --- a/app/boards/shields/leeloo_micro/leeloo_micro.dtsi +++ b/app/boards/shields/leeloo_micro/leeloo_micro.dtsi @@ -48,7 +48,8 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - steps = <120>; + status = "disabled"; + steps = <60>; }; right_encoder: right_encoder { @@ -56,7 +57,8 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - steps = <120>; + status = "disabled"; + steps = <60>; }; sensors { From 9b3d2cb99fe806db5897063e372a5ae45a58b0ec Mon Sep 17 00:00:00 2001 From: zhiayang <500236+zhiayang@users.noreply.github.com> Date: Thu, 28 Sep 2023 12:19:14 -0400 Subject: [PATCH 443/494] fix(driver): Fix broken compilation for MAX7318 driver --- app/module/drivers/gpio/gpio_max7318.c | 15 +++++++-------- app/module/dts/bindings/gpio/maxim,max7318.yaml | 3 --- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/app/module/drivers/gpio/gpio_max7318.c b/app/module/drivers/gpio/gpio_max7318.c index 04424b48..1842ce7b 100644 --- a/app/module/drivers/gpio/gpio_max7318.c +++ b/app/module/drivers/gpio/gpio_max7318.c @@ -12,16 +12,15 @@ #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define LOG_LEVEL CONFIG_GPIO_LOG_LEVEL -#include +#include LOG_MODULE_REGISTER(gpio_max7318); diff --git a/app/module/dts/bindings/gpio/maxim,max7318.yaml b/app/module/dts/bindings/gpio/maxim,max7318.yaml index 94952813..6c309768 100644 --- a/app/module/dts/bindings/gpio/maxim,max7318.yaml +++ b/app/module/dts/bindings/gpio/maxim,max7318.yaml @@ -12,9 +12,6 @@ compatible: "maxim,max7318" include: [gpio-controller.yaml, i2c-device.yaml] properties: - label: - required: true - "#gpio-cells": const: 2 From c1ebadcd2a1b7cad47c2224a4fb6130cda80b7e3 Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Fri, 29 Sep 2023 21:14:31 +0100 Subject: [PATCH 444/494] feat(hid): Add apple globe keycode * feat(hid): Add apple globe keycode * Update docs/src/data/hid.js Co-authored-by: Cem Aksoylar Co-authored-by: Pete Johanson Co-authored-by: Nick Coutsos --- app/include/dt-bindings/zmk/keys.h | 4 ++++ docs/src/data/groups.js | 1 + docs/src/data/hid.js | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/app/include/dt-bindings/zmk/keys.h b/app/include/dt-bindings/zmk/keys.h index 3e67c402..364ffa86 100644 --- a/app/include/dt-bindings/zmk/keys.h +++ b/app/include/dt-bindings/zmk/keys.h @@ -1439,3 +1439,7 @@ #define C_KEYBOARD_INPUT_ASSIST_CANCEL \ (ZMK_HID_USAGE(HID_USAGE_CONSUMER, HID_USAGE_CONSUMER_KEYBOARD_INPUT_ASSIST_CANCEL)) #define C_KBIA_CANCEL (C_KEYBOARD_INPUT_ASSIST_CANCEL) + +/* Apple Globe key */ +#define C_AC_NEXT_KEYBOARD_LAYOUT_SELECT (ZMK_HID_USAGE(HID_USAGE_CONSUMER, 0x029D)) +#define GLOBE (C_AC_NEXT_KEYBOARD_LAYOUT_SELECT) diff --git a/docs/src/data/groups.js b/docs/src/data/groups.js index 0eb15d27..5a8dc3cf 100644 --- a/docs/src/data/groups.js +++ b/docs/src/data/groups.js @@ -49,6 +49,7 @@ export default { "C_AC_DESKTOP_SHOW_ALL_WINDOWS", "C_AC_DESKTOP_SHOW_ALL_APPLICATIONS", "C_VOICE_COMMAND", + "C_AC_NEXT_KEYBOARD_LAYOUT_SELECT", ], applications: [ "C_AL_NEXT_TASK", diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index 45767172..fc61555c 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -7865,4 +7865,25 @@ export default [ }, footnotes: {}, }, + { + names: ["C_AC_NEXT_KEYBOARD_LAYOUT_SELECT", "GLOBE"], + description: "AC Next Keyboard Layout Select (Apple Globe)", + context: "Consumer AC", + clarify: true, + usages: [ + { + application: consumerApplication, + item: usage(consumerPage, 0x29d), + }, + ], + documentation: "https://usb.org/sites/default/files/hut1_2.pdf#page=153", + os: { + windows: null, + linux: null, + android: null, + macos: true, + ios: true, + }, + footnotes: {}, + }, ]; From 933e369d7cacd2680cd8c1355eb7e4a35b4e34f9 Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Mon, 29 May 2023 22:48:38 -0400 Subject: [PATCH 445/494] feat(core): Adding pre-release for keys that were already pressed. This fixes #1207 and #1076 (and maybe more?). --- app/src/hid_listener.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index 3a11101d..796ec19b 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -19,6 +19,20 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static int hid_listener_keycode_pressed(const struct zmk_keycode_state_changed *ev) { int err, explicit_mods_changed, implicit_mods_changed; + if (zmk_hid_is_pressed(ZMK_HID_USAGE(ev->usage_page, ev->keycode))) { + LOG_DBG("unregistering usage_page 0x%02X keycode 0x%02X since it was already pressed", + ev->usage_page, ev->keycode); + err = zmk_hid_release(ZMK_HID_USAGE(ev->usage_page, ev->keycode)); + if (err < 0) { + LOG_DBG("Unable to pre-release keycode (%d)", err); + return err; + } + err = zmk_endpoints_send_report(ev->usage_page); + if (err < 0) { + LOG_ERR("Failed to send key report for pre-releasing keycode (%d)", err); + } + } + LOG_DBG("usage_page 0x%02X keycode 0x%02X implicit_mods 0x%02X explicit_mods 0x%02X", ev->usage_page, ev->keycode, ev->implicit_modifiers, ev->explicit_modifiers); err = zmk_hid_press(ZMK_HID_USAGE(ev->usage_page, ev->keycode)); From dffdb2365e1ff977020a1c62967512b196edee2c Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Tue, 6 Jun 2023 20:42:52 -0400 Subject: [PATCH 446/494] test(core): Adding coverage for key pre-releasing. Added cases for the two use cases I know of: 1. Rolling with key-repeat behavior 2. Rolling symbols that have the same base key, eg `+=` --- .../tap-when-rolling/events.patterns | 2 ++ .../tap-when-rolling/keycode_events.snapshot | 9 +++++++ .../tap-when-rolling/native_posix.keymap | 13 +++++++++ .../tap-when-rolling/native_posix_64.keymap | 13 +++++++++ .../events.patterns | 4 +++ .../keycode_events.snapshot | 9 +++++++ .../native_posix_64.keymap | 27 +++++++++++++++++++ 7 files changed, 77 insertions(+) create mode 100644 app/tests/key-repeat/tap-when-rolling/events.patterns create mode 100644 app/tests/key-repeat/tap-when-rolling/keycode_events.snapshot create mode 100644 app/tests/key-repeat/tap-when-rolling/native_posix.keymap create mode 100644 app/tests/key-repeat/tap-when-rolling/native_posix_64.keymap create mode 100644 app/tests/modifiers/implicit/kp-rolling-symbols-same-key/events.patterns create mode 100644 app/tests/modifiers/implicit/kp-rolling-symbols-same-key/keycode_events.snapshot create mode 100644 app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap diff --git a/app/tests/key-repeat/tap-when-rolling/events.patterns b/app/tests/key-repeat/tap-when-rolling/events.patterns new file mode 100644 index 00000000..79471923 --- /dev/null +++ b/app/tests/key-repeat/tap-when-rolling/events.patterns @@ -0,0 +1,2 @@ +s/.*hid_listener_keycode_//p +s/.*hid_implicit_modifiers_//p \ No newline at end of file diff --git a/app/tests/key-repeat/tap-when-rolling/keycode_events.snapshot b/app/tests/key-repeat/tap-when-rolling/keycode_events.snapshot new file mode 100644 index 00000000..7d54e9de --- /dev/null +++ b/app/tests/key-repeat/tap-when-rolling/keycode_events.snapshot @@ -0,0 +1,9 @@ +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x00 +pressed: unregistering usage_page 0x07 keycode 0x04 since it was already pressed +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +press: Modifiers set to 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +release: Modifiers set to 0x00 diff --git a/app/tests/key-repeat/tap-when-rolling/native_posix.keymap b/app/tests/key-repeat/tap-when-rolling/native_posix.keymap new file mode 100644 index 00000000..bb129d14 --- /dev/null +++ b/app/tests/key-repeat/tap-when-rolling/native_posix.keymap @@ -0,0 +1,13 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + >; +}; diff --git a/app/tests/key-repeat/tap-when-rolling/native_posix_64.keymap b/app/tests/key-repeat/tap-when-rolling/native_posix_64.keymap new file mode 100644 index 00000000..a947f7ab --- /dev/null +++ b/app/tests/key-repeat/tap-when-rolling/native_posix_64.keymap @@ -0,0 +1,13 @@ +#include +#include +#include +#include "../behavior_keymap.dtsi" + +&kscan { + events = < + ZMK_MOCK_PRESS(0,1,9000) + ZMK_MOCK_PRESS(0,0,30) + ZMK_MOCK_RELEASE(0,1,30) + ZMK_MOCK_RELEASE(0,0,3000) + >; +}; diff --git a/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/events.patterns b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/events.patterns new file mode 100644 index 00000000..cbf21aff --- /dev/null +++ b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/events.patterns @@ -0,0 +1,4 @@ +s/.*hid_listener_keycode_//p +s/.*hid_register_mod/reg/p +s/.*hid_unregister_mod/unreg/p +s/.*zmk_hid_.*Modifiers set to /mods: Modifiers set to /p \ No newline at end of file diff --git a/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/keycode_events.snapshot b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/keycode_events.snapshot new file mode 100644 index 00000000..0b06bd91 --- /dev/null +++ b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/keycode_events.snapshot @@ -0,0 +1,9 @@ +pressed: usage_page 0x07 keycode 0x2E implicit_mods 0x02 explicit_mods 0x00 +mods: Modifiers set to 0x02 +pressed: unregistering usage_page 0x07 keycode 0x2E since it was already pressed +pressed: usage_page 0x07 keycode 0x2E implicit_mods 0x00 explicit_mods 0x00 +mods: Modifiers set to 0x00 +released: usage_page 0x07 keycode 0x2E implicit_mods 0x02 explicit_mods 0x00 +mods: Modifiers set to 0x00 +released: usage_page 0x07 keycode 0x2E implicit_mods 0x00 explicit_mods 0x00 +mods: Modifiers set to 0x00 diff --git a/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap new file mode 100644 index 00000000..3926eb57 --- /dev/null +++ b/app/tests/modifiers/implicit/kp-rolling-symbols-same-key/native_posix_64.keymap @@ -0,0 +1,27 @@ +#include +#include +#include + + +&kscan { + events = < + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + >; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp PLUS &kp EQUAL + &none &none + >; + }; + }; +}; From 2f05ad55ca9734f1cc890dcd659d0691ce327658 Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Sat, 16 Sep 2023 17:24:39 -0400 Subject: [PATCH 447/494] fix(core): Prevent pre-releasing explicit mods. --- app/src/hid_listener.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/hid_listener.c b/app/src/hid_listener.c index 796ec19b..2b847082 100644 --- a/app/src/hid_listener.c +++ b/app/src/hid_listener.c @@ -19,7 +19,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static int hid_listener_keycode_pressed(const struct zmk_keycode_state_changed *ev) { int err, explicit_mods_changed, implicit_mods_changed; - if (zmk_hid_is_pressed(ZMK_HID_USAGE(ev->usage_page, ev->keycode))) { + if (!is_mod(ev->usage_page, ev->keycode) && + zmk_hid_is_pressed(ZMK_HID_USAGE(ev->usage_page, ev->keycode))) { LOG_DBG("unregistering usage_page 0x%02X keycode 0x%02X since it was already pressed", ev->usage_page, ev->keycode); err = zmk_hid_release(ZMK_HID_USAGE(ev->usage_page, ev->keycode)); From 651ed05e9aab061703fb6e3736c974702310a9e1 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 14 May 2023 11:55:21 -0500 Subject: [PATCH 448/494] refactor: Split endpoint to transport and instance Changed the endpoints code to rename the existing endpoint types to "transport" and add the concept of "endpoint instances". A transport is the method by which data is sent, while instances allow describing multiple endpoints that use the same transport (e.g. bluetooth profiles) Also added new APIs to get the total number of possible endpoint instances and assign each instance a unique index, which can be used for tracking separate state for each endpoint in other code files. --- .../arm/corneish_zen/widgets/output_status.c | 33 ++- app/include/zmk/endpoints.h | 62 ++++- app/include/zmk/endpoints_types.h | 32 ++- ...selection_changed.h => endpoint_changed.h} | 6 +- app/src/behaviors/behavior_outputs.c | 6 +- app/src/display/widgets/output_status.c | 29 +-- app/src/endpoints.c | 240 +++++++++++------- app/src/events/endpoint_selection_changed.c | 4 +- 8 files changed, 278 insertions(+), 134 deletions(-) rename app/include/zmk/events/{endpoint_selection_changed.h => endpoint_changed.h} (61%) diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c index ad0c2b1a..bdf90cc3 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.c +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -14,9 +14,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include "output_status.h" #include -#include #include -#include +#include #include #include #include @@ -39,31 +38,31 @@ LV_IMG_DECLARE(USB_connected); static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct output_status_state { - enum zmk_endpoint selected_endpoint; + struct zmk_endpoint_instance selected_endpoint; bool active_profile_connected; bool active_profile_bonded; uint8_t active_profile_index; }; static struct output_status_state get_state(const zmk_event_t *_eh) { - return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), - .active_profile_connected = - zmk_ble_active_profile_is_connected(), - .active_profile_bonded = !zmk_ble_active_profile_is_open(), - .active_profile_index = zmk_ble_active_profile_index()}; + return (struct output_status_state){ + .selected_endpoint = zmk_endpoints_selected(), + .active_profile_connected = zmk_ble_active_profile_is_connected(), + .active_profile_bonded = !zmk_ble_active_profile_is_open(), + }; ; } static void set_status_symbol(lv_obj_t *icon, struct output_status_state state) { - switch (state.selected_endpoint) { - case ZMK_ENDPOINT_USB: + switch (state.selected_endpoint.transport) { + case ZMK_TRANSPORT_USB: lv_img_set_src(icon, &USB_connected); break; - case ZMK_ENDPOINT_BLE: + case ZMK_TRANSPORT_BLE: if (state.active_profile_bonded) { if (state.active_profile_connected) { // sprintf(text, LV_SYMBOL_BLUETOOTH "%i " LV_SYMBOL_OK, active_profile_index); - switch (state.active_profile_index) { + switch (state.selected_endpoint.ble.profile_index) { case 0: lv_img_set_src(icon, &bluetooth_connected_1); break; @@ -84,7 +83,7 @@ static void set_status_symbol(lv_obj_t *icon, struct output_status_state state) lv_img_set_src(icon, &bluetooth_disconnected_right); } } else { - switch (state.active_profile_index) { + switch (state.selected_endpoint.ble.profile_index) { case 0: lv_img_set_src(icon, &bluetooth_advertising_1); break; @@ -113,11 +112,9 @@ static void output_status_update_cb(struct output_status_state state) { ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, output_status_update_cb, get_state) -ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); - -#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) -ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); -#endif +ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_changed); +// We don't get an endpoint changed event when the active profile connects/disconnects +// but there wasn't another endpoint to switch from/to, so update on BLE events too. #if defined(CONFIG_ZMK_BLE) ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif diff --git a/app/include/zmk/endpoints.h b/app/include/zmk/endpoints.h index c8860533..c5964ff8 100644 --- a/app/include/zmk/endpoints.h +++ b/app/include/zmk/endpoints.h @@ -6,10 +6,66 @@ #pragma once +#include #include -int zmk_endpoints_select(enum zmk_endpoint endpoint); -int zmk_endpoints_toggle(); -enum zmk_endpoint zmk_endpoints_selected(); +/** + * Recommended length of string buffer for printing endpoint identifiers. + */ +#define ZMK_ENDPOINT_STR_LEN 10 + +#ifdef CONFIG_ZMK_USB +#define ZMK_ENDPOINT_USB_COUNT 1 +#else +#define ZMK_ENDPOINT_USB_COUNT 0 +#endif + +#ifdef CONFIG_ZMK_BLE +#define ZMK_ENDPOINT_BLE_COUNT ZMK_BLE_PROFILE_COUNT +#else +#define ZMK_ENDPOINT_BLE_COUNT 0 +#endif + +/** + * The total number of different (struct zmk_endpoint_instance) values that can + * be selected. + * + * Note that this value may change between firmware versions, so it should not + * be used in any persistent storage. + */ +#define ZMK_ENDPOINT_COUNT (ZMK_ENDPOINT_USB_COUNT + ZMK_ENDPOINT_BLE_COUNT) + +bool zmk_endpoint_instance_eq(struct zmk_endpoint_instance a, struct zmk_endpoint_instance b); + +/** + * Writes a string identifying an endpoint instance. + * + * @param str Address of output string buffer + * @param len Length of string buffer. See ZMK_ENDPOINT_STR_LEN for recommended length. + * + * @returns Number of characters written. + */ +int zmk_endpoint_instance_to_str(struct zmk_endpoint_instance endpoint, char *str, size_t len); + +/** + * Gets a unique index for an endpoint instance. This can be used together with + * ZMK_ENDPOINT_COUNT to manage separate state for each endpoint instance. + * + * Note that the index for a specific instance may change between firmware versions, + * so it should not be used in any persistent storage. + */ +int zmk_endpoint_instance_to_index(struct zmk_endpoint_instance endpoint); + +/** + * Sets the preferred endpoint transport to use. (If the preferred endpoint is + * not available, a different one may automatically be selected.) + */ +int zmk_endpoints_select_transport(enum zmk_transport transport); +int zmk_endpoints_toggle_transport(void); + +/** + * Gets the currently-selected endpoint. + */ +struct zmk_endpoint_instance zmk_endpoints_selected(void); int zmk_endpoints_send_report(uint16_t usage_page); diff --git a/app/include/zmk/endpoints_types.h b/app/include/zmk/endpoints_types.h index 70804a61..ea51c8aa 100644 --- a/app/include/zmk/endpoints_types.h +++ b/app/include/zmk/endpoints_types.h @@ -6,7 +6,33 @@ #pragma once -enum zmk_endpoint { - ZMK_ENDPOINT_USB, - ZMK_ENDPOINT_BLE, +/** + * The method by which data is sent. + */ +enum zmk_transport { + ZMK_TRANSPORT_USB, + ZMK_TRANSPORT_BLE, +}; + +/** + * Configuration to select an endpoint on ZMK_TRANSPORT_USB. + */ +struct zmk_transport_usb_data {}; + +/** + * Configuration to select an endpoint on ZMK_TRANSPORT_BLE. + */ +struct zmk_transport_ble_data { + int profile_index; +}; + +/** + * A specific endpoint to which data may be sent. + */ +struct zmk_endpoint_instance { + enum zmk_transport transport; + union { + struct zmk_transport_usb_data usb; // ZMK_TRANSPORT_USB + struct zmk_transport_ble_data ble; // ZMK_TRANSPORT_BLE + }; }; diff --git a/app/include/zmk/events/endpoint_selection_changed.h b/app/include/zmk/events/endpoint_changed.h similarity index 61% rename from app/include/zmk/events/endpoint_selection_changed.h rename to app/include/zmk/events/endpoint_changed.h index 198fe5a1..2147009b 100644 --- a/app/include/zmk/events/endpoint_selection_changed.h +++ b/app/include/zmk/events/endpoint_changed.h @@ -11,8 +11,8 @@ #include #include -struct zmk_endpoint_selection_changed { - enum zmk_endpoint endpoint; +struct zmk_endpoint_changed { + struct zmk_endpoint_instance endpoint; }; -ZMK_EVENT_DECLARE(zmk_endpoint_selection_changed); +ZMK_EVENT_DECLARE(zmk_endpoint_changed); diff --git a/app/src/behaviors/behavior_outputs.c b/app/src/behaviors/behavior_outputs.c index 7aab8ee3..6ae81a0f 100644 --- a/app/src/behaviors/behavior_outputs.c +++ b/app/src/behaviors/behavior_outputs.c @@ -24,11 +24,11 @@ static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { switch (binding->param1) { case OUT_TOG: - return zmk_endpoints_toggle(); + return zmk_endpoints_toggle_transport(); case OUT_USB: - return zmk_endpoints_select(ZMK_ENDPOINT_USB); + return zmk_endpoints_select_transport(ZMK_TRANSPORT_USB); case OUT_BLE: - return zmk_endpoints_select(ZMK_ENDPOINT_BLE); + return zmk_endpoints_select_transport(ZMK_TRANSPORT_BLE); default: LOG_ERR("Unknown output command: %d", binding->param1); } diff --git a/app/src/display/widgets/output_status.c b/app/src/display/widgets/output_status.c index 1c6da4b9..da29a95f 100644 --- a/app/src/display/widgets/output_status.c +++ b/app/src/display/widgets/output_status.c @@ -12,9 +12,8 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include -#include #include -#include +#include #include #include #include @@ -22,40 +21,38 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct output_status_state { - enum zmk_endpoint selected_endpoint; + struct zmk_endpoint_instance selected_endpoint; bool active_profile_connected; bool active_profile_bonded; - uint8_t active_profile_index; }; static struct output_status_state get_state(const zmk_event_t *_eh) { return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), .active_profile_connected = zmk_ble_active_profile_is_connected(), - .active_profile_bonded = !zmk_ble_active_profile_is_open(), - .active_profile_index = zmk_ble_active_profile_index()}; + .active_profile_bonded = !zmk_ble_active_profile_is_open()}; ; } static void set_status_symbol(lv_obj_t *label, struct output_status_state state) { char text[10] = {}; - switch (state.selected_endpoint) { - case ZMK_ENDPOINT_USB: + switch (state.selected_endpoint.transport) { + case ZMK_TRANSPORT_USB: strcat(text, LV_SYMBOL_USB); break; - case ZMK_ENDPOINT_BLE: + case ZMK_TRANSPORT_BLE: if (state.active_profile_bonded) { if (state.active_profile_connected) { snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_OK, - state.active_profile_index + 1); + state.selected_endpoint.ble.profile_index + 1); } else { snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_CLOSE, - state.active_profile_index + 1); + state.selected_endpoint.ble.profile_index + 1); } } else { snprintf(text, sizeof(text), LV_SYMBOL_WIFI " %i " LV_SYMBOL_SETTINGS, - state.active_profile_index + 1); + state.selected_endpoint.ble.profile_index + 1); } break; } @@ -70,11 +67,9 @@ static void output_status_update_cb(struct output_status_state state) { ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, output_status_update_cb, get_state) -ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); - -#if IS_ENABLED(CONFIG_USB_DEVICE_STACK) -ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); -#endif +ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_changed); +// We don't get an endpoint changed event when the active profile connects/disconnects +// but there wasn't another endpoint to switch from/to, so update on BLE events too. #if defined(CONFIG_ZMK_BLE) ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed); #endif diff --git a/app/src/endpoints.c b/app/src/endpoints.c index dbd1a3e6..e208a36a 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -16,29 +16,29 @@ #include #include #include -#include +#include #include LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -#define DEFAULT_ENDPOINT \ - COND_CODE_1(IS_ENABLED(CONFIG_ZMK_BLE), (ZMK_ENDPOINT_BLE), (ZMK_ENDPOINT_USB)) +#define DEFAULT_TRANSPORT \ + COND_CODE_1(IS_ENABLED(CONFIG_ZMK_BLE), (ZMK_TRANSPORT_BLE), (ZMK_TRANSPORT_USB)) -static enum zmk_endpoint current_endpoint = DEFAULT_ENDPOINT; -static enum zmk_endpoint preferred_endpoint = - ZMK_ENDPOINT_USB; /* Used if multiple endpoints are ready */ +static struct zmk_endpoint_instance current_instance = {}; +static enum zmk_transport preferred_transport = + ZMK_TRANSPORT_USB; /* Used if multiple endpoints are ready */ -static void update_current_endpoint(); +static void update_current_endpoint(void); #if IS_ENABLED(CONFIG_SETTINGS) static void endpoints_save_preferred_work(struct k_work *work) { - settings_save_one("endpoints/preferred", &preferred_endpoint, sizeof(preferred_endpoint)); + settings_save_one("endpoints/preferred", &preferred_transport, sizeof(preferred_transport)); } static struct k_work_delayable endpoints_save_work; #endif -static int endpoints_save_preferred() { +static int endpoints_save_preferred(void) { #if IS_ENABLED(CONFIG_SETTINGS) return k_work_reschedule(&endpoints_save_work, K_MSEC(CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE)); #else @@ -46,14 +46,60 @@ static int endpoints_save_preferred() { #endif } -int zmk_endpoints_select(enum zmk_endpoint endpoint) { - LOG_DBG("Selected endpoint %d", endpoint); +bool zmk_endpoint_instance_eq(struct zmk_endpoint_instance a, struct zmk_endpoint_instance b) { + if (a.transport != b.transport) { + return false; + } - if (preferred_endpoint == endpoint) { + switch (a.transport) { + case ZMK_TRANSPORT_USB: + return true; + + case ZMK_TRANSPORT_BLE: + return a.ble.profile_index == b.ble.profile_index; + } + + LOG_ERR("Invalid transport %d", a.transport); + return false; +} + +int zmk_endpoint_instance_to_str(struct zmk_endpoint_instance endpoint, char *str, size_t len) { + switch (endpoint.transport) { + case ZMK_TRANSPORT_USB: + return snprintf(str, len, "USB"); + + case ZMK_TRANSPORT_BLE: + return snprintf(str, len, "BLE:%d", endpoint.ble.profile_index); + + default: + return snprintf(str, len, "Invalid"); + } +} + +#define INSTANCE_INDEX_OFFSET_USB 0 +#define INSTANCE_INDEX_OFFSET_BLE ZMK_ENDPOINT_USB_COUNT + +int zmk_endpoint_instance_to_index(struct zmk_endpoint_instance endpoint) { + switch (endpoint.transport) { + case ZMK_TRANSPORT_USB: + return INSTANCE_INDEX_OFFSET_USB; + + case ZMK_TRANSPORT_BLE: + return INSTANCE_INDEX_OFFSET_BLE + endpoint.ble.profile_index; + } + + LOG_ERR("Invalid transport %d", endpoint.transport); + return 0; +} + +int zmk_endpoints_select_transport(enum zmk_transport transport) { + LOG_DBG("Selected endpoint transport %d", transport); + + if (preferred_transport == transport) { return 0; } - preferred_endpoint = endpoint; + preferred_transport = transport; endpoints_save_preferred(); @@ -62,20 +108,22 @@ int zmk_endpoints_select(enum zmk_endpoint endpoint) { return 0; } -enum zmk_endpoint zmk_endpoints_selected() { return current_endpoint; } - -int zmk_endpoints_toggle() { - enum zmk_endpoint new_endpoint = - (preferred_endpoint == ZMK_ENDPOINT_USB) ? ZMK_ENDPOINT_BLE : ZMK_ENDPOINT_USB; - return zmk_endpoints_select(new_endpoint); +int zmk_endpoints_toggle_transport(void) { + enum zmk_transport new_transport = + (preferred_transport == ZMK_TRANSPORT_USB) ? ZMK_TRANSPORT_BLE : ZMK_TRANSPORT_USB; + return zmk_endpoints_select_transport(new_transport); } -static int send_keyboard_report() { +struct zmk_endpoint_instance zmk_endpoints_selected(void) { + return current_instance; +} + +static int send_keyboard_report(void) { struct zmk_hid_keyboard_report *keyboard_report = zmk_hid_get_keyboard_report(); - switch (current_endpoint) { + switch (current_instance.transport) { #if IS_ENABLED(CONFIG_ZMK_USB) - case ZMK_ENDPOINT_USB: { + case ZMK_TRANSPORT_USB: { int err = zmk_usb_hid_send_report((uint8_t *)keyboard_report, sizeof(*keyboard_report)); if (err) { LOG_ERR("FAILED TO SEND OVER USB: %d", err); @@ -85,7 +133,7 @@ static int send_keyboard_report() { #endif /* IS_ENABLED(CONFIG_ZMK_USB) */ #if IS_ENABLED(CONFIG_ZMK_BLE) - case ZMK_ENDPOINT_BLE: { + case ZMK_TRANSPORT_BLE: { int err = zmk_hog_send_keyboard_report(&keyboard_report->body); if (err) { LOG_ERR("FAILED TO SEND OVER HOG: %d", err); @@ -93,19 +141,18 @@ static int send_keyboard_report() { return err; } #endif /* IS_ENABLED(CONFIG_ZMK_BLE) */ - - default: - LOG_ERR("Unsupported endpoint %d", current_endpoint); - return -ENOTSUP; } + + LOG_ERR("Unsupported endpoint transport %d", current_instance.transport); + return -ENOTSUP; } -static int send_consumer_report() { +static int send_consumer_report(void) { struct zmk_hid_consumer_report *consumer_report = zmk_hid_get_consumer_report(); - switch (current_endpoint) { + switch (current_instance.transport) { #if IS_ENABLED(CONFIG_ZMK_USB) - case ZMK_ENDPOINT_USB: { + case ZMK_TRANSPORT_USB: { int err = zmk_usb_hid_send_report((uint8_t *)consumer_report, sizeof(*consumer_report)); if (err) { LOG_ERR("FAILED TO SEND OVER USB: %d", err); @@ -115,7 +162,7 @@ static int send_consumer_report() { #endif /* IS_ENABLED(CONFIG_ZMK_USB) */ #if IS_ENABLED(CONFIG_ZMK_BLE) - case ZMK_ENDPOINT_BLE: { + case ZMK_TRANSPORT_BLE: { int err = zmk_hog_send_consumer_report(&consumer_report->body); if (err) { LOG_ERR("FAILED TO SEND OVER HOG: %d", err); @@ -123,11 +170,10 @@ static int send_consumer_report() { return err; } #endif /* IS_ENABLED(CONFIG_ZMK_BLE) */ - - default: - LOG_ERR("Unsupported endpoint %d", current_endpoint); - return -ENOTSUP; } + + LOG_ERR("Unsupported endpoint transport %d", current_instance.transport); + return -ENOTSUP; } int zmk_endpoints_send_report(uint16_t usage_page) { @@ -136,12 +182,13 @@ int zmk_endpoints_send_report(uint16_t usage_page) { switch (usage_page) { case HID_USAGE_KEY: return send_keyboard_report(); + case HID_USAGE_CONSUMER: return send_consumer_report(); - default: - LOG_ERR("Unsupported usage page %d", usage_page); - return -ENOTSUP; } + + LOG_ERR("Unsupported usage page %d", usage_page); + return -ENOTSUP; } #if IS_ENABLED(CONFIG_SETTINGS) @@ -151,12 +198,12 @@ static int endpoints_handle_set(const char *name, size_t len, settings_read_cb r LOG_DBG("Setting endpoint value %s", name); if (settings_name_steq(name, "preferred", NULL)) { - if (len != sizeof(enum zmk_endpoint)) { - LOG_ERR("Invalid endpoint size (got %d expected %d)", len, sizeof(enum zmk_endpoint)); + if (len != sizeof(enum zmk_transport)) { + LOG_ERR("Invalid endpoint size (got %d expected %d)", len, sizeof(enum zmk_transport)); return -EINVAL; } - int err = read_cb(cb_arg, &preferred_endpoint, sizeof(enum zmk_endpoint)); + int err = read_cb(cb_arg, &preferred_transport, sizeof(enum zmk_transport)); if (err <= 0) { LOG_ERR("Failed to read preferred endpoint from settings (err %d)", err); return err; @@ -171,6 +218,60 @@ static int endpoints_handle_set(const char *name, size_t len, settings_read_cb r struct settings_handler endpoints_handler = {.name = "endpoints", .h_set = endpoints_handle_set}; #endif /* IS_ENABLED(CONFIG_SETTINGS) */ +static bool is_usb_ready(void) { +#if IS_ENABLED(CONFIG_ZMK_USB) + return zmk_usb_is_hid_ready(); +#else + return false; +#endif +} + +static bool is_ble_ready(void) { +#if IS_ENABLED(CONFIG_ZMK_BLE) + return zmk_ble_active_profile_is_connected(); +#else + return false; +#endif +} + +static enum zmk_transport get_selected_transport(void) { + if (is_ble_ready()) { + if (is_usb_ready()) { + LOG_DBG("Both endpoint transports are ready. Using %d", preferred_transport); + return preferred_transport; + } + + LOG_DBG("Only BLE is ready."); + return ZMK_TRANSPORT_BLE; + } + + if (is_usb_ready()) { + LOG_DBG("Only USB is ready."); + return ZMK_TRANSPORT_USB; + } + + LOG_DBG("No endpoint transports are ready."); + return DEFAULT_TRANSPORT; +} + +static struct zmk_endpoint_instance get_selected_instance(void) { + struct zmk_endpoint_instance instance = {.transport = get_selected_transport()}; + + switch (instance.transport) { +#if IS_ENABLED(CONFIG_ZMK_BLE) + case ZMK_TRANSPORT_BLE: + instance.ble.profile_index = zmk_ble_active_profile_index(); + break; +#endif // IS_ENABLED(CONFIG_ZMK_BLE) + + default: + // No extra data for this transport. + break; + } + + return instance; +} + static int zmk_endpoints_init(const struct device *_arg) { #if IS_ENABLED(CONFIG_SETTINGS) settings_subsys_init(); @@ -186,45 +287,11 @@ static int zmk_endpoints_init(const struct device *_arg) { settings_load_subtree("endpoints"); #endif + current_instance = get_selected_instance(); + return 0; } -static bool is_usb_ready() { -#if IS_ENABLED(CONFIG_ZMK_USB) - return zmk_usb_is_hid_ready(); -#else - return false; -#endif -} - -static bool is_ble_ready() { -#if IS_ENABLED(CONFIG_ZMK_BLE) - return zmk_ble_active_profile_is_connected(); -#else - return false; -#endif -} - -static enum zmk_endpoint get_selected_endpoint() { - if (is_ble_ready()) { - if (is_usb_ready()) { - LOG_DBG("Both endpoints are ready. Using %d", preferred_endpoint); - return preferred_endpoint; - } - - LOG_DBG("Only BLE is ready."); - return ZMK_ENDPOINT_BLE; - } - - if (is_usb_ready()) { - LOG_DBG("Only USB is ready."); - return ZMK_ENDPOINT_USB; - } - - LOG_DBG("No endpoints are ready."); - return DEFAULT_ENDPOINT; -} - static void disconnect_current_endpoint() { zmk_hid_keyboard_clear(); zmk_hid_consumer_clear(); @@ -233,18 +300,21 @@ static void disconnect_current_endpoint() { zmk_endpoints_send_report(HID_USAGE_CONSUMER); } -static void update_current_endpoint() { - enum zmk_endpoint new_endpoint = get_selected_endpoint(); +static void update_current_endpoint(void) { + struct zmk_endpoint_instance new_instance = get_selected_instance(); - if (new_endpoint != current_endpoint) { - /* Cancel all current keypresses so keys don't stay held on the old endpoint. */ + if (!zmk_endpoint_instance_eq(new_instance, current_instance)) { + // Cancel all current keypresses so keys don't stay held on the old endpoint. disconnect_current_endpoint(); - current_endpoint = new_endpoint; - LOG_INF("Endpoint changed: %d", current_endpoint); + current_instance = new_instance; - ZMK_EVENT_RAISE(new_zmk_endpoint_selection_changed( - (struct zmk_endpoint_selection_changed){.endpoint = current_endpoint})); + char endpoint_str[ZMK_ENDPOINT_STR_LEN]; + zmk_endpoint_instance_to_str(current_instance, endpoint_str, sizeof(endpoint_str)); + LOG_INF("Endpoint changed: %s", endpoint_str); + + ZMK_EVENT_RAISE( + new_zmk_endpoint_changed((struct zmk_endpoint_changed){.endpoint = current_instance})); } } diff --git a/app/src/events/endpoint_selection_changed.c b/app/src/events/endpoint_selection_changed.c index 34bc39dd..6b152156 100644 --- a/app/src/events/endpoint_selection_changed.c +++ b/app/src/events/endpoint_selection_changed.c @@ -5,6 +5,6 @@ */ #include -#include +#include -ZMK_EVENT_IMPL(zmk_endpoint_selection_changed); +ZMK_EVENT_IMPL(zmk_endpoint_changed); From b17d896c5c30dbb038de36e7ed540318f9b048a1 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 27 Aug 2023 18:03:06 -0500 Subject: [PATCH 449/494] fix: Address review comments --- app/CMakeLists.txt | 2 +- app/boards/arm/corneish_zen/widgets/output_status.c | 2 -- app/src/endpoints.c | 2 ++ .../events/{endpoint_selection_changed.c => endpoint_changed.c} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename app/src/events/{endpoint_selection_changed.c => endpoint_changed.c} (100%) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 29944753..793f386d 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -59,7 +59,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/behavior_queue.c) target_sources(app PRIVATE src/conditional_layer.c) target_sources(app PRIVATE src/endpoints.c) - target_sources(app PRIVATE src/events/endpoint_selection_changed.c) + target_sources(app PRIVATE src/events/endpoint_changed.c) target_sources(app PRIVATE src/hid_listener.c) target_sources(app PRIVATE src/keymap.c) target_sources(app PRIVATE src/events/layer_state_changed.c) diff --git a/app/boards/arm/corneish_zen/widgets/output_status.c b/app/boards/arm/corneish_zen/widgets/output_status.c index bdf90cc3..8e9457eb 100644 --- a/app/boards/arm/corneish_zen/widgets/output_status.c +++ b/app/boards/arm/corneish_zen/widgets/output_status.c @@ -41,7 +41,6 @@ struct output_status_state { struct zmk_endpoint_instance selected_endpoint; bool active_profile_connected; bool active_profile_bonded; - uint8_t active_profile_index; }; static struct output_status_state get_state(const zmk_event_t *_eh) { @@ -50,7 +49,6 @@ static struct output_status_state get_state(const zmk_event_t *_eh) { .active_profile_connected = zmk_ble_active_profile_is_connected(), .active_profile_bonded = !zmk_ble_active_profile_is_open(), }; - ; } static void set_status_symbol(lv_obj_t *icon, struct output_status_state state) { diff --git a/app/src/endpoints.c b/app/src/endpoints.c index e208a36a..138e790f 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -7,6 +7,8 @@ #include #include +#include + #include #include #include diff --git a/app/src/events/endpoint_selection_changed.c b/app/src/events/endpoint_changed.c similarity index 100% rename from app/src/events/endpoint_selection_changed.c rename to app/src/events/endpoint_changed.c From 6a3cc914fcc0ecc01f33f81413080b882c3022c5 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 27 Aug 2023 18:33:29 -0500 Subject: [PATCH 450/494] fix: Fix nice_view display widgets --- .../nice_view/widgets/peripheral_status.c | 8 +- app/boards/shields/nice_view/widgets/status.c | 76 +++++++++---------- app/boards/shields/nice_view/widgets/util.c | 6 +- app/boards/shields/nice_view/widgets/util.h | 5 +- 4 files changed, 46 insertions(+), 49 deletions(-) diff --git a/app/boards/shields/nice_view/widgets/peripheral_status.c b/app/boards/shields/nice_view/widgets/peripheral_status.c index 85c2a1d8..4c0c2263 100644 --- a/app/boards/shields/nice_view/widgets/peripheral_status.c +++ b/app/boards/shields/nice_view/widgets/peripheral_status.c @@ -31,7 +31,7 @@ struct peripheral_status_state { bool connected; }; -static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { +static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { lv_obj_t *canvas = lv_obj_get_child(widget, 0); lv_draw_label_dsc_t label_dsc; @@ -47,7 +47,7 @@ static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state st // Draw output status lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, - state.connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); + state->connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE); // Rotate canvas rotate_canvas(canvas, cbuf); @@ -61,7 +61,7 @@ static void set_battery_status(struct zmk_widget_status *widget, widget->state.battery = state.level; - draw_top(widget->obj, widget->cbuf, widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); } static void battery_status_update_cb(struct battery_status_state state) { @@ -94,7 +94,7 @@ static void set_connection_status(struct zmk_widget_status *widget, struct peripheral_status_state state) { widget->state.connected = state.connected; - draw_top(widget->obj, widget->cbuf, widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); } static void output_status_update_cb(struct peripheral_status_state state) { diff --git a/app/boards/shields/nice_view/widgets/status.c b/app/boards/shields/nice_view/widgets/status.c index 1ad9e920..c629be50 100644 --- a/app/boards/shields/nice_view/widgets/status.c +++ b/app/boards/shields/nice_view/widgets/status.c @@ -17,7 +17,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include #include #include -#include +#include #include #include #include @@ -29,10 +29,9 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct output_status_state { - enum zmk_endpoint selected_endpoint; + struct zmk_endpoint_instance selected_endpoint; bool active_profile_connected; bool active_profile_bonded; - uint8_t active_profile_index; }; struct layer_status_state { @@ -44,7 +43,7 @@ struct wpm_status_state { uint8_t wpm; }; -static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { +static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { lv_obj_t *canvas = lv_obj_get_child(widget, 0); lv_draw_label_dsc_t label_dsc; @@ -67,13 +66,13 @@ static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state st // Draw output status char output_text[10] = {}; - switch (state.selected_endpoint) { - case ZMK_ENDPOINT_USB: + switch (state->selected_endpoint.transport) { + case ZMK_TRANSPORT_USB: strcat(output_text, LV_SYMBOL_USB); break; - case ZMK_ENDPOINT_BLE: - if (state.active_profile_bonded) { - if (state.active_profile_connected) { + case ZMK_TRANSPORT_BLE: + if (state->active_profile_bonded) { + if (state->active_profile_connected) { strcat(output_text, LV_SYMBOL_WIFI); } else { strcat(output_text, LV_SYMBOL_CLOSE); @@ -91,18 +90,18 @@ static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state st lv_canvas_draw_rect(canvas, 1, 22, 66, 40, &rect_black_dsc); char wpm_text[6] = {}; - snprintf(wpm_text, sizeof(wpm_text), "%d", state.wpm[9]); + snprintf(wpm_text, sizeof(wpm_text), "%d", state->wpm[9]); lv_canvas_draw_text(canvas, 42, 52, 24, &label_dsc_wpm, wpm_text); int max = 0; int min = 256; for (int i = 0; i < 10; i++) { - if (state.wpm[i] > max) { - max = state.wpm[i]; + if (state->wpm[i] > max) { + max = state->wpm[i]; } - if (state.wpm[i] < min) { - min = state.wpm[i]; + if (state->wpm[i] < min) { + min = state->wpm[i]; } } @@ -114,7 +113,7 @@ static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state st lv_point_t points[10]; for (int i = 0; i < 10; i++) { points[i].x = 2 + i * 7; - points[i].y = 60 - (state.wpm[i] - min) * 36 / range; + points[i].y = 60 - (state->wpm[i] - min) * 36 / range; } lv_canvas_draw_line(canvas, points, 10, &line_dsc); @@ -122,7 +121,7 @@ static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state st rotate_canvas(canvas, cbuf); } -static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { +static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { lv_obj_t *canvas = lv_obj_get_child(widget, 1); lv_draw_rect_dsc_t rect_black_dsc; @@ -147,7 +146,7 @@ static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], struct status_state }; for (int i = 0; i < 5; i++) { - bool selected = state.active_profile_index == i; + bool selected = state->selected_endpoint.ble.profile_index == i; lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 359, &arc_dsc); @@ -167,7 +166,7 @@ static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], struct status_state rotate_canvas(canvas, cbuf); } -static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) { +static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], const struct status_state *state) { lv_obj_t *canvas = lv_obj_get_child(widget, 2); lv_draw_rect_dsc_t rect_black_dsc; @@ -179,14 +178,14 @@ static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], struct status_state lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc); // Draw layer - if (state.layer_label == NULL) { + if (state->layer_label == NULL) { char text[9] = {}; - sprintf(text, "LAYER %i", state.layer_index); + sprintf(text, "LAYER %i", state->layer_index); lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text); } else { - lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state.layer_label); + lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state->layer_label); } // Rotate canvas @@ -201,7 +200,7 @@ static void set_battery_status(struct zmk_widget_status *widget, widget->state.battery = state.level; - draw_top(widget->obj, widget->cbuf, widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); } static void battery_status_update_cb(struct battery_status_state state) { @@ -226,33 +225,32 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed); ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); #endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */ -static void set_output_status(struct zmk_widget_status *widget, struct output_status_state state) { - widget->state.selected_endpoint = state.selected_endpoint; - widget->state.active_profile_connected = state.active_profile_connected; - widget->state.active_profile_bonded = state.active_profile_bonded; - widget->state.active_profile_index = state.active_profile_index; +static void set_output_status(struct zmk_widget_status *widget, + const struct output_status_state *state) { + widget->state.selected_endpoint = state->selected_endpoint; + widget->state.active_profile_connected = state->active_profile_connected; + widget->state.active_profile_bonded = state->active_profile_bonded; - draw_top(widget->obj, widget->cbuf, widget->state); - draw_middle(widget->obj, widget->cbuf2, widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); + draw_middle(widget->obj, widget->cbuf2, &widget->state); } static void output_status_update_cb(struct output_status_state state) { struct zmk_widget_status *widget; - SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_output_status(widget, state); } + SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_output_status(widget, &state); } } static struct output_status_state output_status_get_state(const zmk_event_t *_eh) { - return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(), - .active_profile_connected = - zmk_ble_active_profile_is_connected(), - .active_profile_bonded = !zmk_ble_active_profile_is_open(), - .active_profile_index = zmk_ble_active_profile_index()}; - ; + return (struct output_status_state){ + .selected_endpoint = zmk_endpoints_selected(), + .active_profile_connected = zmk_ble_active_profile_is_connected(), + .active_profile_bonded = !zmk_ble_active_profile_is_open(), + }; } ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state, output_status_update_cb, output_status_get_state) -ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed); +ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_changed); #if IS_ENABLED(CONFIG_USB_DEVICE_STACK) ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed); @@ -265,7 +263,7 @@ static void set_layer_status(struct zmk_widget_status *widget, struct layer_stat widget->state.layer_index = state.index; widget->state.layer_label = state.label; - draw_bottom(widget->obj, widget->cbuf3, widget->state); + draw_bottom(widget->obj, widget->cbuf3, &widget->state); } static void layer_status_update_cb(struct layer_status_state state) { @@ -289,7 +287,7 @@ static void set_wpm_status(struct zmk_widget_status *widget, struct wpm_status_s } widget->state.wpm[9] = state.wpm; - draw_top(widget->obj, widget->cbuf, widget->state); + draw_top(widget->obj, widget->cbuf, &widget->state); } static void wpm_status_update_cb(struct wpm_status_state state) { diff --git a/app/boards/shields/nice_view/widgets/util.c b/app/boards/shields/nice_view/widgets/util.c index 9655f837..b4915ab7 100644 --- a/app/boards/shields/nice_view/widgets/util.c +++ b/app/boards/shields/nice_view/widgets/util.c @@ -24,7 +24,7 @@ void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]) { CANVAS_SIZE / 2, true); } -void draw_battery(lv_obj_t *canvas, struct status_state state) { +void draw_battery(lv_obj_t *canvas, const struct status_state *state) { lv_draw_rect_dsc_t rect_black_dsc; init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND); lv_draw_rect_dsc_t rect_white_dsc; @@ -32,11 +32,11 @@ void draw_battery(lv_obj_t *canvas, struct status_state state) { lv_canvas_draw_rect(canvas, 0, 2, 29, 12, &rect_white_dsc); lv_canvas_draw_rect(canvas, 1, 3, 27, 10, &rect_black_dsc); - lv_canvas_draw_rect(canvas, 2, 4, (state.battery + 2) / 4, 8, &rect_white_dsc); + lv_canvas_draw_rect(canvas, 2, 4, (state->battery + 2) / 4, 8, &rect_white_dsc); lv_canvas_draw_rect(canvas, 30, 5, 3, 6, &rect_white_dsc); lv_canvas_draw_rect(canvas, 31, 6, 1, 4, &rect_black_dsc); - if (state.charging) { + if (state->charging) { lv_draw_img_dsc_t img_dsc; lv_draw_img_dsc_init(&img_dsc); lv_canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc); diff --git a/app/boards/shields/nice_view/widgets/util.h b/app/boards/shields/nice_view/widgets/util.h index e48c1082..e2d2782a 100644 --- a/app/boards/shields/nice_view/widgets/util.h +++ b/app/boards/shields/nice_view/widgets/util.h @@ -19,10 +19,9 @@ struct status_state { uint8_t battery; bool charging; #if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) - enum zmk_endpoint selected_endpoint; + struct zmk_endpoint_instance selected_endpoint; bool active_profile_connected; bool active_profile_bonded; - uint8_t active_profile_index; uint8_t layer_index; const char *layer_label; uint8_t wpm[10]; @@ -39,7 +38,7 @@ struct battery_status_state { }; void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]); -void draw_battery(lv_obj_t *canvas, struct status_state state); +void draw_battery(lv_obj_t *canvas, const struct status_state *state); void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font, lv_text_align_t align); void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color); From aa4cb143bf2de89f06039fd9ba0b259f6d38fc5d Mon Sep 17 00:00:00 2001 From: Flo Kempenich Date: Tue, 3 Oct 2023 09:03:59 +0100 Subject: [PATCH 451/494] fix(combos)Fix bug with overlapping combos timeouts (#1945) * Fix bug with overlapping combos timeouts * Fix trailing whitespace * Fix log format --- app/src/combo.c | 26 +++-- .../events.patterns | 1 + .../keycode_events.snapshot | 8 ++ .../native_posix_64.keymap | 98 +++++++++++++++++++ 4 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns create mode 100644 app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot create mode 100644 app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap diff --git a/app/src/combo.c b/app/src/combo.c index 90c89c15..87a93143 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -204,22 +204,34 @@ static inline bool candidate_is_completely_pressed(struct combo_cfg *candidate) static int cleanup(); static int filter_timed_out_candidates(int64_t timestamp) { - int num_candidates = 0; + int remaining_candidates = 0; for (int i = 0; i < CONFIG_ZMK_COMBO_MAX_COMBOS_PER_KEY; i++) { struct combo_candidate *candidate = &candidates[i]; if (candidate->combo == NULL) { break; } if (candidate->timeout_at > timestamp) { - // reorder candidates so they're contiguous - candidates[num_candidates].combo = candidate->combo; - candidates[num_candidates].timeout_at = candidate->timeout_at; - num_candidates++; + bool need_to_bubble_up = remaining_candidates != i; + if (need_to_bubble_up) { + // bubble up => reorder candidates so they're contiguous + candidates[remaining_candidates].combo = candidate->combo; + candidates[remaining_candidates].timeout_at = candidate->timeout_at; + // clear the previous location + candidates[i].combo = NULL; + candidates[i].timeout_at = 0; + } + + remaining_candidates++; } else { candidate->combo = NULL; } } - return num_candidates; + + LOG_DBG( + "after filtering out timed out combo candidates: remaining_candidates=%d timestamp=%lld", + remaining_candidates, timestamp); + + return remaining_candidates; } static int clear_candidates() { @@ -449,7 +461,7 @@ static void combo_timeout_handler(struct k_work *item) { // timer was cancelled or rescheduled. return; } - if (filter_timed_out_candidates(timeout_task_timeout_at) < 2) { + if (filter_timed_out_candidates(timeout_task_timeout_at) == 0) { cleanup(); } update_timeout_task(); diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns b/app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns new file mode 100644 index 00000000..89015dee --- /dev/null +++ b/app/tests/combo/overlapping-combos-4-different-timeouts/events.patterns @@ -0,0 +1 @@ +s/.*\(hid_listener_keycode_pressed\|filter_timed_out_candidates\): //p \ No newline at end of file diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot b/app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot new file mode 100644 index 00000000..8fe441ff --- /dev/null +++ b/app/tests/combo/overlapping-combos-4-different-timeouts/keycode_events.snapshot @@ -0,0 +1,8 @@ +after filtering out timed out combo candidates: remaining_candidates=2 timestamp=71 +after filtering out timed out combo candidates: remaining_candidates=1 timestamp=81 +after filtering out timed out combo candidates: remaining_candidates=0 timestamp=91 +usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +after filtering out timed out combo candidates: remaining_candidates=2 timestamp=143 +after filtering out timed out combo candidates: remaining_candidates=1 timestamp=153 +after filtering out timed out combo candidates: remaining_candidates=1 timestamp=159 +usage_page 0x07 keycode 0x1D implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap b/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap new file mode 100644 index 00000000..89672079 --- /dev/null +++ b/app/tests/combo/overlapping-combos-4-different-timeouts/native_posix_64.keymap @@ -0,0 +1,98 @@ +#include +#include +#include + +#define kA 0 +#define kB 1 +#define kC 2 +#define kD 3 + +/ { + combos { + compatible = "zmk,combos"; + + // Intentionally out of order in the config, to make sure 'combo.c' handles it properly + combo_40 { + timeout-ms = <40>; + key-positions = ; + bindings = <&kp Z>; + }; + combo_20 { + timeout-ms = <20>; + key-positions = ; + bindings = <&kp X>; + }; + combo_30 { + timeout-ms = <30>; + key-positions = ; + bindings = <&kp Y>; + }; + + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; +}; + +#define press_A_and_wait(delay_next) \ + ZMK_MOCK_PRESS(0,0,delay_next) +#define press_B_and_wait(delay_next) \ + ZMK_MOCK_PRESS(0,1,delay_next) +#define press_C_and_wait(delay_next) \ + ZMK_MOCK_PRESS(1,0,delay_next) +#define press_D_and_wait(delay_next) \ + ZMK_MOCK_PRESS(1,1,delay_next) + +#define release_A_and_wait(delay_next) \ + ZMK_MOCK_RELEASE(0,0,delay_next) +#define release_D_and_wait(delay_next) \ + ZMK_MOCK_RELEASE(1,1,delay_next) + +&kscan { + events = < + /* Note: This starts at T+50 because the ZMK_MOCK_PRESS seems to launch the first event at T+(first wait duration). So in our case T+50 */ + + + + /*** First Phase: All 3 combos expire ***/ + + /* T+50+0= T+50: Press A and wait 50ms */ + press_A_and_wait(50) + + /* T+50+20= T+70: 'combo_20' should expire */ + /* T+50+30= T+80: 'combo_30' should expire */ + /* T+50+40= T+90: 'combo_40' should expire, and we should send the keycode 'A' */ + + /* T+50+50= T+100: We release A and wait 20ms */ + release_A_and_wait(20) + + + + /*** Second Phase: 2 combo expire, 1 combo triggers ***/ + + /* T+120+0= T+120: Press A and wait 35ms */ + press_A_and_wait(35) + + /* T+120+20= T+140: 'combo_20' should expire */ + /* T+120+30= T+150: 'combo_30' should expire */ + + /* T+120+35= T+155: We press 'D', this should trigger 'combo_40' and send the keycode 'Z'. We wait 15ms */ + press_D_and_wait(15) + + + + /*** Cleanup ***/ + /* T+120+50= T+170: We release both keys */ + release_A_and_wait(20) + release_D_and_wait(0) + >; +}; \ No newline at end of file From 2f6abff3bcb4f157d7b0d8eaa53faf2afebe7878 Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Sat, 16 Jul 2022 21:51:25 -0700 Subject: [PATCH 452/494] refactor(behaviors): Giving global-quick-tap its own term Detaching the global-quick-tap functionality from the quick-tap term. This makes way for two improvements: 1. This functionality can be added to combos under a unified name 'global-quick-tap-ms'. 2. This allows users to set a lower term for the 'global-quick-tap' (typically ~100ms), and a higher term for the regular quick-tap (typically ~200ms) This deprecates the global-quick-tap option, however if it is set, the quick-tap-ms value will be copied to global-quick-tap-ms. --- .../behaviors/zmk,behavior-hold-tap.yaml | 5 ++++- app/src/behaviors/behavior_hold_tap.c | 17 +++++++++++------ .../1-basic/native_posix_64.keymap | 2 +- .../8-global-quick-tap/behavior_keymap.dtsi | 2 +- .../1-basic/native_posix_64.keymap | 2 +- .../8-global-quick-tap/behavior_keymap.dtsi | 2 +- .../1-basic/native_posix_64.keymap | 2 +- .../2-double-hold/native_posix_64.keymap | 2 +- .../8-global-quick-tap/behavior_keymap.dtsi | 2 +- .../1-basic/native_posix_64.keymap | 2 +- .../6-global-quick-tap/behavior_keymap.dtsi | 2 +- 11 files changed, 24 insertions(+), 16 deletions(-) diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index a2affbf2..cca0e969 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -20,8 +20,11 @@ properties: default: -1 quick_tap_ms: # deprecated type: int - global-quick-tap: + global-quick-tap: # deprecated type: boolean + global-quick-tap-ms: + type: int + default: -1 flavor: type: string required: false diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 30350ef2..1f172e44 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -57,7 +57,7 @@ struct behavior_hold_tap_config { char *hold_behavior_dev; char *tap_behavior_dev; int quick_tap_ms; - bool global_quick_tap; + int global_quick_tap_ms; enum flavor flavor; bool retro_tap; bool hold_trigger_on_release; @@ -97,7 +97,9 @@ struct last_tapped { int64_t timestamp; }; -struct last_tapped last_tapped = {INT32_MIN, INT64_MIN}; +// Set time stamp to large negative number initially for test suites, but not +// int64 min since it will overflow if -1 is added +struct last_tapped last_tapped = {INT32_MIN, INT32_MIN}; static void store_last_tapped(int64_t timestamp) { if (timestamp > last_tapped.timestamp) { @@ -112,10 +114,11 @@ static void store_last_hold_tapped(struct active_hold_tap *hold_tap) { } static bool is_quick_tap(struct active_hold_tap *hold_tap) { - if (hold_tap->config->global_quick_tap || last_tapped.position == hold_tap->position) { - return (last_tapped.timestamp + hold_tap->config->quick_tap_ms) > hold_tap->timestamp; + if ((last_tapped.timestamp + hold_tap->config->global_quick_tap_ms) > hold_tap->timestamp) { + return true; } else { - return false; + return (last_tapped.position == hold_tap->position) && + (last_tapped.timestamp + hold_tap->config->quick_tap_ms) > hold_tap->timestamp; } } @@ -703,7 +706,9 @@ static int behavior_hold_tap_init(const struct device *dev) { .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ - .global_quick_tap = DT_INST_PROP(n, global_quick_tap), \ + .global_quick_tap_ms = DT_INST_PROP(n, global_quick_tap) \ + ? DT_INST_PROP(n, quick_tap_ms) \ + : DT_INST_PROP(n, global_quick_tap_ms), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ .hold_trigger_on_release = DT_INST_PROP(n, hold_trigger_on_release), \ diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap index 5af001f6..cdbe51bf 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < /* tap */ ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,250) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi index ef8efd43..8fa363a2 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi @@ -11,8 +11,8 @@ flavor = "balanced"; tapping-term-ms = <300>; quick-tap-ms = <300>; + global-quick-tap-ms = <100>; bindings = <&kp>, <&kp>; - global-quick-tap; }; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index e28eb4c3..a7ba7304 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < /* tap */ ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,250) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi index 392a5f83..8b162bd6 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -11,8 +11,8 @@ flavor = "hold-preferred"; tapping-term-ms = <300>; quick-tap-ms = <300>; + global-quick-tap-ms = <100>; bindings = <&kp>, <&kp>; - global-quick-tap; }; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap index 5af001f6..cdbe51bf 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < /* tap */ ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,250) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap index 69d691ce..068ae81a 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap @@ -6,7 +6,7 @@ &kscan { events = < /* hold the first mod tap */ - ZMK_MOCK_PRESS(0,0,400) + ZMK_MOCK_PRESS(0,0,10) /* hold the second mod tap */ ZMK_MOCK_PRESS(0,1,400) /* press the normal key */ diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi index 02362ef2..9268da07 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi @@ -11,8 +11,8 @@ flavor = "tap-preferred"; tapping-term-ms = <300>; quick-tap-ms = <300>; + global-quick-tap-ms = <100>; bindings = <&kp>, <&kp>; - global-quick-tap; }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap index 5af001f6..cdbe51bf 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap @@ -7,7 +7,7 @@ events = < /* tap */ ZMK_MOCK_PRESS(0,0,10) - ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,0,250) /* normal quick tap */ ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(0,0,400) diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi index 029a8128..0ee84a0d 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi @@ -11,8 +11,8 @@ flavor = "tap-unless-interrupted"; tapping-term-ms = <300>; quick-tap-ms = <300>; + global-quick-tap-ms = <100>; bindings = <&kp>, <&kp>; - global-quick-tap; }; }; From 77eb44ba9b14d0c47eb81001d6a90a3ec4e82b19 Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Mon, 18 Jul 2022 18:27:44 -0700 Subject: [PATCH 453/494] feat(behaviors): Adding global-quick-tap-ms for combos This brings the 'global-quick-tap' functionality to combos by filtering out candidate combos that fell within their own quick tap term. I also replaced `return 0` with `return ZMK_EV_EVENT_BUBBLE` where appropriate. (I assume this was done in past as it is similar to errno returning, but being that this is to signify an event type I find this more clear) --- app/dts/bindings/zmk,combos.yaml | 3 + app/src/combo.c | 50 +++++++++++++-- .../combo/global-quick-tap/events.patterns | 1 + .../global-quick-tap/keycode_events.snapshot | 14 ++++ .../global-quick-tap/native_posix_64.keymap | 64 +++++++++++++++++++ 5 files changed, 126 insertions(+), 6 deletions(-) create mode 100644 app/tests/combo/global-quick-tap/events.patterns create mode 100644 app/tests/combo/global-quick-tap/keycode_events.snapshot create mode 100644 app/tests/combo/global-quick-tap/native_posix_64.keymap diff --git a/app/dts/bindings/zmk,combos.yaml b/app/dts/bindings/zmk,combos.yaml index d094b5c4..6f6794ba 100644 --- a/app/dts/bindings/zmk,combos.yaml +++ b/app/dts/bindings/zmk,combos.yaml @@ -18,6 +18,9 @@ child-binding: timeout-ms: type: int default: 50 + global-quick-tap-ms: + type: int + default: -1 slow-release: type: boolean layers: diff --git a/app/src/combo.c b/app/src/combo.c index 87a93143..0d6de4f1 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,7 @@ struct combo_cfg { int32_t key_position_len; struct zmk_behavior_binding behavior; int32_t timeout_ms; + int32_t global_quick_tap_ms; // if slow release is set, the combo releases when the last key is released. // otherwise, the combo releases when the first key is released. bool slow_release; @@ -72,6 +74,17 @@ int active_combo_count = 0; struct k_work_delayable timeout_task; int64_t timeout_task_timeout_at; +// this keeps track of the last non-combo, non-mod key tap +int64_t last_tapped_timestamp = INT32_MIN; +// this keeps track of the last time a combo was pressed +int64_t last_combo_timestamp = INT32_MIN; + +static void store_last_tapped(int64_t timestamp) { + if (timestamp > last_combo_timestamp) { + last_tapped_timestamp = timestamp; + } +} + // Store the combo key pointer in the combos array, one pointer for each key position // The combos are sorted shortest-first, then by virtual-key-position. static int initialize_combo(struct combo_cfg *new_combo) { @@ -122,6 +135,10 @@ static bool combo_active_on_layer(struct combo_cfg *combo, uint8_t layer) { return false; } +static bool is_quick_tap(struct combo_cfg *combo, int64_t timestamp) { + return (last_tapped_timestamp + combo->global_quick_tap_ms) > timestamp; +} + static int setup_candidates_for_first_keypress(int32_t position, int64_t timestamp) { int number_of_combo_candidates = 0; uint8_t highest_active_layer = zmk_keymap_highest_layer_active(); @@ -130,7 +147,7 @@ static int setup_candidates_for_first_keypress(int32_t position, int64_t timesta if (combo == NULL) { return number_of_combo_candidates; } - if (combo_active_on_layer(combo, highest_active_layer)) { + if (combo_active_on_layer(combo, highest_active_layer) && !is_quick_tap(combo, timestamp)) { candidates[number_of_combo_candidates].combo = combo; candidates[number_of_combo_candidates].timeout_at = timestamp + combo->timeout_ms; number_of_combo_candidates++; @@ -252,7 +269,7 @@ static int capture_pressed_key(const zmk_event_t *ev) { pressed_keys[i] = ev; return ZMK_EV_EVENT_CAPTURED; } - return 0; + return ZMK_EV_EVENT_BUBBLE; } const struct zmk_listener zmk_listener_combo; @@ -284,6 +301,8 @@ static inline int press_combo_behavior(struct combo_cfg *combo, int32_t timestam .timestamp = timestamp, }; + last_combo_timestamp = timestamp; + return behavior_keymap_binding_pressed(&combo->behavior, event); } @@ -413,7 +432,7 @@ static int position_state_down(const zmk_event_t *ev, struct zmk_position_state_ if (candidates[0].combo == NULL) { num_candidates = setup_candidates_for_first_keypress(data->position, data->timestamp); if (num_candidates == 0) { - return 0; + return ZMK_EV_EVENT_BUBBLE; } } else { filter_timed_out_candidates(data->timestamp); @@ -453,7 +472,7 @@ static int position_state_up(const zmk_event_t *ev, struct zmk_position_state_ch ZMK_EVENT_RAISE(ev); return ZMK_EV_EVENT_CAPTURED; } - return 0; + return ZMK_EV_EVENT_BUBBLE; } static void combo_timeout_handler(struct k_work *item) { @@ -470,7 +489,7 @@ static void combo_timeout_handler(struct k_work *item) { static int position_state_changed_listener(const zmk_event_t *ev) { struct zmk_position_state_changed *data = as_zmk_position_state_changed(ev); if (data == NULL) { - return 0; + return ZMK_EV_EVENT_BUBBLE; } if (data->state) { // keydown @@ -480,12 +499,31 @@ static int position_state_changed_listener(const zmk_event_t *ev) { } } -ZMK_LISTENER(combo, position_state_changed_listener); +static int keycode_state_changed_listener(const zmk_event_t *eh) { + struct zmk_keycode_state_changed *ev = as_zmk_keycode_state_changed(eh); + if (ev->state && !is_mod(ev->usage_page, ev->keycode)) { + store_last_tapped(ev->timestamp); + } + return ZMK_EV_EVENT_BUBBLE; +} + +int behavior_combo_listener(const zmk_event_t *eh) { + if (as_zmk_position_state_changed(eh) != NULL) { + return position_state_changed_listener(eh); + } else if (as_zmk_keycode_state_changed(eh) != NULL) { + return keycode_state_changed_listener(eh); + } + return ZMK_EV_EVENT_BUBBLE; +} + +ZMK_LISTENER(combo, behavior_combo_listener); ZMK_SUBSCRIPTION(combo, zmk_position_state_changed); +ZMK_SUBSCRIPTION(combo, zmk_keycode_state_changed); #define COMBO_INST(n) \ static struct combo_cfg combo_config_##n = { \ .timeout_ms = DT_PROP(n, timeout_ms), \ + .global_quick_tap_ms = DT_PROP(n, global_quick_tap_ms), \ .key_positions = DT_PROP(n, key_positions), \ .key_position_len = DT_PROP_LEN(n, key_positions), \ .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, n), \ diff --git a/app/tests/combo/global-quick-tap/events.patterns b/app/tests/combo/global-quick-tap/events.patterns new file mode 100644 index 00000000..833100f6 --- /dev/null +++ b/app/tests/combo/global-quick-tap/events.patterns @@ -0,0 +1 @@ +s/.*hid_listener_keycode_//p \ No newline at end of file diff --git a/app/tests/combo/global-quick-tap/keycode_events.snapshot b/app/tests/combo/global-quick-tap/keycode_events.snapshot new file mode 100644 index 00000000..ee4dd064 --- /dev/null +++ b/app/tests/combo/global-quick-tap/keycode_events.snapshot @@ -0,0 +1,14 @@ +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x05 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1B implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x04 implicit_mods 0x00 explicit_mods 0x00 +pressed: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 +released: usage_page 0x07 keycode 0x1C implicit_mods 0x00 explicit_mods 0x00 diff --git a/app/tests/combo/global-quick-tap/native_posix_64.keymap b/app/tests/combo/global-quick-tap/native_posix_64.keymap new file mode 100644 index 00000000..92b5a8ae --- /dev/null +++ b/app/tests/combo/global-quick-tap/native_posix_64.keymap @@ -0,0 +1,64 @@ +#include +#include +#include + +/ { + combos { + compatible = "zmk,combos"; + combo_one { + timeout-ms = <50>; + key-positions = <0 1>; + bindings = <&kp X>; + global-quick-tap-ms = <100>; + }; + + combo_two { + timeout-ms = <50>; + key-positions = <0 2>; + bindings = <&kp Y>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + label ="Default keymap"; + + default_layer { + bindings = < + &kp A &kp B + &kp C &kp D + >; + }; + }; +}; + +&kscan { + events = < + /* Tap A */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,60) + /* Quick Tap A and B */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,200) + /* Combo One */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Combo One Again (shouldn't quick tap) */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(0,1,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(0,1,10) + /* Tap A */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_RELEASE(0,0,60) + /* Combo 2 */ + ZMK_MOCK_PRESS(0,0,10) + ZMK_MOCK_PRESS(1,0,10) + ZMK_MOCK_RELEASE(0,0,10) + ZMK_MOCK_RELEASE(1,0,10) + >; +}; From 1e84e265b144602431d723e1080ebe32d87871e6 Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Sun, 28 May 2023 15:35:51 -0400 Subject: [PATCH 454/494] feat(docs): Adding global-quick-tap-ms docs --- docs/docs/behaviors/hold-tap.md | 10 +++++----- docs/docs/config/combos.md | 15 ++++++++------- docs/docs/features/combos.md | 1 + 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 2a8489a1..66cf5958 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -49,11 +49,11 @@ Defines how long a key must be pressed to trigger Hold behavior. If you press a tapped hold-tap again within `quick-tap-ms` milliseconds, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). -#### `global-quick-tap` +#### `global-quick-tap-ms` -If `global-quick-tap` is enabled, then `quick-tap-ms` will apply not only when the given hold-tap is tapped, but for any key tapped before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. +If `global-quick-tap-ms` is like `quick-tap-ms` however it will apply for _any_ key tapped before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. -For example, the following hold-tap configuration enables `global-quick-tap` with a 125 millisecond `quick-tap-ms` term. +For example, the following hold-tap configuration enables `global-quick-tap-ms` with a 125 millisecond term, alongside a regular `quick-tap-ms` with a 200 millisecond term. ``` gqt: global-quick-tap { @@ -62,8 +62,8 @@ gqt: global-quick-tap { #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <200>; - quick-tap-ms = <125>; - global-quick-tap; + quick-tap-ms = <200>; + global-quick-tap-ms = <125>; bindings = <&kp>, <&kp>; }; ``` diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index cd351125..ca802450 100644 --- a/docs/docs/config/combos.md +++ b/docs/docs/config/combos.md @@ -31,12 +31,13 @@ The `zmk,combos` node itself has no properties. It should have one child node pe Each child node can have the following properties: -| Property | Type | Description | Default | -| --------------- | ------------- | ----------------------------------------------------------------------------------------------------- | ------- | -| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | -| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | -| `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | -| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | -| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | +| Property | Type | Description | Default | +| --------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------- | ------- | +| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | +| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | +| `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | +| `global-quick-tap-ms` | int | If any key is tapped within `global-quick-tap-ms` before a key in the combo, the key will not be considered for the combo | -1 | +| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | +| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | The `key-positions` array must not be longer than the `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` setting, which defaults to 4. If you want a combo that triggers when pressing 5 keys, then you must change the setting to 5. diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 44313cc1..263c1a53 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -30,6 +30,7 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod - `layers = <0 1...>` will allow limiting a combo to specific layers. This is an _optional_ parameter, when omitted it defaults to global scope. - `bindings` is the behavior that is activated when the behavior is pressed. - (advanced) you can specify `slow-release` if you want the combo binding to be released when all key-positions are released. The default is to release the combo as soon as any of the keys in the combo is released. +- (advanced) you can specify `global-quick-tap-ms` much like in [hold-taps](behaviors/hold-tap.md#global-quick-tap-ms). If any key is tapped within `global-quick-tap-ms` before a key in the combo, the key will not be considered for the combo. :::info From 49c393e8f80701a8736b3e07bf7479c5b9a6592c Mon Sep 17 00:00:00 2001 From: Andrew Rae <56003701+andrewjrae@users.noreply.github.com> Date: Sun, 28 May 2023 21:35:02 -0400 Subject: [PATCH 455/494] refactor(docs): Applying suggestions for gqt from @caksoylar Co-authored-by: Cem Aksoylar --- docs/docs/behaviors/hold-tap.md | 4 ++-- docs/docs/config/behaviors.md | 22 +++++++++++----------- docs/docs/config/combos.md | 16 ++++++++-------- docs/docs/features/combos.md | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index 66cf5958..e1b10595 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -47,11 +47,11 @@ Defines how long a key must be pressed to trigger Hold behavior. #### `quick-tap-ms` -If you press a tapped hold-tap again within `quick-tap-ms` milliseconds, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). +If you press a tapped hold-tap again within `quick-tap-ms` milliseconds of the first press, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). #### `global-quick-tap-ms` -If `global-quick-tap-ms` is like `quick-tap-ms` however it will apply for _any_ key tapped before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. +`global-quick-tap-ms` is like `quick-tap-ms` however it will apply for _any_ non-modifier key pressed before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. For example, the following hold-tap configuration enables `global-quick-tap-ms` with a 125 millisecond term, alongside a regular `quick-tap-ms` with a 200 millisecond term. diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 60e8b72a..172a0f13 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -58,17 +58,17 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml](htt Applies to: `compatible = "zmk,behavior-hold-tap"` -| Property | Type | Description | Default | -| ---------------------------- | ------------- | ----------------------------------------------------------------------------------------- | ------------------ | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<2>` | | -| `bindings` | phandle array | A list of two behaviors (without parameters): one for hold and one for tap | | -| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | -| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | -| `quick-tap-ms` | int | Tap twice within this period (in milliseconds) to trigger a tap, even when held | -1 (disabled) | -| `global-quick-tap` | bool | If enabled, `quick-tap-ms` also applies when tapping another key and then this one. | false | -| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | -| `hold-trigger-key-positions` | array | If set, pressing the hold-tap and then any key position _not_ in the list triggers a tap. | | +| Property | Type | Description | Default | +| ---------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------ | ------------------ | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<2>` | | +| `bindings` | phandle array | A list of two behaviors (without parameters): one for hold and one for tap | | +| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | +| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | +| `quick-tap-ms` | int | Tap twice within this period (in milliseconds) to trigger a tap, even when held | -1 (disabled) | +| `global-quick-tap-ms` | int | Triggers a tap immediately if any non-modifier key was pressed within `global-quick-tap-ms` of the hold-tap. | -1 (disabled) | +| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | +| `hold-trigger-key-positions` | array | If set, pressing the hold-tap and then any key position _not_ in the list triggers a tap. | | The `flavor` property may be one of: diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index ca802450..33622a7a 100644 --- a/docs/docs/config/combos.md +++ b/docs/docs/config/combos.md @@ -31,13 +31,13 @@ The `zmk,combos` node itself has no properties. It should have one child node pe Each child node can have the following properties: -| Property | Type | Description | Default | -| --------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------- | ------- | -| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | -| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | -| `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | -| `global-quick-tap-ms` | int | If any key is tapped within `global-quick-tap-ms` before a key in the combo, the key will not be considered for the combo | -1 | -| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | -| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | +| Property | Type | Description | Default | +| --------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | +| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | +| `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | +| `global-quick-tap-ms` | int | If any non-modifier key is pressed within `global-quick-tap-ms` before a key in the combo, the key will not be considered for the combo | -1 (disabled) | +| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | +| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | The `key-positions` array must not be longer than the `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` setting, which defaults to 4. If you want a combo that triggers when pressing 5 keys, then you must change the setting to 5. diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 263c1a53..5ad06168 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -30,7 +30,7 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod - `layers = <0 1...>` will allow limiting a combo to specific layers. This is an _optional_ parameter, when omitted it defaults to global scope. - `bindings` is the behavior that is activated when the behavior is pressed. - (advanced) you can specify `slow-release` if you want the combo binding to be released when all key-positions are released. The default is to release the combo as soon as any of the keys in the combo is released. -- (advanced) you can specify `global-quick-tap-ms` much like in [hold-taps](behaviors/hold-tap.md#global-quick-tap-ms). If any key is tapped within `global-quick-tap-ms` before a key in the combo, the key will not be considered for the combo. +- (advanced) you can specify a `global-quick-tap-ms` value much like for [hold-taps](behaviors/hold-tap.md#global-quick-tap-ms). If any non-modifier key is pressed within `global-quick-tap-ms` before a key in the combo, the combo will not trigger. :::info From b85ffa4b6cfb5e2a8c735534ac1b46dc52f8ad86 Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Sun, 24 Sep 2023 09:38:45 -0400 Subject: [PATCH 456/494] refactor(behaviors): global-quick-tap -> require-prior-idle Renaming global-quick-tap-ms to require-prior-idle. --- .../behaviors/zmk,behavior-hold-tap.yaml | 2 +- app/dts/bindings/zmk,combos.yaml | 2 +- app/src/behaviors/behavior_hold_tap.c | 10 ++++----- app/src/combo.c | 6 ++--- .../events.patterns | 0 .../keycode_events.snapshot | 0 .../native_posix_64.keymap | 2 +- .../1-basic/events.patterns | 0 .../1-basic/keycode_events.snapshot | 0 .../1-basic/native_posix_64.keymap | 0 .../2-double-hold/events.patterns | 0 .../2-double-hold/keycode_events.snapshot | 0 .../2-double-hold/native_posix_64.keymap | 0 .../behavior_keymap.dtsi | 2 +- .../1-basic/events.patterns | 0 .../1-basic/keycode_events.snapshot | 0 .../1-basic/native_posix_64.keymap | 0 .../2-double-hold/events.patterns | 0 .../2-double-hold/keycode_events.snapshot | 0 .../2-double-hold/native_posix_64.keymap | 0 .../behavior_keymap.dtsi | 2 +- .../1-basic/events.patterns | 0 .../1-basic/keycode_events.snapshot | 0 .../1-basic/native_posix_64.keymap | 0 .../2-double-hold/events.patterns | 0 .../2-double-hold/keycode_events.snapshot | 0 .../2-double-hold/native_posix_64.keymap | 0 .../behavior_keymap.dtsi | 2 +- .../1-basic/events.patterns | 0 .../1-basic/keycode_events.snapshot | 0 .../1-basic/native_posix_64.keymap | 0 .../2-double-hold/events.patterns | 0 .../2-double-hold/keycode_events.snapshot | 0 .../2-double-hold/native_posix_64.keymap | 0 .../behavior_keymap.dtsi | 2 +- docs/docs/behaviors/hold-tap.md | 12 +++++----- docs/docs/config/behaviors.md | 22 +++++++++---------- docs/docs/config/combos.md | 16 +++++++------- docs/docs/features/combos.md | 2 +- 39 files changed, 41 insertions(+), 41 deletions(-) rename app/tests/combo/{global-quick-tap => require-prior-idle}/events.patterns (100%) rename app/tests/combo/{global-quick-tap => require-prior-idle}/keycode_events.snapshot (100%) rename app/tests/combo/{global-quick-tap => require-prior-idle}/native_posix_64.keymap (97%) rename app/tests/hold-tap/balanced/{8-global-quick-tap => 8-require-prior-idle}/1-basic/events.patterns (100%) rename app/tests/hold-tap/balanced/{8-global-quick-tap => 8-require-prior-idle}/1-basic/keycode_events.snapshot (100%) rename app/tests/hold-tap/balanced/{8-global-quick-tap => 8-require-prior-idle}/1-basic/native_posix_64.keymap (100%) rename app/tests/hold-tap/balanced/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/events.patterns (100%) rename app/tests/hold-tap/balanced/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/keycode_events.snapshot (100%) rename app/tests/hold-tap/balanced/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/native_posix_64.keymap (100%) rename app/tests/hold-tap/balanced/{8-global-quick-tap => 8-require-prior-idle}/behavior_keymap.dtsi (94%) rename app/tests/hold-tap/hold-preferred/{8-global-quick-tap => 8-require-prior-idle}/1-basic/events.patterns (100%) rename app/tests/hold-tap/hold-preferred/{8-global-quick-tap => 8-require-prior-idle}/1-basic/keycode_events.snapshot (100%) rename app/tests/hold-tap/hold-preferred/{8-global-quick-tap => 8-require-prior-idle}/1-basic/native_posix_64.keymap (100%) rename app/tests/hold-tap/hold-preferred/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/events.patterns (100%) rename app/tests/hold-tap/hold-preferred/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/keycode_events.snapshot (100%) rename app/tests/hold-tap/hold-preferred/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/native_posix_64.keymap (100%) rename app/tests/hold-tap/hold-preferred/{8-global-quick-tap => 8-require-prior-idle}/behavior_keymap.dtsi (94%) rename app/tests/hold-tap/tap-preferred/{8-global-quick-tap => 8-require-prior-idle}/1-basic/events.patterns (100%) rename app/tests/hold-tap/tap-preferred/{8-global-quick-tap => 8-require-prior-idle}/1-basic/keycode_events.snapshot (100%) rename app/tests/hold-tap/tap-preferred/{8-global-quick-tap => 8-require-prior-idle}/1-basic/native_posix_64.keymap (100%) rename app/tests/hold-tap/tap-preferred/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/events.patterns (100%) rename app/tests/hold-tap/tap-preferred/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/keycode_events.snapshot (100%) rename app/tests/hold-tap/tap-preferred/{8-global-quick-tap => 8-require-prior-idle}/2-double-hold/native_posix_64.keymap (100%) rename app/tests/hold-tap/tap-preferred/{8-global-quick-tap => 8-require-prior-idle}/behavior_keymap.dtsi (93%) rename app/tests/hold-tap/tap-unless-interrupted/{6-global-quick-tap => 6-require-prior-idle}/1-basic/events.patterns (100%) rename app/tests/hold-tap/tap-unless-interrupted/{6-global-quick-tap => 6-require-prior-idle}/1-basic/keycode_events.snapshot (100%) rename app/tests/hold-tap/tap-unless-interrupted/{6-global-quick-tap => 6-require-prior-idle}/1-basic/native_posix_64.keymap (100%) rename app/tests/hold-tap/tap-unless-interrupted/{6-global-quick-tap => 6-require-prior-idle}/2-double-hold/events.patterns (100%) rename app/tests/hold-tap/tap-unless-interrupted/{6-global-quick-tap => 6-require-prior-idle}/2-double-hold/keycode_events.snapshot (100%) rename app/tests/hold-tap/tap-unless-interrupted/{6-global-quick-tap => 6-require-prior-idle}/2-double-hold/native_posix_64.keymap (100%) rename app/tests/hold-tap/tap-unless-interrupted/{6-global-quick-tap => 6-require-prior-idle}/behavior_keymap.dtsi (94%) diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index cca0e969..7a140f91 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -22,7 +22,7 @@ properties: type: int global-quick-tap: # deprecated type: boolean - global-quick-tap-ms: + require-prior-idle-ms: type: int default: -1 flavor: diff --git a/app/dts/bindings/zmk,combos.yaml b/app/dts/bindings/zmk,combos.yaml index 6f6794ba..f146ab7a 100644 --- a/app/dts/bindings/zmk,combos.yaml +++ b/app/dts/bindings/zmk,combos.yaml @@ -18,7 +18,7 @@ child-binding: timeout-ms: type: int default: 50 - global-quick-tap-ms: + require-prior-idle-ms: type: int default: -1 slow-release: diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index 1f172e44..d4aa0dce 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -57,7 +57,7 @@ struct behavior_hold_tap_config { char *hold_behavior_dev; char *tap_behavior_dev; int quick_tap_ms; - int global_quick_tap_ms; + int require_prior_idle_ms; enum flavor flavor; bool retro_tap; bool hold_trigger_on_release; @@ -114,7 +114,7 @@ static void store_last_hold_tapped(struct active_hold_tap *hold_tap) { } static bool is_quick_tap(struct active_hold_tap *hold_tap) { - if ((last_tapped.timestamp + hold_tap->config->global_quick_tap_ms) > hold_tap->timestamp) { + if ((last_tapped.timestamp + hold_tap->config->require_prior_idle_ms) > hold_tap->timestamp) { return true; } else { return (last_tapped.position == hold_tap->position) && @@ -706,9 +706,9 @@ static int behavior_hold_tap_init(const struct device *dev) { .hold_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 0), label), \ .tap_behavior_dev = DT_PROP(DT_INST_PHANDLE_BY_IDX(n, bindings, 1), label), \ .quick_tap_ms = DT_INST_PROP(n, quick_tap_ms), \ - .global_quick_tap_ms = DT_INST_PROP(n, global_quick_tap) \ - ? DT_INST_PROP(n, quick_tap_ms) \ - : DT_INST_PROP(n, global_quick_tap_ms), \ + .require_prior_idle_ms = DT_INST_PROP(n, global_quick_tap) \ + ? DT_INST_PROP(n, quick_tap_ms) \ + : DT_INST_PROP(n, require_prior_idle_ms), \ .flavor = DT_ENUM_IDX(DT_DRV_INST(n), flavor), \ .retro_tap = DT_INST_PROP(n, retro_tap), \ .hold_trigger_on_release = DT_INST_PROP(n, hold_trigger_on_release), \ diff --git a/app/src/combo.c b/app/src/combo.c index 0d6de4f1..0d5c2a6e 100644 --- a/app/src/combo.c +++ b/app/src/combo.c @@ -31,7 +31,7 @@ struct combo_cfg { int32_t key_position_len; struct zmk_behavior_binding behavior; int32_t timeout_ms; - int32_t global_quick_tap_ms; + int32_t require_prior_idle_ms; // if slow release is set, the combo releases when the last key is released. // otherwise, the combo releases when the first key is released. bool slow_release; @@ -136,7 +136,7 @@ static bool combo_active_on_layer(struct combo_cfg *combo, uint8_t layer) { } static bool is_quick_tap(struct combo_cfg *combo, int64_t timestamp) { - return (last_tapped_timestamp + combo->global_quick_tap_ms) > timestamp; + return (last_tapped_timestamp + combo->require_prior_idle_ms) > timestamp; } static int setup_candidates_for_first_keypress(int32_t position, int64_t timestamp) { @@ -523,7 +523,7 @@ ZMK_SUBSCRIPTION(combo, zmk_keycode_state_changed); #define COMBO_INST(n) \ static struct combo_cfg combo_config_##n = { \ .timeout_ms = DT_PROP(n, timeout_ms), \ - .global_quick_tap_ms = DT_PROP(n, global_quick_tap_ms), \ + .require_prior_idle_ms = DT_PROP(n, require_prior_idle_ms), \ .key_positions = DT_PROP(n, key_positions), \ .key_position_len = DT_PROP_LEN(n, key_positions), \ .behavior = ZMK_KEYMAP_EXTRACT_BINDING(0, n), \ diff --git a/app/tests/combo/global-quick-tap/events.patterns b/app/tests/combo/require-prior-idle/events.patterns similarity index 100% rename from app/tests/combo/global-quick-tap/events.patterns rename to app/tests/combo/require-prior-idle/events.patterns diff --git a/app/tests/combo/global-quick-tap/keycode_events.snapshot b/app/tests/combo/require-prior-idle/keycode_events.snapshot similarity index 100% rename from app/tests/combo/global-quick-tap/keycode_events.snapshot rename to app/tests/combo/require-prior-idle/keycode_events.snapshot diff --git a/app/tests/combo/global-quick-tap/native_posix_64.keymap b/app/tests/combo/require-prior-idle/native_posix_64.keymap similarity index 97% rename from app/tests/combo/global-quick-tap/native_posix_64.keymap rename to app/tests/combo/require-prior-idle/native_posix_64.keymap index 92b5a8ae..206b230a 100644 --- a/app/tests/combo/global-quick-tap/native_posix_64.keymap +++ b/app/tests/combo/require-prior-idle/native_posix_64.keymap @@ -9,7 +9,7 @@ timeout-ms = <50>; key-positions = <0 1>; bindings = <&kp X>; - global-quick-tap-ms = <100>; + require-prior-idle-ms = <100>; }; combo_two { diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/events.patterns similarity index 100% rename from app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/events.patterns rename to app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/events.patterns diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/keycode_events.snapshot rename to app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/keycode_events.snapshot diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/8-global-quick-tap/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/events.patterns similarity index 100% rename from app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/events.patterns rename to app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/events.patterns diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/keycode_events.snapshot rename to app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/keycode_events.snapshot diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/balanced/8-global-quick-tap/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/balanced/8-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/balanced/8-require-prior-idle/behavior_keymap.dtsi similarity index 94% rename from app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi rename to app/tests/hold-tap/balanced/8-require-prior-idle/behavior_keymap.dtsi index 8fa363a2..670bdcc2 100644 --- a/app/tests/hold-tap/balanced/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/balanced/8-require-prior-idle/behavior_keymap.dtsi @@ -11,7 +11,7 @@ flavor = "balanced"; tapping-term-ms = <300>; quick-tap-ms = <300>; - global-quick-tap-ms = <100>; + require-prior-idle-ms = <100>; bindings = <&kp>, <&kp>; }; }; diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/events.patterns similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/events.patterns rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/events.patterns diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/keycode_events.snapshot diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/events.patterns similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/events.patterns rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/events.patterns diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/keycode_events.snapshot diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/hold-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/behavior_keymap.dtsi similarity index 94% rename from app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi rename to app/tests/hold-tap/hold-preferred/8-require-prior-idle/behavior_keymap.dtsi index 8b162bd6..a99eb3f5 100644 --- a/app/tests/hold-tap/hold-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/behavior_keymap.dtsi @@ -11,7 +11,7 @@ flavor = "hold-preferred"; tapping-term-ms = <300>; quick-tap-ms = <300>; - global-quick-tap-ms = <100>; + require-prior-idle-ms = <100>; bindings = <&kp>, <&kp>; }; }; diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/events.patterns similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/events.patterns rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/events.patterns diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/keycode_events.snapshot rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/keycode_events.snapshot diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-global-quick-tap/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/events.patterns similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/events.patterns rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/events.patterns diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/keycode_events.snapshot rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/keycode_events.snapshot diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-preferred/8-global-quick-tap/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/behavior_keymap.dtsi similarity index 93% rename from app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi rename to app/tests/hold-tap/tap-preferred/8-require-prior-idle/behavior_keymap.dtsi index 9268da07..c66dc934 100644 --- a/app/tests/hold-tap/tap-preferred/8-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/behavior_keymap.dtsi @@ -11,7 +11,7 @@ flavor = "tap-preferred"; tapping-term-ms = <300>; quick-tap-ms = <300>; - global-quick-tap-ms = <100>; + require-prior-idle-ms = <100>; bindings = <&kp>, <&kp>; }; }; diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/events.patterns b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/events.patterns similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/events.patterns rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/events.patterns diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/keycode_events.snapshot rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/keycode_events.snapshot diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/1-basic/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/events.patterns b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/events.patterns similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/events.patterns rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/events.patterns diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/keycode_events.snapshot b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/keycode_events.snapshot similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/keycode_events.snapshot rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/keycode_events.snapshot diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_posix_64.keymap similarity index 100% rename from app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/2-double-hold/native_posix_64.keymap rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/2-double-hold/native_posix_64.keymap diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/behavior_keymap.dtsi similarity index 94% rename from app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi rename to app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/behavior_keymap.dtsi index 0ee84a0d..7aa39408 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-global-quick-tap/behavior_keymap.dtsi +++ b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/behavior_keymap.dtsi @@ -11,7 +11,7 @@ flavor = "tap-unless-interrupted"; tapping-term-ms = <300>; quick-tap-ms = <300>; - global-quick-tap-ms = <100>; + require-prior-idle-ms = <100>; bindings = <&kp>, <&kp>; }; }; diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index e1b10595..e8192f68 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -49,11 +49,11 @@ Defines how long a key must be pressed to trigger Hold behavior. If you press a tapped hold-tap again within `quick-tap-ms` milliseconds of the first press, it will always trigger the tap behavior. This is useful for things like a backspace, where a quick tap+hold holds backspace pressed. Set this to a negative value to disable. The default is -1 (disabled). -#### `global-quick-tap-ms` +#### `require-prior-idle-ms` -`global-quick-tap-ms` is like `quick-tap-ms` however it will apply for _any_ non-modifier key pressed before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. +`require-prior-idle-ms` is like `quick-tap-ms` however it will apply for _any_ non-modifier key pressed before it. This effectively disables the hold-tap when typing quickly, which can be quite useful for homerow mods. It can also have the effect of removing the input delay when typing quickly. -For example, the following hold-tap configuration enables `global-quick-tap-ms` with a 125 millisecond term, alongside a regular `quick-tap-ms` with a 200 millisecond term. +For example, the following hold-tap configuration enables `require-prior-idle-ms` with a 125 millisecond term, alongside `quick-tap-ms` with a 200 millisecond term. ``` gqt: global-quick-tap { @@ -63,14 +63,14 @@ gqt: global-quick-tap { flavor = "tap-preferred"; tapping-term-ms = <200>; quick-tap-ms = <200>; - global-quick-tap-ms = <125>; + require-prior-idle-ms = <125>; bindings = <&kp>, <&kp>; }; ``` -If you press `&kp A` and then `&gqt LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. Importantly, `b` will be output immediately since it was within the `quick-tap-ms`. This quick-tap behavior will work for any key press, whether it is within a behavior like hold-tap, or a simple `&kp`. This means the `&gqt LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** a key press. +If you press `&kp A` and then `&gqt LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. Importantly, `b` will be output immediately since it was within the `require-prior-idle-ms`. This "quick-tap" behavior will work for any key press, whether it is within a behavior like hold-tap, or a simple `&kp`. This means the `&gqt LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** a key press. -Note that the greater the value of `quick-tap-ms` is, the harder it will be to invoke the hold behavior, making this feature less applicable for use-cases like capitalizing letters while typing normally. However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. +Note that the greater the value of `require-prior-idle-ms` is, the harder it will be to invoke the hold behavior, making this feature less applicable for use-cases like capitalizing letters while typing normally. However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. #### `retro-tap` diff --git a/docs/docs/config/behaviors.md b/docs/docs/config/behaviors.md index 172a0f13..f3f1f563 100644 --- a/docs/docs/config/behaviors.md +++ b/docs/docs/config/behaviors.md @@ -58,17 +58,17 @@ Definition file: [zmk/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml](htt Applies to: `compatible = "zmk,behavior-hold-tap"` -| Property | Type | Description | Default | -| ---------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------ | ------------------ | -| `label` | string | Unique label for the node | | -| `#binding-cells` | int | Must be `<2>` | | -| `bindings` | phandle array | A list of two behaviors (without parameters): one for hold and one for tap | | -| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | -| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | -| `quick-tap-ms` | int | Tap twice within this period (in milliseconds) to trigger a tap, even when held | -1 (disabled) | -| `global-quick-tap-ms` | int | Triggers a tap immediately if any non-modifier key was pressed within `global-quick-tap-ms` of the hold-tap. | -1 (disabled) | -| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | -| `hold-trigger-key-positions` | array | If set, pressing the hold-tap and then any key position _not_ in the list triggers a tap. | | +| Property | Type | Description | Default | +| ---------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------- | ------------------ | +| `label` | string | Unique label for the node | | +| `#binding-cells` | int | Must be `<2>` | | +| `bindings` | phandle array | A list of two behaviors (without parameters): one for hold and one for tap | | +| `flavor` | string | Adjusts how the behavior chooses between hold and tap | `"hold-preferred"` | +| `tapping-term-ms` | int | How long in milliseconds the key must be held to trigger a hold | | +| `quick-tap-ms` | int | Tap twice within this period (in milliseconds) to trigger a tap, even when held | -1 (disabled) | +| `require-prior-idle-ms` | int | Triggers a tap immediately if any non-modifier key was pressed within `require-prior-idle-ms` of the hold-tap. | -1 (disabled) | +| `retro-tap` | bool | Triggers the tap behavior on release if no other key was pressed during a hold | false | +| `hold-trigger-key-positions` | array | If set, pressing the hold-tap and then any key position _not_ in the list triggers a tap. | | The `flavor` property may be one of: diff --git a/docs/docs/config/combos.md b/docs/docs/config/combos.md index 33622a7a..4f5ebba3 100644 --- a/docs/docs/config/combos.md +++ b/docs/docs/config/combos.md @@ -31,13 +31,13 @@ The `zmk,combos` node itself has no properties. It should have one child node pe Each child node can have the following properties: -| Property | Type | Description | Default | -| --------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | -| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | -| `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | -| `global-quick-tap-ms` | int | If any non-modifier key is pressed within `global-quick-tap-ms` before a key in the combo, the key will not be considered for the combo | -1 (disabled) | -| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | -| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | +| Property | Type | Description | Default | +| ----------------------- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `bindings` | phandle-array | A [behavior](../features/keymaps.md#behaviors) to run when the combo is triggered | | +| `key-positions` | array | A list of key position indices for the keys which should trigger the combo | | +| `timeout-ms` | int | All the keys in `key-positions` must be pressed within this time in milliseconds to trigger the combo | 50 | +| `require-prior-idle-ms` | int | If any non-modifier key is pressed within `require-prior-idle-ms` before a key in the combo, the key will not be considered for the combo | -1 (disabled) | +| `slow-release` | bool | Releases the combo when all keys are released instead of when any key is released | false | +| `layers` | array | A list of layers on which the combo may be triggered. `-1` allows all layers. | `<-1>` | The `key-positions` array must not be longer than the `CONFIG_ZMK_COMBO_MAX_KEYS_PER_COMBO` setting, which defaults to 4. If you want a combo that triggers when pressing 5 keys, then you must change the setting to 5. diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index 5ad06168..bc1353b4 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -30,7 +30,7 @@ Combos configured in your `.keymap` file, but are separate from the `keymap` nod - `layers = <0 1...>` will allow limiting a combo to specific layers. This is an _optional_ parameter, when omitted it defaults to global scope. - `bindings` is the behavior that is activated when the behavior is pressed. - (advanced) you can specify `slow-release` if you want the combo binding to be released when all key-positions are released. The default is to release the combo as soon as any of the keys in the combo is released. -- (advanced) you can specify a `global-quick-tap-ms` value much like for [hold-taps](behaviors/hold-tap.md#global-quick-tap-ms). If any non-modifier key is pressed within `global-quick-tap-ms` before a key in the combo, the combo will not trigger. +- (advanced) you can specify a `require-prior-idle-ms` value much like for [hold-taps](behaviors/hold-tap.md#require-prior-idle-ms). If any non-modifier key is pressed within `require-prior-idle-ms` before a key in the combo, the combo will not trigger. :::info From f0f6d61e794633a06b04246ee31e276c9fbf3040 Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Sun, 24 Sep 2023 10:19:58 -0400 Subject: [PATCH 457/494] fix(tests): Updating old tests includes --- app/tests/combo/require-prior-idle/native_posix_64.keymap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/tests/combo/require-prior-idle/native_posix_64.keymap b/app/tests/combo/require-prior-idle/native_posix_64.keymap index 206b230a..fcd94056 100644 --- a/app/tests/combo/require-prior-idle/native_posix_64.keymap +++ b/app/tests/combo/require-prior-idle/native_posix_64.keymap @@ -1,6 +1,6 @@ #include #include -#include +#include / { combos { From 2234be0871cdab4c0d8bfc6abee3013716e5601a Mon Sep 17 00:00:00 2001 From: Andrew Rae <56003701+andrewjrae@users.noreply.github.com> Date: Mon, 25 Sep 2023 09:15:57 -0400 Subject: [PATCH 458/494] refactor(docs): Apply suggestions from @caksoylar Co-authored-by: Cem Aksoylar --- docs/docs/behaviors/hold-tap.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index e8192f68..d9d86cea 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -56,7 +56,7 @@ If you press a tapped hold-tap again within `quick-tap-ms` milliseconds of the f For example, the following hold-tap configuration enables `require-prior-idle-ms` with a 125 millisecond term, alongside `quick-tap-ms` with a 200 millisecond term. ``` -gqt: global-quick-tap { +rpi: require_prior_idle { compatible = "zmk,behavior-hold-tap"; label = "GLOBAL_QUICK_TAP"; #binding-cells = <2>; @@ -68,7 +68,7 @@ gqt: global-quick-tap { }; ``` -If you press `&kp A` and then `&gqt LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. Importantly, `b` will be output immediately since it was within the `require-prior-idle-ms`. This "quick-tap" behavior will work for any key press, whether it is within a behavior like hold-tap, or a simple `&kp`. This means the `&gqt LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** a key press. +If you press `&kp A` and then `&rpi LEFT_SHIFT B` **within** 125 ms, then `ab` will be output. Importantly, `b` will be output immediately since it was within the `require-prior-idle-ms`, without waiting for a timeout or an interrupting key. In other words, the `&rpi LEFT_SHIFT B` binding will only have its underlying hold-tap behavior if it is pressed 125 ms **after** the previous key press; otherwise it will act like `&kp B`. Note that the greater the value of `require-prior-idle-ms` is, the harder it will be to invoke the hold behavior, making this feature less applicable for use-cases like capitalizing letters while typing normally. However, if the hold behavior isn't used during fast typing, then it can be an effective way to mitigate misfires. From 11996ff7f05bdbe0d5ee59dc3b695d5e9d8c5c8d Mon Sep 17 00:00:00 2001 From: Andrew Rae Date: Tue, 26 Sep 2023 22:00:23 -0400 Subject: [PATCH 459/494] refactor(behaviors): Final global-quick-tap deprecation. --- app/boards/shields/cradio/cradio.keymap | 2 +- app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml | 9 ++++++--- .../8-require-prior-idle/1-basic/native_posix_64.keymap | 2 +- .../8-require-prior-idle/1-basic/native_posix_64.keymap | 2 +- .../8-require-prior-idle/1-basic/native_posix_64.keymap | 2 +- .../6-require-prior-idle/1-basic/native_posix_64.keymap | 2 +- docs/docs/behaviors/hold-tap.md | 2 +- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/app/boards/shields/cradio/cradio.keymap b/app/boards/shields/cradio/cradio.keymap index 3f6670da..47bf0422 100644 --- a/app/boards/shields/cradio/cradio.keymap +++ b/app/boards/shields/cradio/cradio.keymap @@ -18,7 +18,7 @@ flavor = "tap-preferred"; tapping-term-ms = <220>; quick-tap-ms = <150>; - global-quick-tap; + require-prior-idle-ms = <100>; bindings = <&kp>, <&kp>; }; }; diff --git a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml index 7a140f91..57575411 100644 --- a/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml +++ b/app/dts/bindings/behaviors/zmk,behavior-hold-tap.yaml @@ -13,15 +13,18 @@ properties: required: true tapping-term-ms: type: int - tapping_term_ms: # deprecated + tapping_term_ms: type: int + deprecated: true quick-tap-ms: type: int default: -1 - quick_tap_ms: # deprecated + quick_tap_ms: type: int - global-quick-tap: # deprecated + deprecated: true + global-quick-tap: type: boolean + deprecated: true require-prior-idle-ms: type: int default: -1 diff --git a/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap index cdbe51bf..aa629498 100644 --- a/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/balanced/8-require-prior-idle/1-basic/native_posix_64.keymap @@ -16,7 +16,7 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ + /* require-prior-idle */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(1,0,10) diff --git a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap index a7ba7304..6db79abc 100644 --- a/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/hold-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap @@ -16,7 +16,7 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ + /* require-prior-idle */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(1,0,10) diff --git a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap index cdbe51bf..aa629498 100644 --- a/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-preferred/8-require-prior-idle/1-basic/native_posix_64.keymap @@ -16,7 +16,7 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ + /* require-prior-idle */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(1,0,10) diff --git a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap index cdbe51bf..aa629498 100644 --- a/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap +++ b/app/tests/hold-tap/tap-unless-interrupted/6-require-prior-idle/1-basic/native_posix_64.keymap @@ -16,7 +16,7 @@ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,0,400) - /* global quick tap */ + /* require-prior-idle */ ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_PRESS(0,0,400) ZMK_MOCK_RELEASE(1,0,10) diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index d9d86cea..ec66b34f 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -58,7 +58,7 @@ For example, the following hold-tap configuration enables `require-prior-idle-ms ``` rpi: require_prior_idle { compatible = "zmk,behavior-hold-tap"; - label = "GLOBAL_QUICK_TAP"; + label = "REQUIRE_PRIOR_IDLE"; #binding-cells = <2>; flavor = "tap-preferred"; tapping-term-ms = <200>; From df92b0e37d5c53e23ffe60c7a8005eb311cff785 Mon Sep 17 00:00:00 2001 From: Seth Milliken Date: Wed, 4 Oct 2023 08:48:46 -0700 Subject: [PATCH 460/494] feat(shields): sofle: add underglow support with `&pinctrl` update * Sofle Shield: Add underglow support --------- Co-authored-by: Kim Streich Co-authored-by: Seth Milliken --- app/boards/shields/sofle/Kconfig.defconfig | 6 ++ .../shields/sofle/boards/nice_nano.overlay | 51 +++++++++++++ .../shields/sofle/boards/nice_nano_v2.overlay | 51 +++++++++++++ .../shields/sofle/boards/nrfmicro_11.overlay | 51 +++++++++++++ .../shields/sofle/boards/nrfmicro_13.overlay | 51 +++++++++++++ app/boards/shields/sofle/sofle.conf | 8 ++ app/boards/shields/sofle/sofle.keymap | 76 ++++++++++++++----- app/boards/shields/sofle/sofle.zmk.yml | 1 + 8 files changed, 276 insertions(+), 19 deletions(-) create mode 100644 app/boards/shields/sofle/boards/nice_nano.overlay create mode 100644 app/boards/shields/sofle/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/sofle/boards/nrfmicro_11.overlay create mode 100644 app/boards/shields/sofle/boards/nrfmicro_13.overlay diff --git a/app/boards/shields/sofle/Kconfig.defconfig b/app/boards/shields/sofle/Kconfig.defconfig index cc598d67..4e7bf884 100644 --- a/app/boards/shields/sofle/Kconfig.defconfig +++ b/app/boards/shields/sofle/Kconfig.defconfig @@ -46,4 +46,10 @@ endchoice endif # LVGL +if ZMK_RGB_UNDERGLOW + +config WS2812_STRIP + default y +endif + endif diff --git a/app/boards/shields/sofle/boards/nice_nano.overlay b/app/boards/shields/sofle/boards/nice_nano.overlay new file mode 100644 index 00000000..336be4b0 --- /dev/null +++ b/app/boards/shields/sofle/boards/nice_nano.overlay @@ -0,0 +1,51 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <36>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = < + LED_COLOR_ID_GREEN + LED_COLOR_ID_RED + LED_COLOR_ID_BLUE + >; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/sofle/boards/nice_nano_v2.overlay b/app/boards/shields/sofle/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..336be4b0 --- /dev/null +++ b/app/boards/shields/sofle/boards/nice_nano_v2.overlay @@ -0,0 +1,51 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <36>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = < + LED_COLOR_ID_GREEN + LED_COLOR_ID_RED + LED_COLOR_ID_BLUE + >; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/sofle/boards/nrfmicro_11.overlay b/app/boards/shields/sofle/boards/nrfmicro_11.overlay new file mode 100644 index 00000000..336be4b0 --- /dev/null +++ b/app/boards/shields/sofle/boards/nrfmicro_11.overlay @@ -0,0 +1,51 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <36>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = < + LED_COLOR_ID_GREEN + LED_COLOR_ID_RED + LED_COLOR_ID_BLUE + >; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/sofle/boards/nrfmicro_13.overlay b/app/boards/shields/sofle/boards/nrfmicro_13.overlay new file mode 100644 index 00000000..336be4b0 --- /dev/null +++ b/app/boards/shields/sofle/boards/nrfmicro_13.overlay @@ -0,0 +1,51 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <36>; /* arbitrary; change at will */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = < + LED_COLOR_ID_GREEN + LED_COLOR_ID_RED + LED_COLOR_ID_BLUE + >; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/sofle/sofle.conf b/app/boards/shields/sofle/sofle.conf index fe3f0f4f..1f74aa33 100644 --- a/app/boards/shields/sofle/sofle.conf +++ b/app/boards/shields/sofle/sofle.conf @@ -7,3 +7,11 @@ # Uncomment these two lines to add support for encoders # CONFIG_EC11=y # CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y + +# Uncomment this line below to add rgb underglow / backlight support +# CONFIG_ZMK_RGB_UNDERGLOW=y + +# Uncomment the line below to disable external power toggling by the underglow. +# By default toggling the underglow on and off also toggles external power +# on and off. This also causes the display to turn off. +# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n diff --git a/app/boards/shields/sofle/sofle.keymap b/app/boards/shields/sofle/sofle.keymap index 395ecf1d..fbb0af7f 100644 --- a/app/boards/shields/sofle/sofle.keymap +++ b/app/boards/shields/sofle/sofle.keymap @@ -7,34 +7,53 @@ #include #include #include +#include +#include + +#define BASE 0 +#define LOWER 1 +#define RAISE 2 +#define ADJUST 3 / { + + // Activate ADJUST layer by pressing raise and lower + conditional_layers { + compatible = "zmk,conditional-layers"; + adjust_layer { + if-layers = ; + then-layer = ; + }; + }; + keymap { compatible = "zmk,keymap"; default_layer { + label = "default"; // ------------------------------------------------------------------------------------------------------------ -// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | +// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | // | ESC | Q | W | E | R | T | | Y | U | I | O | P | BKSPC | // | TAB | A | S | D | F | G | | H | J | K | L | ; | ' | // | SHIFT | Z | X | C | V | B | MUTE | | | N | M | , | . | / | SHIFT | // | GUI | ALT | CTRL | LOWER| ENTER | | SPACE | RAISE| CTRL | ALT | GUI | bindings = < -&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &none -&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC -&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT -&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &none &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LGUI &kp LALT &kp LCTRL &mo 1 &kp RET &kp SPACE &mo 2 &kp RCTRL &kp RALT &kp RGUI +&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &none +&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC +&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT +&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp C_MUTE &none &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT + &kp LGUI &kp LALT &kp LCTRL &mo LOWER &kp RET &kp SPACE &mo RAISE &kp RCTRL &kp RALT &kp RGUI >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; lower_layer { + label = "lower"; // TODO: Some binds are waiting for shifted keycode support. // ------------------------------------------------------------------------------------------------------------ // | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | -// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 | +// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 | // | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | | // | | = | - | + | { | } | | | | [ | ] | ; | : | \ | | // | | | | | | | | | | | | @@ -42,29 +61,48 @@ &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp F12 &trans &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR &kp PIPE -&trans &kp EQUAL &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &trans &trans &kp LBKT &kp RBKT &kp SEMI &kp COLON &kp BSLH &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&trans &kp EQUAL &kp MINUS &kp KP_PLUS &kp LBRC &kp RBRC &trans &trans &kp LBKT &kp RBKT &kp SEMI &kp COLON &kp BSLH &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; raise_layer { + label = "raise"; // ------------------------------------------------------------------------------------------------------------ -// |BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | -// | | INS | PSCR | GUI | | | | PGUP | | ^ | | | | -// | | ALT | CTRL | SHIFT | | CAPS | | PGDN | <- | v | -> | DEL | BKSPC | -// | | UNDO | CUT | COPY | PASTE | | | | | | | | | | | -// | | | | | | | | | | | | +// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | +// | | INS | PSCR | GUI | | | | PGUP | | ^ | | | | +// | | ALT | CTRL | SHIFT | | CAPS | | PGDN | <- | v | -> | DEL | BKSPC | +// | | UNDO | CUT | COPY | PASTE | | | | | | | | | | | +// | | | | | | | | | | | | bindings = < -&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans -&trans &kp INS &kp PSCRN &kp K_CMENU &trans &trans &kp PG_UP &trans &kp UP &trans &kp N0 &trans -&trans &kp LALT &kp LCTRL &kp LSHFT &trans &kp CLCK &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC -&trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &trans &trans &trans &trans &trans - &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans +&trans &kp INS &kp PSCRN &kp K_CMENU &trans &trans &kp PG_UP &trans &kp UP &trans &kp N0 &trans +&trans &kp LALT &kp LCTRL &kp LSHFT &trans &kp CLCK &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp DEL &kp BSPC +&trans &kp K_UNDO &kp K_CUT &kp K_COPY &kp K_PASTE &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans >; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; }; + + adjust_layer { +// ---------------------------------------------------------------------------------------------------------------------------- +// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | | +// | EXTPWR | RGB_HUD | RGB_HUI | RGB_SAD | RGB_SAI | RGB_EFF | | | | | | | | +// | | RGB_BRD | RGB_BRI | | | | | | | | | | | +// | | | | | | | RGB_TOG | | | | | | | | | +// | | | | | | | | | | | | + label = "adjust"; + bindings = < +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &none &none &none &none &none &none +&ext_power EP_TOG &rgb_ug RGB_HUD &rgb_ug RGB_HUI &rgb_ug RGB_SAD &rgb_ug RGB_SAI &rgb_ug RGB_EFF &none &none &none &none &none &none +&none &rgb_ug RGB_BRD &rgb_ug RGB_BRI &none &none &none &none &none &none &none &none &none +&none &none &none &none &none &none &rgb_ug RGB_TOG &none &none &none &none &none &none &none + &none &none &none &none &none &none &none &none &none &none + >; + }; + }; }; diff --git a/app/boards/shields/sofle/sofle.zmk.yml b/app/boards/shields/sofle/sofle.zmk.yml index 5f6f99c3..47b66d67 100644 --- a/app/boards/shields/sofle/sofle.zmk.yml +++ b/app/boards/shields/sofle/sofle.zmk.yml @@ -9,6 +9,7 @@ features: - keys - display - encoder + - underglow siblings: - sofle_left - sofle_right From 913fdb831e4445bf26df74881fa74666a590020b Mon Sep 17 00:00:00 2001 From: Amettler Thierry Date: Wed, 4 Oct 2023 22:29:06 +0200 Subject: [PATCH 461/494] feat(docs): Add configuration snippet for layer-taps --- docs/docs/behaviors/layers.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md index cf793089..7d790156 100644 --- a/docs/docs/behaviors/layers.md +++ b/docs/docs/behaviors/layers.md @@ -57,6 +57,22 @@ Example: < LOWER SPACE ``` +### Configuration + +You can configure a different tapping term or tweak other properties noted in the [hold-tap](hold-tap.md#advanced-configuration) documentation page in your keymap: + +``` +< { + tapping-term-ms = <200>; +}; + +/ { + keymap { + ... + }; +}; +``` + :::info Functionally, the layer-tap is a [hold-tap](hold-tap.md) of the ["tap-preferred" flavor](hold-tap.md/#flavors) and a [`tapping-term-ms`](hold-tap.md/#tapping-term-ms) of 200 that takes in a [`momentary layer`](#momentary-layer) and a [keypress](key-press.md) as its "hold" and "tap" parameters, respectively. From ca5c9b4ae6b7008b81c9f9cb02fb7d295b3290b0 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Thu, 5 Oct 2023 19:53:15 -0700 Subject: [PATCH 462/494] feat(blog): Add SOTF #6 (#1943) Co-authored-by: Pete Johanson --- docs/blog/2023-10-05-zmk-sotf-6.md | 295 +++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 docs/blog/2023-10-05-zmk-sotf-6.md diff --git a/docs/blog/2023-10-05-zmk-sotf-6.md b/docs/blog/2023-10-05-zmk-sotf-6.md new file mode 100644 index 00000000..18a52a85 --- /dev/null +++ b/docs/blog/2023-10-05-zmk-sotf-6.md @@ -0,0 +1,295 @@ +--- +title: "ZMK State Of The Firmware #6" +author: Cem Aksoylar +author_title: Documentation maintainer +author_url: https://github.com/caksoylar +author_image_url: https://avatars.githubusercontent.com/u/7876996 +tags: [SOTF, keyboards, firmware, oss, ble] +--- + +Welcome to the sixth ZMK "State Of The Firmware" (SOTF)! + +This update will cover all the major activity since [SOTF #5](/blog/2022/04/10/zmk-sotf-5). That was over a year ago (again!), so there are many new exciting features and plenty of improvements to cover! + +## Recent Activity + +Here's a summary of the various major changes since last time, broken down by theme: + +### Keymaps/Behaviors + +#### Hold-tap improvements + +[andrewjrae] added the [`require-prior-idle-ms` property](/docs/behaviors/hold-tap#require-prior-idle-ms) to the hold-tap behavior in [#1187](https://github.com/zmkfirmware/zmk/pull/1187) and [#1387](https://github.com/zmkfirmware/zmk/pull/1387), which prevents the hold behavior from triggering if it hasn't been a certain duration since the last key press. This is a useful feature to prevent accidental hold activations during quick typing and made its way into many keymaps! The same property was added to [combos](/docs/features/combos#configuration) as well to help prevent false combo activations. + +Note that an earlier iteration of this feature was supported with the `global-quick-tap` property, which did not allow customizing the timeout and used the value of `tapping-term-ms` for it. This property is now deprecated and users are encouraged to use `require-prior-idle-ms` instead. + +[urob] added the [`hold-trigger-on-release` property](/docs/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) in [#1423](https://github.com/zmkfirmware/zmk/pull/1423). This significantly increases the usefulness of positional constraints on hold-taps, since it allows combining multiple holds such as different modifiers for home row mods usage. + +#### Masking mods in mod-morphs + +[aumuell](https://github.com/aumuell), [vrinek](https://github.com/vrinek) and [urob] contributed to improving the behavior of [mod-morphs](/docs/behaviors/mod-morph) by masking the triggering modifiers and added `keep-mods` property in [#1412](https://github.com/zmkfirmware/zmk/pull/1412). This unlocks more use cases for mod-morphs, since you are no longer constrained to emitting keycodes that work well with the triggering modifier keycodes. + +As an example, you can now define a mod-morph that swaps `;` and `:` so that the former is the shifted version of the latter, which wasn't previously possible: + +```dts + col_semi: colon_semicolon { + compatible = "zmk,behavior-mod-morph"; + label = "COLON_SEMICOLON"; + #binding-cells = <0>; + bindings = <&kp COLON>, <&kp SEMI>; + mods = <(MOD_LSFT|MOD_RSFT)>; + }; +``` + +#### Parameterized macros + +[petejohanson] added [macros that can be parameterized](/docs/behaviors/macros#parameterized-macros) with one or two parameters in [#1232](https://github.com/zmkfirmware/zmk/pull/1232). This allows users to define macros in a more modular way and is a nice quality-of-life improvement. + +As a simple example, you could define a macro that puts any keycode provided between double quotes as below, then use it like `&ql A` in your keymap: + +```dts + ql: quoted_letter_macro { + #binding-cells = <1>; + label = "QUOTED_LETTER"; + compatible = "zmk,behavior-macro-one-param"; + bindings = + <&kp DQT>, + <¯o_param_1to1 &kp MACRO_PLACEHOLDER>, + <&kp DQT>; + }; +``` + +Please see the documentation page linked above for usage and more examples. + +#### Arbitrary behaviors on encoder rotation + +[nickconway](https://github.com/nickconway) and [petejohanson] added [sensor rotation behaviors](/docs/behaviors/sensor-rotate) to allow invoking arbitrary behaviors from encoders [#1758](https://github.com/zmkfirmware/zmk/pull/1758). Previously encoder rotations could only invoke the key-press behavior `&kp` through the `&inc_dec_kp` binding, whereas now you can define new sensor rotation behaviors to invoke others. + +(Note that currently behaviors that have "locality" such as `&rgb_ug` do not work as expected via encoder rotation bindings in split keyboards, due to issue [#1494](https://github.com/zmkfirmware/zmk/issues/1494).) + +#### Pre-releasing already pressed keys + +[andrewjrae] contributed a tweak to emitting keycodes in [#1828](https://github.com/zmkfirmware/zmk/pull/1828), where rolling multiple keys that involve the same keycode now releases the keycode before sending a press event again. While this might sound like a technical distinction, it leads to more correct behavior when quickly typing sequences like `+=` and makes the [key repeat behavior](/docs/behaviors/key-repeat) work properly when it is pressed before the previous key is released. + +#### Key toggle behavior + +[cgoates](https://github.com/cgoates) added the [key toggle behavior](/docs/behaviors/key-toggle) in [#1278](https://github.com/zmkfirmware/zmk/pull/1278), which can be used via its `&kt` binding to toggle the state of a keycode between pressed and released. + +#### Apple Globe key + +[ReFil] added support for the `C_AC_NEXT_KEYBOARD_LAYOUT_SELECT` keycode with alias `GLOBE` which acts as the Globe key in macOS and iOS in [#1938](https://github.com/zmkfirmware/zmk/pull/1938). Note that this keycode doesn't exactly behave like a Globe key that is present on an Apple keyboard and its limitations are documented in [this comment](https://github.com/zmkfirmware/zmk/pull/1938#issuecomment-1744579039) thanks to testing by [SethMilliken](https://github.com/SethMilliken). These limitations will be noted in the official [keycodes documentation](/docs/codes/applications) shortly. + +#### Bug fixes and other improvements + +[petejohanson], [andrewjrae] and [okke-formsma] tracked down and fixed an issue causing stuck keys when there are combos on key positions involving hold-tap behaviors in [#1411](https://github.com/zmkfirmware/zmk/pull/1411). This was an elusive bug that took a lot of effort from the community to nail down and fix! + +[nguyendown](https://github.com/nguyendown) and [joelspadin] tracked down and fixed a couple issues causing stuck keys with [sticky keys](/docs/behaviors/sticky-key) in [#1586](https://github.com/zmkfirmware/zmk/pull/1586), [#1745](https://github.com/zmkfirmware/zmk/pull/1745). + +[okke-formsma] fixed an issue allowing tap dances to be invoked by combos in [#1518](https://github.com/zmkfirmware/zmk/pull/1518). + +[petejohanson] tweaked the caps word behavior to ignore modifiers in [#1330](https://github.com/zmkfirmware/zmk/pull/1330). + +[HelloThisIsFlo](https://github.com/HelloThisIsFlo) documented a bug with combos involving overlapping keys and different timeouts, produced a reproducing unit test, then proceeded to fix it in [#1945](https://github.com/zmkfirmware/zmk/pull/1945). + +### Bluetooth and Split Improvements + +#### Multiple peripherals + +[xudongzheng] contributed to add support for more than one peripheral per keyboard in [#836](https://github.com/zmkfirmware/zmk/pull/836). This allows setups such as split keyboards with more than two halves, or enable a BLE-based "dongle mode" via a third device running ZMK that can stay connected to a computer via USB. + +Note that documentation is still lacking for utilizing more than one peripheral and there will potentially be future changes in the build system to allow for more seamless configuration. + +#### Pairing passkey requirement + +[petejohanson] added [the option to require passkey input](/docs/config/bluetooth) while pairing to new devices in [#1822](https://github.com/zmkfirmware/zmk/pull/1822). Enabling this will require you to enter a six digit passcode via the number keys on your keymap and press enter when pairing to a new device, enhancing security during the pairing procedure. + +#### Split keyboard improvements + +[petejohanson] contributed a fix to release held keys on peripheral disconnect [#1340](https://github.com/zmkfirmware/zmk/pull/1340), which makes scenarios where a split disconnects unexpectedly less painful. + +[petejohanson] also improved [the `settings_reset` shield](/docs/troubleshooting#split-keyboard-halves-unable-to-pair) by making it clear bonds more reliably, and allow it to build for all boards in [#1879](https://github.com/zmkfirmware/zmk/pull/1879). + +[petejohanson] and [xudongzheng] contributed additional split connectivity improvements, via using directed advertising in [#1913](https://github.com/zmkfirmware/zmk/pull/1913) and improving the robustness of central scanning in [#1912](https://github.com/zmkfirmware/zmk/pull/1912). + +### Hardware Support + +#### Encoders + +[petejohanson] contributed a major refactor of encoder (and more generally sensor) functionality in [#1039](https://github.com/zmkfirmware/zmk/pull/1039). While the documentation for these changes are still in progress, check out the [dedicated blog post](/blog/2023/06/18/encoder-refactors) for more details. + +This refactor paved way to implementing a long-awaited feature, encoder support in peripheral halves of split keyboards! Building upon the work by [stephen](https://github.com/stephen) in [#728](https://github.com/zmkfirmware/zmk/pull/728), [petejohanson] implemented support in [#1841](https://github.com/zmkfirmware/zmk/pull/1841). + +#### Direct GPIO driver + +[joelspadin] extended the comprehensive debouncing framework used for matrix scan driver to the [direct GPIO driver](/docs/config/kscan#direct-gpio-driver) in [#1288](https://github.com/zmkfirmware/zmk/pull/1288). + +[kurtis-lew] added toggle mode support for direct GPIO driver in [#1305](https://github.com/zmkfirmware/zmk/pull/1305). This allows for adding toggle switches to a keyboard, by properly reading their initial state on boot and making sure the power use is efficient. + +#### IO peripheral drivers + +[petejohanson] added support for the 595 shift register commonly used with smaller controllers like Seeeduino Xiaos, in [#1325](https://github.com/zmkfirmware/zmk/pull/1325). + +[zhiayang](https://github.com/zhiayang) added the driver for the MAX7318 GPIO expander in [#1295](https://github.com/zmkfirmware/zmk/pull/1295). + +#### Underglow auto-off options + +[ReFil] added two [new RGB auto off options](/docs/config/underglow), one using an idle timeout and the other USB status in [#1010](https://github.com/zmkfirmware/zmk/pull/1010). + +#### nice!view support + +[nicell] added support for nice!view, a memory display optimized for low power use in [#1462](https://github.com/zmkfirmware/zmk/pull/1462). +He also contributed a custom vertically-oriented status screen that is automatically enabled when the `nice_view` shield is used in [#1768](https://github.com/zmkfirmware/zmk/pull/1768), since the default status screen has a horizontal orientation. +Please see the instructions in the [nice!view README](https://github.com/zmkfirmware/zmk/blob/main/app/boards/shields/nice_view/README.md) if you would like to restore the stock status screen. + +#### E-paper display initialization + +[petejohanson] contributed EPD initialization improvements in [#1098](https://github.com/zmkfirmware/zmk/pull/1098), which makes the keyboards using slow refresh displays such as the Corne-ish Zen much more responsive during initial boot. + +#### Xiao BLE improvements + +Various improvements were made for the Seeeduino Xiao BLE board in [#1293](https://github.com/zmkfirmware/zmk/pull/1293), [d0176f36](https://github.com/zmkfirmware/zmk/commit/d0176f36), [#1545](https://github.com/zmkfirmware/zmk/pull/1545) and [#1927](https://github.com/zmkfirmware/zmk/pull/1927) by [petejohanson] and [caksoylar], enabling features necessary for ZMK and improving its power use. + +### Zephyr 3.2 Upgrade + +[petejohanson] once again contributed the massive work necessary for upgrading ZMK to Zephyr 3.2 in [#1499](https://github.com/zmkfirmware/zmk/pull/1499), with review help from [joelspadin] and testing by the community. This Zephyr release brings with it upgrades to the display library LVGL, adds official support for the RP2040 controllers and many internal refactors to help future development. +Check out the [dedicated blog post](/blog/2023/04/06/zephyr-3-2) for more details! + +### Documentation + +#### Configuration docs + +[joelspadin], through a massive amount of work in [#722](https://github.com/zmkfirmware/zmk/pull/722), contributed a whole new section to the documentation: [configuration](/docs/config)! It enumerates the configuration options for each ZMK feature that might be relevant to users in dedicated pages, making it a very handy reference. + +In addition, the [overview page](/docs/config) presents an overview of how configuration works in Zephyr in the context of ZMK, in terms of devicetree files (like the keymap files or shield overlays), and Kconfig ones (like the `.conf` files). It is very helpful in de-mystifying what the various files do and what syntax is expected in them. + +#### New behavior guide + +For users or future contributors that might want to dive into writing their own ZMK behaviors, [kurtis-lew] wrote a useful [guide on how to create new behaviors](/docs/development/new-behavior) in [#1268](https://github.com/zmkfirmware/zmk/pull/1268). + +#### Tap dance and hold-tap documentation improvements + +[kurtis-lew] also improved the documentation for these two behaviors in [#1298](https://github.com/zmkfirmware/zmk/pull/1298), by updating the diagrams to better clarify how their timings work and adding examples for scenarios that are frequently asked by users. + +#### Battery sensor documentation + +[joelspadin] also added documentation for setting up battery sensors, typically required for new boards, in [#868](https://github.com/zmkfirmware/zmk/pull/868). + +#### Shield interconnects + +[petejohanson] updated the [new shield guide](/docs/development/new-shield) for non-Pro Micro interconnects including Xiao, Arduino Uno and Blackpill in [#1607](https://github.com/zmkfirmware/zmk/pull/1607). + +#### Bluetooth feature page + +[petejohanson] and [caksoylar] added a new [Bluetooth feature page](/docs/features/bluetooth) as part of [#1499](https://github.com/zmkfirmware/zmk/pull/1499) and in [#1818](https://github.com/zmkfirmware/zmk/pull/1499), detailing ZMK's Bluetooth implementation and troubleshooting for common problems. + +In addition to the specific contributions listed above, various improvements and fixes to documentation are made by many users from the community, including but not limited to [kurtis-lew], [joelspadin], [filterpaper], [byran.tech](https://github.com/byran.tech), [dxmh] and [caksoylar]. These contributions are are all very appreciated! + +### Miscellaneous + +#### Reusable GitHub build workflow + +[elagil](https://github.com/elagil) helped switch the build workflow used by the [user config repos](/docs/user-setup) to a reusable one in [#1183](https://github.com/zmkfirmware/zmk/pull/1183) and it was further tweaked by [filterpaper] in [#1258](https://github.com/zmkfirmware/zmk/pull/1258). This allows any changes in the workflow to be propagated automatically to users, rather than requiring them to make the updates. The build workflow can be customized by the users [using input parameters](https://github.com/zmkfirmware/zmk/blob/main/.github/workflows/build-user-config.yml#L5) if desired. + +#### Pre-commit hooks + +[joelspadin] added various [pre-commit](https://pre-commit.com/) hooks and added checks to the repo to run them for each commit in [#1651](https://github.com/zmkfirmware/zmk/pull/1651). These hooks and resulting updates standardize formatting across devicetree and other source files, reducing busywork on both contributors and reviewers. + +#### Zephyr usage and other refactors + +[joelspadin] also contributed a few refactor PRs such as [#1269](https://github.com/zmkfirmware/zmk/pull/1269), [#1255](https://github.com/zmkfirmware/zmk/pull/1255) and [#1803](https://github.com/zmkfirmware/zmk/pull/1803), generally improving code quality and bringing the codebase in line with the latest Zephyr conventions. + +[petejohanson] refactored the drivers structure to bring it in line with the current Zephyr conventions for out-of-tree drivers in [#1919](https://github.com/zmkfirmware/zmk/pull/1919). + +#### Updated USB polling interval default + +USB HID polling interval now defaults to 1 ms, i.e. a 1000Hz polling rate, thanks to [joelspadin]'s tweak in [#1271](https://github.com/zmkfirmware/zmk/pull/1271). + +#### Additional display config options + +[caksoylar] added a couple configuration options for displays, including a setting to invert display colors in [#1754](https://github.com/zmkfirmware/zmk/pull/1754) and an option to display the battery percentage for the stock status screen in [#1563](https://github.com/zmkfirmware/zmk/pull/1563). + +## New Shields + +- Eternal keypad [#1136](https://github.com/zmkfirmware/zmk/pull/1136) - [halcyonCorsair](https://github.com/halcyonCorsair) +- nullbits SNAP [#1319](https://github.com/zmkfirmware/zmk/pull/1319) - [jaygreco](https://github.com/jaygreco) +- Aurora Sweep [#1504](https://github.com/zmkfirmware/zmk/pull/1504), Corne [#1520](https://github.com/zmkfirmware/zmk/pull/1520), Lily58 [#1553](https://github.com/zmkfirmware/zmk/pull/1553), Sofle [#1864](https://github.com/zmkfirmware/zmk/pull/1864), and Helix [#1873](https://github.com/zmkfirmware/zmk/pull/1873) - [petejohanson] +- ZMK Uno shield [#1576](https://github.com/zmkfirmware/zmk/pull/1576) - [petejohanson] +- Waterfowl [#1554](https://github.com/zmkfirmware/zmk/pull/1554) - [JW2586](https://github.com/JW2586) +- Kyria Rev 3 [#1627](https://github.com/zmkfirmware/zmk/pull/1627) - [petejohanson] +- Leeloo v2 and Leeloo-Micro [#1762](https://github.com/zmkfirmware/zmk/pull/1762) - [ClicketySplit](https://github.com/ClicketySplit) +- Spaceman Pancake [#1400](https://github.com/zmkfirmware/zmk/pull/1400) - [jasonhazel](https://github.com/jasonhazel) +- Reviung5 [#1548](https://github.com/zmkfirmware/zmk/pull/1548) - [zblesk](https://github.com/zblesk) + +## New Boards + +- RP2040 boards, including Sparkfun Pro Micro, Adafruit KB2040 and Seeeduino Xiao RP2040 were added as part of the Zephyr 3.2 upgrade in [#1499](https://github.com/zmkfirmware/zmk/pull/1499) - [petejohanson] +- Puchi BLE [#1445](https://github.com/zmkfirmware/zmk/pull/1445) - [BenRoe](https://github.com/BenRoe) +- nRFMicro 1.3/1.4 (nRF52833) [#912](https://github.com/zmkfirmware/zmk/pull/912) - [pashutk](https://github.com/pashutk) +- nRF5340 DK [#1562](https://github.com/zmkfirmware/zmk/pull/1562) - [joelspadin] +- PillBug [#1530](https://github.com/zmkfirmware/zmk/pull/1530) - [kylemccreery](https://github.com/kylemccreery) +- Preonic Rev 3 [#1575](https://github.com/zmkfirmware/zmk/pull/1575) - [jeromeOlivier](https://github.com/jeromeOlivier) +- Corne-ish Zen v2 [#1498](https://github.com/zmkfirmware/zmk/pull/1498) and v1 [#1593](https://github.com/zmkfirmware/zmk/pull/1593) - [LOWPROKB](https://github.com/LOWPROKB) and [caksoylar] +- Polarity Works CKP family of boards [#1547](https://github.com/zmkfirmware/zmk/pull/1547) - [ReFil] + +## Coming Soon! + +Some items listed in the last coming soon section are still under active development and other new exciting items are in progress: + +- Automatic/simple BLE profile management +- Soft off support for turning the keyboard "off" through firmware +- Improved automatic power management for devices with multiple peripherals, e.g. OLED displays and RGB LEDs +- Caps/Scroll/Num Lock LED support +- Mouse keys +- Wired split support +- More modular approach to external boards/shields, custom code, user keymaps, etc. +- More shields and boards + +## Statistics + +Some statistics of interest for ZMK: + +- GitHub (lifetime stats) + - 166 Contributors + - 1256 Closed PRs + - 1883 Stars + - 1949 Forks +- Discord Chat + - 8055 total registered (130% up from last SOTF!) +- Website (last 30 days) + - 52K page views + - 4.7K new users + +## Sponsorship + +While ZMK is an open source project that uses the permissive MIT license, below are opportunities for anyone who would like to show their support to the project financially. + +### Open Collective + +The ZMK project has an [Open Collective sponsorship](https://opencollective.com/zmkfirmware) that has been going for two and a half years. +This fund helps pay for project costs like domain registration or development of hardware such as the [ZMK Uno shield](https://github.com/zmkfirmware/zmk-uno). +Note that donations to this fund do _not_ pay for the work of any individual contributor directly. + +### Contributor sponsorships + +Project creator and lead Pete Johanson has a [GitHub sponsorship](https://github.com/sponsors/petejohanson) set up that you can contribute to, in order to directly support his time and efforts in developing and maintaining ZMK. +He has also been traveling full time while focusing on ZMK and keyboard hardware design for more than a year now! +If you are curious, you can check out [his blog post](https://petejohanson.dev/blog/new-journey-2022) on deciding to embark on this adventure, in addition to his thoughts on contributor vs. project sponsorship, and sustainability of open source projects in general. + +## Thanks! + +As the first person to author a State Of The Firmware post besides Pete, I'd like to take the opportunity to thank him for his efforts on leading and developing ZMK, along with fostering a great community of contributors and users around it. + +Also a big thank you to contributors that submit patches and perform reviews, testers that help validate changes, and users that take time out of their day to help out folks with ZMK usage on [Discord channels](https://zmk.dev/community/discord/invite), GitHub issues and other communities. + +[okke-formsma]: https://github.com/okke-formsma +[andrewjrae]: https://github.com/andrewjrae +[xudongzheng]: https://github.com/xudongzheng +[nicell]: https://github.com/Nicell +[petejohanson]: https://github.com/petejohanson +[kurtis-lew]: https://github.com/kurtis-lew +[joelspadin]: https://github.com/joelspadin +[dxmh]: https://github.com/dxmh +[caksoylar]: https://github.com/caksoylar +[urob]: https://github.com/urob +[filterpaper]: https://github.com/filterpaper +[ReFil]: https://github.com/ReFil From fd05478897567bff34d607229636ae4d4507ef0f Mon Sep 17 00:00:00 2001 From: Alex Kang Date: Fri, 6 Oct 2023 12:27:38 -0700 Subject: [PATCH 463/494] feat(shields): Microdox V2 shield definition * Refactor common parts of the Microdox sheild into a separate file. This is in preparation for adding Microdox V2 as another shield in the same directory. * Refactor Microdox keymap into a common file in preparation for Microdox V2 * Add Microdox V2 shield definition * Added a README to explain v1/v2 differences. --- app/boards/shields/microdox/Kconfig.defconfig | 4 +- app/boards/shields/microdox/Kconfig.shield | 6 +++ app/boards/shields/microdox/README.md | 8 +++ app/boards/shields/microdox/microdox.dtsi | 46 +---------------- .../shields/microdox/microdox_common.dtsi | 51 +++++++++++++++++++ app/boards/shields/microdox/microdox_v2.conf | 6 +++ app/boards/shields/microdox/microdox_v2.dtsi | 15 ++++++ .../shields/microdox/microdox_v2.zmk.yml | 13 +++++ .../shields/microdox/microdox_v2_left.conf | 0 .../shields/microdox/microdox_v2_left.overlay | 23 +++++++++ .../shields/microdox/microdox_v2_right.conf | 0 .../microdox/microdox_v2_right.overlay | 32 ++++++++++++ 12 files changed, 157 insertions(+), 47 deletions(-) create mode 100644 app/boards/shields/microdox/README.md create mode 100644 app/boards/shields/microdox/microdox_common.dtsi create mode 100644 app/boards/shields/microdox/microdox_v2.conf create mode 100644 app/boards/shields/microdox/microdox_v2.dtsi create mode 100644 app/boards/shields/microdox/microdox_v2.zmk.yml create mode 100644 app/boards/shields/microdox/microdox_v2_left.conf create mode 100644 app/boards/shields/microdox/microdox_v2_left.overlay create mode 100644 app/boards/shields/microdox/microdox_v2_right.conf create mode 100644 app/boards/shields/microdox/microdox_v2_right.overlay diff --git a/app/boards/shields/microdox/Kconfig.defconfig b/app/boards/shields/microdox/Kconfig.defconfig index d05ae045..e355c641 100644 --- a/app/boards/shields/microdox/Kconfig.defconfig +++ b/app/boards/shields/microdox/Kconfig.defconfig @@ -1,7 +1,7 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT -if SHIELD_MICRODOX_LEFT +if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_V2_LEFT config ZMK_KEYBOARD_NAME default "Microdox" @@ -11,7 +11,7 @@ config ZMK_SPLIT_ROLE_CENTRAL endif -if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT +if SHIELD_MICRODOX_LEFT || SHIELD_MICRODOX_RIGHT || SHIELD_MICRODOX_V2_LEFT || SHIELD_MICRODOX_V2_RIGHT config ZMK_SPLIT default y diff --git a/app/boards/shields/microdox/Kconfig.shield b/app/boards/shields/microdox/Kconfig.shield index 47543760..e0f461ff 100644 --- a/app/boards/shields/microdox/Kconfig.shield +++ b/app/boards/shields/microdox/Kconfig.shield @@ -6,3 +6,9 @@ config SHIELD_MICRODOX_LEFT config SHIELD_MICRODOX_RIGHT def_bool $(shields_list_contains,microdox_right) + +config SHIELD_MICRODOX_V2_LEFT + def_bool $(shields_list_contains,microdox_v2_left) + +config SHIELD_MICRODOX_V2_RIGHT + def_bool $(shields_list_contains,microdox_v2_right) diff --git a/app/boards/shields/microdox/README.md b/app/boards/shields/microdox/README.md new file mode 100644 index 00000000..f92807bb --- /dev/null +++ b/app/boards/shields/microdox/README.md @@ -0,0 +1,8 @@ +# Microdox + +Microdox is a 36 key split keyboard by Boardsource. + +Two variants are defined for this shield – V1 and V2. The layout is exactly the same between the +two. Per [help documentation](https://www.boardsource.xyz/help/6129be4a9c85c6050be190d2), if you +purchased your PCB before April 2022, use `microdox_left`/`microdox_right`. Otherwise, use +`microdox_v2_left`/`microdox_v2_right`. diff --git a/app/boards/shields/microdox/microdox.dtsi b/app/boards/shields/microdox/microdox.dtsi index e02aa554..57247e68 100644 --- a/app/boards/shields/microdox/microdox.dtsi +++ b/app/boards/shields/microdox/microdox.dtsi @@ -4,35 +4,12 @@ * SPDX-License-Identifier: MIT */ -#include +#include "microdox_common.dtsi" / { - chosen { - zephyr,display = &oled; - zmk,kscan = &kscan0; - zmk,matrix_transform = &default_transform; - }; - - default_transform: keymap_transform_0 { - compatible = "zmk,matrix-transform"; - columns = <10>; - rows = <4>; -// | SW1 | SW2 | SW3 | SW4 | SW5 | | SW5 | SW4 | SW3 | SW2 | SW1 | -// | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 | -// | SW11 | SW12 | SW13 | SW14 | SW15 | | SW15 | SW14 | SW13 | SW12 | SW11 | -// | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | - map = < -RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) -RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) -RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) - RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) - >; - }; - kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; - diode-direction = "col2row"; row-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> @@ -40,26 +17,5 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - - }; - - // TODO: per-key RGB node(s)? -}; - -&pro_micro_i2c { - status = "okay"; - - oled: ssd1306@3c { - compatible = "solomon,ssd1306fb"; - reg = <0x3c>; - label = "DISPLAY"; - width = <128>; - height = <32>; - segment-offset = <0>; - page-offset = <0>; - display-offset = <0>; - multiplex-ratio = <31>; - com-sequential; - prechargep = <0x22>; }; }; diff --git a/app/boards/shields/microdox/microdox_common.dtsi b/app/boards/shields/microdox/microdox_common.dtsi new file mode 100644 index 00000000..0460e012 --- /dev/null +++ b/app/boards/shields/microdox/microdox_common.dtsi @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zephyr,display = &oled; + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <10>; + rows = <4>; +// | SW1 | SW2 | SW3 | SW4 | SW5 | | SW5 | SW4 | SW3 | SW2 | SW1 | +// | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 | +// | SW11 | SW12 | SW13 | SW14 | SW15 | | SW15 | SW14 | SW13 | SW12 | SW11 | +// | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) + RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) + >; + }; + + // TODO: per-key RGB node(s)? +}; + +&pro_micro_i2c { + status = "okay"; + oled: ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/microdox/microdox_v2.conf b/app/boards/shields/microdox/microdox_v2.conf new file mode 100644 index 00000000..0d38398c --- /dev/null +++ b/app/boards/shields/microdox/microdox_v2.conf @@ -0,0 +1,6 @@ +# Uncomment the following lines to enable the Microdox RGB Underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y + +# Uncomment the following line to enable the Microdox OLED Display +# CONFIG_ZMK_DISPLAY=y diff --git a/app/boards/shields/microdox/microdox_v2.dtsi b/app/boards/shields/microdox/microdox_v2.dtsi new file mode 100644 index 00000000..93fa4445 --- /dev/null +++ b/app/boards/shields/microdox/microdox_v2.dtsi @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "microdox_common.dtsi" + +/ { + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + }; +}; diff --git a/app/boards/shields/microdox/microdox_v2.zmk.yml b/app/boards/shields/microdox/microdox_v2.zmk.yml new file mode 100644 index 00000000..1b9b65b3 --- /dev/null +++ b/app/boards/shields/microdox/microdox_v2.zmk.yml @@ -0,0 +1,13 @@ +file_format: "1" +id: microdox_v2 +name: Microdox V2 +type: shield +url: https://boardsource.xyz/store/5f2e7e4a2902de7151494f92 +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display +siblings: + - microdox_v2_left + - microdox_v2_right diff --git a/app/boards/shields/microdox/microdox_v2_left.conf b/app/boards/shields/microdox/microdox_v2_left.conf new file mode 100644 index 00000000..e69de29b diff --git a/app/boards/shields/microdox/microdox_v2_left.overlay b/app/boards/shields/microdox/microdox_v2_left.overlay new file mode 100644 index 00000000..83326f6f --- /dev/null +++ b/app/boards/shields/microdox/microdox_v2_left.overlay @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "microdox_v2.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + ; + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 0 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; +}; diff --git a/app/boards/shields/microdox/microdox_v2_right.conf b/app/boards/shields/microdox/microdox_v2_right.conf new file mode 100644 index 00000000..e69de29b diff --git a/app/boards/shields/microdox/microdox_v2_right.overlay b/app/boards/shields/microdox/microdox_v2_right.overlay new file mode 100644 index 00000000..412c42f6 --- /dev/null +++ b/app/boards/shields/microdox/microdox_v2_right.overlay @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "microdox.dtsi" + +&default_transform { + col-offset = <5>; +}; + +&oled { + segment-remap; + com-invdir; +}; + +&kscan0 { + col-gpios + = <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 21 GPIO_ACTIVE_HIGH> + ; + row-gpios + = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; +}; From 8a84b7dd5b843e69c8a2e74409c282cd3056c4ce Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Sun, 8 Oct 2023 18:30:23 -0500 Subject: [PATCH 464/494] fix(shields): Fix incorrect union access in nice view Fixed an error in a previous commit where a member of the selected endpoint was used without checking if it was the correct transport type. The nice!view status screen displays the active BLE profile regardless of whether BLE is active, so we have to get that data directly from the BLE code instead of from the selected endpoint. --- app/boards/shields/nice_view/widgets/status.c | 5 ++++- app/boards/shields/nice_view/widgets/util.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/boards/shields/nice_view/widgets/status.c b/app/boards/shields/nice_view/widgets/status.c index c629be50..453fd650 100644 --- a/app/boards/shields/nice_view/widgets/status.c +++ b/app/boards/shields/nice_view/widgets/status.c @@ -30,6 +30,7 @@ static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets); struct output_status_state { struct zmk_endpoint_instance selected_endpoint; + int active_profile_index; bool active_profile_connected; bool active_profile_bonded; }; @@ -146,7 +147,7 @@ static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], const struct status }; for (int i = 0; i < 5; i++) { - bool selected = state->selected_endpoint.ble.profile_index == i; + bool selected = i == state->active_profile_index; lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 359, &arc_dsc); @@ -228,6 +229,7 @@ ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed); static void set_output_status(struct zmk_widget_status *widget, const struct output_status_state *state) { widget->state.selected_endpoint = state->selected_endpoint; + widget->state.active_profile_index = state->active_profile_index; widget->state.active_profile_connected = state->active_profile_connected; widget->state.active_profile_bonded = state->active_profile_bonded; @@ -243,6 +245,7 @@ static void output_status_update_cb(struct output_status_state state) { static struct output_status_state output_status_get_state(const zmk_event_t *_eh) { return (struct output_status_state){ .selected_endpoint = zmk_endpoints_selected(), + .active_profile_index = zmk_ble_active_profile_index(), .active_profile_connected = zmk_ble_active_profile_is_connected(), .active_profile_bonded = !zmk_ble_active_profile_is_open(), }; diff --git a/app/boards/shields/nice_view/widgets/util.h b/app/boards/shields/nice_view/widgets/util.h index e2d2782a..fbcb616f 100644 --- a/app/boards/shields/nice_view/widgets/util.h +++ b/app/boards/shields/nice_view/widgets/util.h @@ -20,6 +20,7 @@ struct status_state { bool charging; #if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) struct zmk_endpoint_instance selected_endpoint; + int active_profile_index; bool active_profile_connected; bool active_profile_bonded; uint8_t layer_index; From 791711b5556adee55ff9f9c68cdf4ab7fa0be117 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Sat, 2 Sep 2023 14:22:18 -0700 Subject: [PATCH 465/494] feat(docs): Note how to use GPIO outside interconnect definition --- docs/docs/development/new-shield.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 18616923..055afcf6 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -120,6 +120,10 @@ endif +To use GPIO pins that are not part of the interconnects as described above, you can use the GPIO labels that are specific to each controller type. +For instance, pins numbered `PX.Y` in nRF52840-based boards can be referred to via `&gpioX Y` labels. +An example is `&gpio1 7` for the `P1.07` pin that the nice!nano exposes in the middle of the board. + Date: Tue, 21 Mar 2023 14:36:53 +0100 Subject: [PATCH 466/494] feat(shields): add right encoders support to waterfowl --- app/boards/shields/waterfowl/waterfowl.dtsi | 45 ++++++++++++++----- app/boards/shields/waterfowl/waterfowl.keymap | 30 ++++++++++--- .../shields/waterfowl/waterfowl_left.overlay | 6 ++- .../shields/waterfowl/waterfowl_right.overlay | 7 ++- 4 files changed, 70 insertions(+), 18 deletions(-) diff --git a/app/boards/shields/waterfowl/waterfowl.dtsi b/app/boards/shields/waterfowl/waterfowl.dtsi index 7f4929b3..3d914094 100644 --- a/app/boards/shields/waterfowl/waterfowl.dtsi +++ b/app/boards/shields/waterfowl/waterfowl.dtsi @@ -40,28 +40,53 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> ; - }; - left_encoder: encoder_left { //roller + roller_left_encoder: encoder_left_roller { compatible = "alps,ec11"; - label = "LEFT_ENCODER"; - a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + label = "ROLLER_LEFT_ENCODER"; + a-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; }; - right_encoder: encoder_right { //Standard encoder on left half + dial_left_encoder: encoder_left_dial { compatible = "alps,ec11"; - label = "RIGHT_ENCODER"; + label = "DIAL_LEFT_ENCODER"; a-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <2>; + steps = <80>; + status = "disabled"; + }; + + roller_right_encoder: encoder_right_roller { + compatible = "alps,ec11"; + label = "ROLLER_RIGHT_ENCODER"; + a-gpios = <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; + }; + + dial_right_encoder: encoder_right_dial { + compatible = "alps,ec11"; + label = "DIAL_RIGHT_ENCODER"; + a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + steps = <80>; + status = "disabled"; }; sensors { compatible = "zmk,keymap-sensors"; - sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; + sensors = < + &roller_left_encoder + &dial_left_encoder + &dial_right_encoder + &roller_right_encoder + >; }; // TODO: RGB node(s) diff --git a/app/boards/shields/waterfowl/waterfowl.keymap b/app/boards/shields/waterfowl/waterfowl.keymap index c47f188b..197a34fa 100644 --- a/app/boards/shields/waterfowl/waterfowl.keymap +++ b/app/boards/shields/waterfowl/waterfowl.keymap @@ -33,7 +33,12 @@ &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + sensor-bindings = < + &inc_dec_kp PAGE_DOWN PAGE_UP + &inc_dec_kp C_VOL_DN C_VOL_UP + &inc_dec_kp DOWN UP + &inc_dec_kp LEFT RIGHT + >; }; navnum_layer { @@ -57,7 +62,12 @@ &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + sensor-bindings = < + &inc_dec_kp PAGE_DOWN PAGE_UP + &inc_dec_kp C_VOL_DN C_VOL_UP + &inc_dec_kp DOWN UP + &inc_dec_kp LEFT RIGHT + >; }; symbol_layer { @@ -81,7 +91,12 @@ &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + sensor-bindings = < + &inc_dec_kp PAGE_DOWN PAGE_UP + &inc_dec_kp C_VOL_DN C_VOL_UP + &inc_dec_kp DOWN UP + &inc_dec_kp LEFT RIGHT + >; }; function_layer { @@ -105,8 +120,13 @@ &kp N1 < 3 DEL < 1 SPACE &kp TAB &kp N2 &kp N3 &kp ESC &kp BSPC < 2 RET &kp N4 >; - sensor-bindings = <&inc_dec_kp PAGE_UP PAGE_DOWN &inc_dec_kp TAB LS(TAB)>; + sensor-bindings = < + &inc_dec_kp PAGE_DOWN PAGE_UP + &inc_dec_kp C_VOL_DN C_VOL_UP + &inc_dec_kp DOWN UP + &inc_dec_kp LEFT RIGHT + >; }; }; -}; \ No newline at end of file +}; diff --git a/app/boards/shields/waterfowl/waterfowl_left.overlay b/app/boards/shields/waterfowl/waterfowl_left.overlay index 3b9fd42d..d58c2876 100644 --- a/app/boards/shields/waterfowl/waterfowl_left.overlay +++ b/app/boards/shields/waterfowl/waterfowl_left.overlay @@ -16,6 +16,10 @@ ; }; -&left_encoder { +&roller_left_encoder { + status = "okay"; +}; + +&dial_left_encoder { status = "okay"; }; diff --git a/app/boards/shields/waterfowl/waterfowl_right.overlay b/app/boards/shields/waterfowl/waterfowl_right.overlay index bf8f3a44..cb23b29a 100644 --- a/app/boards/shields/waterfowl/waterfowl_right.overlay +++ b/app/boards/shields/waterfowl/waterfowl_right.overlay @@ -20,7 +20,10 @@ ; }; - -&right_encoder { +&roller_right_encoder { + status = "okay"; +}; + +&dial_right_encoder { status = "okay"; }; From 4a339093cebd9e89e531f78dc218907a292cbb1b Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 6 Oct 2023 22:02:23 -0500 Subject: [PATCH 467/494] docs: Add highlighting for devicetree and kconfig Added syntax highlighting for devicetree and kconfig files. The PrismJS project is not accepting contributions right now as they work on a version 2 of the library, so the new language files are added directly here. Also enabled syntax highlighting for various languages that are used in the docs but aren't enabled in Docusaurus by default. --- docs/docusaurus.config.js | 15 ++++ docs/src/theme/prism-include-languages.js | 23 ++++++ .../prism/components/prism-devicetree.js | 41 +++++++++++ .../theme/prism/components/prism-kconfig.js | 44 +++++++++++ .../theme/prism/themes/github-dark-dimmed.js | 73 +++++++++++++++++++ docs/src/theme/prism/themes/github.js | 73 +++++++++++++++++++ 6 files changed, 269 insertions(+) create mode 100644 docs/src/theme/prism-include-languages.js create mode 100644 docs/src/theme/prism/components/prism-devicetree.js create mode 100644 docs/src/theme/prism/components/prism-kconfig.js create mode 100644 docs/src/theme/prism/themes/github-dark-dimmed.js create mode 100644 docs/src/theme/prism/themes/github.js diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index e039d369..701b5b99 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,4 +1,6 @@ const path = require("path"); +const theme = require("./src/theme/prism/themes/github"); +const darkTheme = require("./src/theme/prism/themes/github-dark-dimmed"); module.exports = { title: "ZMK Firmware", @@ -20,6 +22,19 @@ module.exports = { colorMode: { respectPrefersColorScheme: true, }, + prism: { + additionalLanguages: [ + "bash", + "c", + "cmake", + "ini", + "linker-script", + "log", + "powershell", + ], + theme, + darkTheme, + }, // sidebarCollapsible: false, navbar: { title: "ZMK Firmware", diff --git a/docs/src/theme/prism-include-languages.js b/docs/src/theme/prism-include-languages.js new file mode 100644 index 00000000..c073923b --- /dev/null +++ b/docs/src/theme/prism-include-languages.js @@ -0,0 +1,23 @@ +import siteConfig from "@generated/docusaurus.config"; +export default function prismIncludeLanguages(PrismObject) { + const { + themeConfig: { prism }, + } = siteConfig; + const { additionalLanguages } = prism; + // Prism components work on the Prism instance on the window, while prism- + // react-renderer uses its own Prism instance. We temporarily mount the + // instance onto window, import components to enhance it, then remove it to + // avoid polluting global namespace. + // You can mutate PrismObject: registering plugins, deleting languages... As + // long as you don't re-assign it + globalThis.Prism = PrismObject; + additionalLanguages.forEach((lang) => { + // eslint-disable-next-line global-require + require(`prismjs/components/prism-${lang}`); + }); + + require("./prism/components/prism-devicetree.js"); + require("./prism/components/prism-kconfig.js"); + + delete globalThis.Prism; +} diff --git a/docs/src/theme/prism/components/prism-devicetree.js b/docs/src/theme/prism/components/prism-devicetree.js new file mode 100644 index 00000000..22e638c6 --- /dev/null +++ b/docs/src/theme/prism/components/prism-devicetree.js @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/* eslint-disable no-undef */ + +Prism.languages.devicetree = { + comment: Prism.languages.c["comment"], + string: Prism.languages.c["string"], + keyword: + /\/(?:bits|delete-node|delete-property|dts-v1|incbin|include|memreserve|omit-if-no-ref|plugin)\//, + label: { + pattern: /\b(?:[a-z_]\w*):/i, + alias: "symbol", + }, + reference: { + pattern: /&(?:[a-z_]\w*|\{[\w,.+*#?@/-]*\})/i, + alias: "variable", + }, + node: { + pattern: /(?:\/|\b[\w,.+\-@]+)(?=\s*\{)/, + alias: "class-name", + inside: { + // Node address + number: { + pattern: /(@)[0-9a-f,]/i, + lookbehind: true, + }, + }, + }, + function: Prism.languages.c["function"], + "attr-name": /\\?[\w,.+*#?@-]+(?=\s*[=;])/, + number: [/\b[0-9a-f]{2}\b/i, /\b(?:0[xX][0-9a-fA-F]+|\d+)(?:ULL|UL|LL|U|L)?/], + macro: Prism.languages.c["macro"], + operator: /<<|>>|[<>]=?|[!=]=?|&&?|\|\|?|[+\-*/%~?^]/, + punctuation: /[{}[\];(),.]/, +}; + +Prism.languages.dts = Prism.languages.devicetree; diff --git a/docs/src/theme/prism/components/prism-kconfig.js b/docs/src/theme/prism/components/prism-kconfig.js new file mode 100644 index 00000000..f911d6e3 --- /dev/null +++ b/docs/src/theme/prism/components/prism-kconfig.js @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/* eslint-disable no-undef */ + +Prism.languages.kconfig = { + comment: { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + greedy: true, + }, + string: /"(?:\\.|[^\\\r\n"])*"/, + helptext: { + // help text ends at the first line at a lower level of indentation than the + // first line of text. + pattern: /(^\s*)(?:help|---help---)\s*^(\s+)(?:.+)(?:\s*^\2[^\n]*)*/m, + lookbehind: true, + alias: "string", + inside: { + keyword: /^(?:help|---help---)/, + }, + }, + keyword: + /\b(?:allnoconfig_y|bool|boolean|choice|comment|config|def_bool|def_hex|def_int|def_string|def_tristate|default|defconfig_list|depends|endchoice|endif|endmenu|env|hex|if|imply|int|mainmenu|menu|menuconfig|modules|on|option|optional|orsource|osource|prompt|range|rsource|select|source|string|tristate|visible)\b/, + expansion: { + pattern: /\$\([\s\S]+\)/, + alias: "variable", + inside: { + function: /\$\(|\)/, + punctuation: /,/, + }, + }, + number: /\b(?:0[xX][0-9a-fA-F]+|\d+)/, + boolean: { + pattern: /\b(?:y|n|m)\b/, + alias: "number", + }, + variable: /\b[A-Z_]+\b/, + operator: /[<>]=?|[!=]=?|&&|\|\|/, + punctuation: /[()]/, +}; diff --git a/docs/src/theme/prism/themes/github-dark-dimmed.js b/docs/src/theme/prism/themes/github-dark-dimmed.js new file mode 100644 index 00000000..210742bb --- /dev/null +++ b/docs/src/theme/prism/themes/github-dark-dimmed.js @@ -0,0 +1,73 @@ +/* + Converted from https://github.com/highlightjs/highlight.js/blob/main/src/styles/github-dark-dimmed.css + + BSD 3-Clause License + + Copyright (c) 2006, Ivan Sagalaev. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** @type {import("prism-react-renderer").PrismTheme} */ +const theme = { + plain: { color: "#adbac7", backgroundColor: "#22272e" }, + styles: [ + { types: ["keyword", "atrule"], style: { color: "#f47067" } }, + { types: ["class-name", "function"], style: { color: "#dcbdfb" } }, + { + types: [ + "attr-name", + "boolean", + "important", + "doctype", + "prolog", + "cdata", + "number", + "operator", + "variable", + "selector", + ], + style: { color: "#6cb6ff" }, + }, + { types: ["regex", "string", "char", "url"], style: { color: "#96d0ff" } }, + { types: ["builtin", "symbol", "entity"], style: { color: "#f69d50" } }, + { types: ["comment"], style: { color: "#768390" } }, + { types: ["italic"], style: { color: "#adbac7", fontStyle: "italic" } }, + { types: ["bold"], style: { color: "#adbac7", fontWeight: "bold" } }, + { + types: ["inserted"], + style: { color: "#b4f1b4", backgroundColor: "#1b4721" }, + }, + { + types: ["deleted"], + style: { color: "#ffd8d3", backgroundColor: "#78191b" }, + }, + { types: ["property", "punctuation", "tag"], style: {} }, + ], +}; + +module.exports = theme; diff --git a/docs/src/theme/prism/themes/github.js b/docs/src/theme/prism/themes/github.js new file mode 100644 index 00000000..b0be14c3 --- /dev/null +++ b/docs/src/theme/prism/themes/github.js @@ -0,0 +1,73 @@ +/* + Converted from https://github.com/highlightjs/highlight.js/blob/main/src/styles/github.css + + BSD 3-Clause License + + Copyright (c) 2006, Ivan Sagalaev. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** @type {import("prism-react-renderer").PrismTheme} */ +const theme = { + plain: { color: "#24292e", backgroundColor: "#f9f9f9" }, + styles: [ + { types: ["keyword", "atrule"], style: { color: "#d73a49" } }, + { types: ["class-name", "function"], style: { color: "#6f42c1" } }, + { + types: [ + "attr-name", + "boolean", + "important", + "doctype", + "prolog", + "cdata", + "number", + "operator", + "variable", + "selector", + ], + style: { color: "#005cc5" }, + }, + { types: ["regex", "string", "char", "url"], style: { color: "#032f62" } }, + { types: ["builtin", "symbol", "entity"], style: { color: "#e36209" } }, + { types: ["comment"], style: { color: "#6a737d" } }, + { types: ["italic"], style: { color: "#24292e", fontStyle: "italic" } }, + { types: ["bold"], style: { color: "#24292e", fontWeight: "bold" } }, + { + types: ["inserted"], + style: { color: "#22863a", backgroundColor: "#f0fff4" }, + }, + { + types: ["deleted"], + style: { color: "#b31d28", backgroundColor: "#ffeef0" }, + }, + { types: ["property", "punctuation", "tag"], style: {} }, + ], +}; + +module.exports = theme; From 65667b863ad380955da60d38ac2ae81b4dab06f5 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 6 Oct 2023 22:05:49 -0500 Subject: [PATCH 468/494] docs: Add syntax highlighting to more code blocks Added language tags to more code blocks in the documentation to enable syntax highlighting. --- docs/README.md | 6 ++-- docs/blog/2020-10-03-bootloader-fix.md | 6 ++-- docs/blog/2020-11-09-zmk-sotf-3.md | 4 +-- docs/blog/2021-01-27-zmk-sotf-4.md | 8 ++--- docs/blog/2022-04-02-zephyr-3-0.md | 26 +++++++------- docs/blog/2022-04-10-zmk-sotf-5.md | 10 +++--- docs/blog/2023-04-06-zephyr-3-2.md | 30 ++++++++-------- docs/blog/2023-06-18-encoder-refactors.md | 10 +++--- docs/docs/behaviors/backlight.md | 6 ++-- docs/docs/behaviors/bluetooth.md | 10 +++--- docs/docs/behaviors/caps-word.md | 8 ++--- docs/docs/behaviors/hold-tap.md | 18 +++++----- docs/docs/behaviors/key-press.md | 4 +-- docs/docs/behaviors/key-repeat.md | 4 +-- docs/docs/behaviors/key-toggle.md | 2 +- docs/docs/behaviors/layers.md | 14 ++++---- docs/docs/behaviors/macros.md | 26 +++++++------- docs/docs/behaviors/misc.md | 4 +-- docs/docs/behaviors/mod-morph.md | 8 ++--- docs/docs/behaviors/mod-tap.md | 4 +-- docs/docs/behaviors/outputs.md | 8 ++--- docs/docs/behaviors/power.md | 8 ++--- docs/docs/behaviors/reset.md | 4 +-- docs/docs/behaviors/sensor-rotate.md | 4 +-- docs/docs/behaviors/sticky-key.md | 8 ++--- docs/docs/behaviors/sticky-layer.md | 4 +-- docs/docs/behaviors/tap-dance.md | 4 +-- docs/docs/behaviors/underglow.md | 6 ++-- docs/docs/config/index.md | 16 ++++----- docs/docs/config/kscan.md | 12 +++---- docs/docs/customization.md | 4 +-- docs/docs/development/build-flash.md | 10 +++--- docs/docs/development/ide-integration.md | 2 +- docs/docs/development/new-behavior.md | 4 +-- docs/docs/development/new-shield.md | 44 ++++++++++------------- docs/docs/development/posix-board.md | 4 +-- docs/docs/development/usb-logging.md | 6 ++-- docs/docs/features/backlight.md | 24 ++++++------- docs/docs/features/battery.md | 2 +- docs/docs/features/beta-testing.md | 6 ++-- docs/docs/features/bluetooth.md | 4 +-- docs/docs/features/combos.md | 2 +- docs/docs/features/conditional-layers.md | 2 +- docs/docs/features/debouncing.md | 4 +-- docs/docs/features/encoders.md | 4 +-- docs/docs/features/keymaps.md | 10 +++--- docs/docs/features/underglow.md | 12 +++---- docs/docs/keymap-example-file.md | 2 +- docs/docs/keymap-example.md | 2 +- docs/docs/user-setup.md | 6 ++-- 50 files changed, 215 insertions(+), 221 deletions(-) diff --git a/docs/README.md b/docs/README.md index fab8b874..1fd6775d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,13 +8,13 @@ The ZMK Documentation is licensed [CC-BY-NC-SA](http://creativecommons.org/licen ### Installation -``` +```sh $ npm ci ``` ### Local Development -``` +```sh $ npm start ``` @@ -22,7 +22,7 @@ This command starts a local development server and open up a browser window. Mos ### Build -``` +```sh $ npm build ``` diff --git a/docs/blog/2020-10-03-bootloader-fix.md b/docs/blog/2020-10-03-bootloader-fix.md index ec1d7b0b..435034cf 100644 --- a/docs/blog/2020-10-03-bootloader-fix.md +++ b/docs/blog/2020-10-03-bootloader-fix.md @@ -77,7 +77,7 @@ So first I enabled logging of the NVS module by adding `CONFIG_NVS_LOG_LEVEL_DBG=y` to my `.conf` file. I repeated the same test of spamming RGB underglow effect cycle and the resulting logs I got were this: -``` +```log [00:00:00.000,671] fs_nvs: 8 Sectors of 4096 bytes [00:00:00.000,671] fs_nvs: alloc wra: 3, f70 [00:00:00.000,671] fs_nvs: data wra: 3, f40 @@ -130,7 +130,7 @@ and [Dan Halbert](https://github.com/dhalbert) pointed me towards the [linker map](https://github.com/adafruit/Adafruit_nRF52_Bootloader/blob/master/linker/nrf52840.ld) of the nRF52840. Let's take a look. -``` +```linker-script FLASH (rx) : ORIGIN = 0xF4000, LENGTH = 0xFE000-0xF4000-2048 /* 38 KB */ BOOTLOADER_CONFIG (r): ORIGIN = 0xFE000 - 2048, LENGTH = 2048 @@ -166,7 +166,7 @@ Now that we've found the issue, we can pretty easily fix this. We'll need to move the settings flash area back so that it doesn't overlap with the bootloader. First we calculate the size of the of flash area the bootloader is using. -``` +```linker-script 0x100000 (end of flash) - 0x0F4000 (start of bootloader) = 0xC000 (48KB) ``` diff --git a/docs/blog/2020-11-09-zmk-sotf-3.md b/docs/blog/2020-11-09-zmk-sotf-3.md index 9e250a99..11d67040 100644 --- a/docs/blog/2020-11-09-zmk-sotf-3.md +++ b/docs/blog/2020-11-09-zmk-sotf-3.md @@ -30,7 +30,7 @@ This also laid the foundation for the other keymap related changes that are now [okke-formsma] added the ability to apply modifiers to a code, e.g.: -``` +```dts &kp LC(C) ``` @@ -63,7 +63,7 @@ and nice!nano that have specialized hardware for this purpose. With this change, you can add -``` +```dts &ext_power EP_TOG ``` diff --git a/docs/blog/2021-01-27-zmk-sotf-4.md b/docs/blog/2021-01-27-zmk-sotf-4.md index e7ff3232..fbb53e40 100644 --- a/docs/blog/2021-01-27-zmk-sotf-4.md +++ b/docs/blog/2021-01-27-zmk-sotf-4.md @@ -25,7 +25,7 @@ The initial [combos](/docs/features/combos) work has landed! The amazing [okke-f An example, that would send the `ESC` keycode when pressing both the first and second positions on your keyboard: -``` +```dts / { combos { compatible = "zmk,combos"; @@ -46,13 +46,13 @@ Combos currently are "global", and not scoped to a given active layer. There is [okke-formsma] also contributed the initial "sticky keys" behavior, which can be used for functionality sometimes called "one shot mods" or "one shot layers". In your keymap, this would like like: -``` +```dts &sk LEFT_CONTROL ``` for a sticky key/modifier, or: -``` +```dts &sl NAV ``` @@ -68,7 +68,7 @@ This is most frequently used when using multiple core base layers with different [okke-formsma] added an implementation of the "Grave Escape" behavior, developing a more generic "mod-morph" behavior to do so. Adding -``` +```dts &gresc ``` diff --git a/docs/blog/2022-04-02-zephyr-3-0.md b/docs/blog/2022-04-02-zephyr-3-0.md index 103573c6..6ec4c904 100644 --- a/docs/blog/2022-04-02-zephyr-3-0.md +++ b/docs/blog/2022-04-02-zephyr-3-0.md @@ -29,12 +29,12 @@ Existing user config repositories using Github Actions to build will pull down Z - Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found - Locate and delete the lines for the DTS output step, which is no longer needed: - ``` - - name: ${{ steps.variables.outputs.display-name }} DTS File - if: ${{ always() }} - run: | - if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi - if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + ```yaml + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi ``` :::note @@ -76,7 +76,7 @@ The following changes have [already been completed](https://github.com/zmkfirmwa Zephyr's WS2812 `led_strip` driver added a new required property. When adding [underglow](/docs/features/underglow#adding-rgb-underglow-to-a-board) to a board, you now must also add the additional include `#include ` at the top of your devicetree file, and add a `color-mapping` property like: -``` +```dts led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; label = "WS2812"; @@ -108,7 +108,7 @@ Zephyr moved to using a `chosen` node named `zephyr,display` to select the displ For example, for a shield with: -``` +```dts &pro_micro_i2c { status = "okay"; @@ -132,7 +132,7 @@ For example, for a shield with: You would add a `chosen` node like: -``` +```dts / { chosen { zephyr,display = &oled; @@ -148,7 +148,7 @@ two sections of the `.dts` file need updating. Underneath the USB device, add the CDC ACM node: -``` +```dts &usbd { status = "okay"; cdc_acm_uart: cdc_acm_uart { @@ -160,7 +160,7 @@ Underneath the USB device, add the CDC ACM node: Then, an additional `chosen` node (near the top of the file) will mark the CDC ACM device as the console: -``` +```dts / { chosen { ... @@ -175,7 +175,7 @@ Then, an additional `chosen` node (near the top of the file) will mark the CDC A Previously, to get ZMK to build a UF2 image to flash to a given board required adding a `CMakeLists.txt` file that added a custom post build command. Now, the only thing necessary to have Zephyr build a UF2 is to add the following to your `_defconfig` file: -``` +```ini CONFIG_BUILD_OUTPUT_UF2=y ``` @@ -187,7 +187,7 @@ For more details on the implementation, see [zephyr#31066](https://github.com/ze Clock configuration moved to devicetree as well, out of the Kconfig files. Here is a sample config for a board that uses the HSI for the PLL source: -``` +```dts &clk_hsi { status = "okay"; }; diff --git a/docs/blog/2022-04-10-zmk-sotf-5.md b/docs/blog/2022-04-10-zmk-sotf-5.md index b0dd6310..4ea62a31 100644 --- a/docs/blog/2022-04-10-zmk-sotf-5.md +++ b/docs/blog/2022-04-10-zmk-sotf-5.md @@ -32,7 +32,7 @@ to the host capitalized until a non-alpha, non-"continue list" keycode is sent. [petejohanson], taking heavy inspiration on the initial work from [okke-formsma], added [macro support](/docs/behaviors/macros) in [#1168](https://github.com/zmkfirmware/zmk/pull/1166). Several [common patterns](/docs/behaviors/macros#common-patterns) are documented, but one example, changing the underglow color as you activate/deactivate a layer, looks like: -``` +```dts ZMK_MACRO(layer_color_macro, wait-ms = <0>; tap-ms = <0>; @@ -50,7 +50,7 @@ ZMK_MACRO(layer_color_macro, [kurtis-lew] worked diligently to add the [tap-dance behavior](/docs/behaviors/tap-dance) in [#1139](https://github.com/zmkfirmware/zmk/pull/1139), allowing different behaviors to be invoked based on the number of times a user taps a single key in their keymap, e.g. -``` +```dts / { behaviors { td0: tap_dance_0 { @@ -80,7 +80,7 @@ a user taps a single key in their keymap, e.g. Example: -``` +```dts / { conditional_layers { compatible = "zmk,conditional-layers"; @@ -164,7 +164,7 @@ using "high voltage mode" with that SoC. [petejohanson]'s work on the HID foundation also included adding support for full NKRO HID in [#726](https://github.com/zmkfirmware/zmk/pull/726) that can be enabled by adding the following to your `.conf` file for your config: -``` +```ini CONFIG_ZMK_HID_REPORT_TYPE_NKRO=y ``` @@ -176,7 +176,7 @@ It's been live for a while, but [nicell] added an amazing [power profiler](/powe [malinges](https://github.com/malinges) added support for configuring min/max underglow brightness in [#944](https://github.com/zmkfirmware/zmk/pull/944) by setting the values in your `.conf` file as percentages of full: -``` +```ini CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=20 CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 ``` diff --git a/docs/blog/2023-04-06-zephyr-3-2.md b/docs/blog/2023-04-06-zephyr-3-2.md index 693d93dc..69ecb6dd 100644 --- a/docs/blog/2023-04-06-zephyr-3-2.md +++ b/docs/blog/2023-04-06-zephyr-3-2.md @@ -26,7 +26,7 @@ Existing user config repositories using Github Actions to build will pull down Z 1. Replace the contents of your `.github/workflows/build.yml` with: - ``` + ```yaml on: [push, pull_request, workflow_dispatch] jobs: @@ -36,7 +36,7 @@ Existing user config repositories using Github Actions to build will pull down Z 1. If it doesn't exist already, add a new file to your repository named `build.yaml`: - ``` + ```yaml # This file generates the GitHub Actions matrix # For simple board + shield combinations, add them # to the top level board and shield arrays, for more @@ -63,12 +63,12 @@ If you have a custom GitHub Actions workflow you need to maintain for some reaso - Change `zmkfirmware/zmk-build-arm:2.5` to `zmkfirmware/zmk-build-arm:stable` wherever it is found - Locate and delete the lines for the DTS output step, which is no longer needed: - ``` - - name: ${{ steps.variables.outputs.display-name }} DTS File - if: ${{ always() }} - run: | - if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi - if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi + ```yaml + - name: ${{ steps.variables.outputs.display-name }} DTS File + if: ${{ always() }} + run: | + if [ -f "build/zephyr/${{ matrix.board }}.pre.tmp" ]; then cat -n build/zephyr/${{ matrix.board }}.pre.tmp; fi + if [ -f "build/zephyr/zephyr.dts" ]; then cat -n build/zephyr/zephyr.dts; fi ``` ### VS Code & Docker (Dev Container) @@ -107,7 +107,7 @@ A few testers have reported inconsistent issues with bluetooth connections on Wi Zephyr 3.2 introduced [a new Kconfig setting](https://github.com/zephyrproject-rtos/zephyr/pull/48929) that can be used to work around a bug in Windows related to battery reporting. Check out our [bluetooth config](/docs/config/bluetooth) for the full details. The key new configuration that can be set if using Windows is: -``` +```ini CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n ``` @@ -133,7 +133,7 @@ The main area this affects existing shields is those with board specific overrid Previously in ZMK, we relied on per-driver devicetree source properties to set the alternate pin functions for things like SPI or I2C. For example, here is the I2C bus setup as it was previously on the `nice_nano` board: -``` +```dts &i2c0 { compatible = "nordic,nrf-twi"; sda-pin = <17>; @@ -143,7 +143,7 @@ Previously in ZMK, we relied on per-driver devicetree source properties to set t With the move to the `pinctrl` system, this setup now look like: -``` +```dts &i2c0 { compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; @@ -154,7 +154,7 @@ With the move to the `pinctrl` system, this setup now look like: which references the `pinctrl` configuration: -``` +```dts &pinctrl { i2c0_default: i2c0_default { group1 { @@ -185,7 +185,7 @@ The approach is the following when updating a _board_: 1. Add a new file with the naming convention `-pinctrl.dtsi` to your board directory. 1. In the new file, add your `pinctrl` entries that set up different pin control configurations for whatever peripherals/buses are needed. Here's the nice!nano file as an example: - ``` + ```dts /* * Copyright (c) 2022 The ZMK Contributors * SPDX-License-Identifier: MIT @@ -230,7 +230,7 @@ The approach is the following when updating a _board_: 1. From the main `.dts` file, add an `#include "-pinctrl.dtsi"` to have the C-preprocessor combine the files. 1. Update the various peripheral nodes to use the new `pinctrl` configurations. For example, the following old configuration: - ``` + ```dts &i2c0 { compatible = "nordic,nrf-twi"; sda-pin = <15>; @@ -240,7 +240,7 @@ The approach is the following when updating a _board_: would be changed to: - ``` + ```dts &i2c0 { compatible = "nordic,nrf-twi"; pinctrl-0 = <&i2c0_default>; diff --git a/docs/blog/2023-06-18-encoder-refactors.md b/docs/blog/2023-06-18-encoder-refactors.md index 26f9cee8..14be81c8 100644 --- a/docs/blog/2023-06-18-encoder-refactors.md +++ b/docs/blog/2023-06-18-encoder-refactors.md @@ -35,7 +35,7 @@ Splitting these two parts of the encoder configuration allows greater flexibilit Previously, an encoder configuration looked like: -``` +```dts left_encoder: encoder_left { compatible = "alps,ec11"; label = "LEFT_ENCODER"; @@ -47,7 +47,7 @@ Previously, an encoder configuration looked like: Here, the `resolution` property was used to indicate how many encoder pulses should trigger the sensor behavior one time. Next, the encoder is selected in the sensors node: -``` +```dts sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; @@ -58,7 +58,7 @@ That was the entirety of the configuration for encoders. ### New Configuration -``` +```dts left_encoder: encoder_left { compatible = "alps,ec11"; label = "LEFT_ENCODER"; @@ -70,7 +70,7 @@ That was the entirety of the configuration for encoders. Here, the `steps` property is now used to indicate how many encoder pulses there are in a single complete rotation of the encoder. Next, the encoder is selected in the sensors node as before, but an additional configuration is used to indicate how many times the encoder should trigger the behavior in your keymap per rotation: -``` +```dts sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; @@ -84,7 +84,7 @@ For tactile encoders that have detents, the `triggers-per-rotation` would match The configuration changes bring ZMK's code in line with how upstream Zephyr sensor drivers handle rotations. This has the added advantage of allowing us to leverage other sensor drivers. On Nordic MCUs, like nRF52840, the NRFX QDEC driver can be used, for example: -``` +```dts &pinctrl { qdec_default: qdec_default { group1 { diff --git a/docs/docs/behaviors/backlight.md b/docs/docs/behaviors/backlight.md index 8c613fe6..322530e3 100644 --- a/docs/docs/behaviors/backlight.md +++ b/docs/docs/behaviors/backlight.md @@ -12,7 +12,7 @@ This page contains [backlight](../features/backlight.md) behaviors supported by Backlight actions defines are provided through the [`dt-bindings/zmk/backlight.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/backlight.h) header, which is added at the top of the keymap file: -``` +```dts #include ``` @@ -46,13 +46,13 @@ However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNC 1. Toggle backlight on/off - ``` + ```dts &bl BL_TOG ``` 1. Sets a specific brightness - ``` + ```dts &bl BL_SET 50 ``` diff --git a/docs/docs/behaviors/bluetooth.md b/docs/docs/behaviors/bluetooth.md index 89496948..1d461722 100644 --- a/docs/docs/behaviors/bluetooth.md +++ b/docs/docs/behaviors/bluetooth.md @@ -20,7 +20,7 @@ A ZMK device may show as "connected" on multiple hosts at the same time. This is Bluetooth command defines are provided through the [`dt-bindings/zmk/bt.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/bt.h) header, which is added at the top of the keymap file: -``` +```dts #include ``` @@ -54,25 +54,25 @@ The bluetooth behavior completes an bluetooth action given on press. 1. Behavior binding to clear the paired host for the selected profile: - ``` + ```dts &bt BT_CLR ``` 1. Behavior binding to select the next profile: - ``` + ```dts &bt BT_NXT ``` 1. Behavior binding to select the previous profile: - ``` + ```dts &bt BT_PRV ``` 1. Behavior binding to select the 2nd profile (passed parameters are [zero based](https://en.wikipedia.org/wiki/Zero-based_numbering)): - ``` + ```dts &bt BT_SEL 1 ``` diff --git a/docs/docs/behaviors/caps-word.md b/docs/docs/behaviors/caps-word.md index e5d862d7..0233de52 100644 --- a/docs/docs/behaviors/caps-word.md +++ b/docs/docs/behaviors/caps-word.md @@ -15,7 +15,7 @@ The modifiers are applied only to to the alphabetic (`A` to `Z`) keycodes, to av Example: -``` +```dts &caps_word ``` @@ -25,7 +25,7 @@ Example: By default, the caps word will remain active when any alphanumeric character or underscore (`UNDERSCORE`), backspace (`BACKSPACE`), or delete (`DELETE`) characters are pressed. Any other non-modifier keycode sent will turn off caps word. If you would like to override this, you can set a new array of keys in the `continue-list` property in your keymap: -``` +```dts &caps_word { continue-list = ; }; @@ -41,7 +41,7 @@ By default, the caps word will remain active when any alphanumeric character or In addition, if you would like _multiple_ modifiers, instead of just `MOD_LSFT`, you can override the `mods` property: -``` +```dts &caps_word { mods = <(MOD_LSFT | MOD_LALT)>; }; @@ -57,7 +57,7 @@ In addition, if you would like _multiple_ modifiers, instead of just `MOD_LSFT`, If you want to use multiple caps breaks with different codes to break the caps, you can add additional caps words instances to use in your keymap: -``` +```dts / { prog_caps: behavior_prog_caps_word { compatible = "zmk,behavior-caps-word"; diff --git a/docs/docs/behaviors/hold-tap.md b/docs/docs/behaviors/hold-tap.md index ec66b34f..96e03a0e 100644 --- a/docs/docs/behaviors/hold-tap.md +++ b/docs/docs/behaviors/hold-tap.md @@ -55,7 +55,7 @@ If you press a tapped hold-tap again within `quick-tap-ms` milliseconds of the f For example, the following hold-tap configuration enables `require-prior-idle-ms` with a 125 millisecond term, alongside `quick-tap-ms` with a 200 millisecond term. -``` +```dts rpi: require_prior_idle { compatible = "zmk,behavior-hold-tap"; label = "REQUIRE_PRIOR_IDLE"; @@ -78,7 +78,7 @@ If `retro-tap` is enabled, the tap behavior is triggered when releasing the hold For example, if you press `&mt LEFT_SHIFT A` and then release it without pressing another key, it will output `a`. -``` +```dts &mt { retro-tap; }; @@ -96,7 +96,7 @@ Note that `hold-trigger-key-positions` is an array of key position indexes. Key See the following example, which uses a hold-tap behavior definition, configured with the `hold-preferred` flavor, and with positional hold-tap enabled: -``` +```dts #include #include @@ -141,7 +141,7 @@ The two parameters that are passed to the hold-tap in your keymap will be forwar If you use behaviors that accept no parameters such as [mod-morphs](mod-morph.md) or [macros](macros.md), you can pass a dummy parameter value such as `0` to the hold-tap when you use it in your keymap. For instance, a hold-tap with node label `caps` and `bindings = <&kp>, <&caps_word>;` can be used in the keymap as below to send the caps lock keycode on hold and invoke the [caps word behavior](caps-word.md) on tap: -``` +```dts &caps CAPS 0 ``` @@ -166,7 +166,7 @@ The following are suggested hold-tap configurations that work well with home row ##### Option 1: cross-hand only modifiers, using `tap-unless-interrupted` and positional hold-tap (`hold-trigger-key-positions`) -```dtsi title="Homerow Mods: Cross-hand Example" +```dts title="Homerow Mods: Cross-hand Example" #include #include @@ -198,7 +198,7 @@ The following are suggested hold-tap configurations that work well with home row ##### Option 2: `tap-preferred` -```dtsi title="Homerow Mods: Tap-Preferred Example" +```dts title="Homerow Mods: Tap-Preferred Example" #include #include @@ -228,7 +228,7 @@ The following are suggested hold-tap configurations that work well with home row ##### Option 3: `balanced` -```dtsi title="Homerow Mods: Balanced Example" +```dts title="Homerow Mods: Balanced Example" #include #include @@ -262,7 +262,7 @@ The following are suggested hold-tap configurations that work well with home row A popular method of implementing Autoshift in ZMK involves a C-preprocessor macro, commonly defined as `AS(keycode)`. This macro applies the `LSHIFT` modifier to the specified `keycode` when `AS(keycode)` is held, and simply performs a [keypress](key-press.md), `&kp keycode`, when the `AS(keycode)` binding is tapped. This simplifies the use of Autoshift in a keymap, as the complete hold-tap bindings for each desired Autoshift key, as in `&as LS() &as LS() ... &as LS() `, can be quite cumbersome to use when applied to a large portion of the keymap. -```dtsi title="Hold-Tap Example: Autoshift" +```dts title="Hold-Tap Example: Autoshift" #include #include @@ -298,7 +298,7 @@ A popular method of implementing Autoshift in ZMK involves a C-preprocessor macr This hold-tap example implements a [momentary-layer](layers.md/#momentary-layer) when the keybind is held and a [toggle-layer](layers.md/#toggle-layer) when it is tapped. Similar to the Autoshift and Sticky Hold use-cases, a `MO_TOG(layer)` macro is defined such that the `&mo` and `&tog` behaviors can target a single layer. -```dtsi title="Hold-Tap Example: Momentary layer on Hold, Toggle layer on Tap" +```dts title="Hold-Tap Example: Momentary layer on Hold, Toggle layer on Tap" #include #include diff --git a/docs/docs/behaviors/key-press.md b/docs/docs/behaviors/key-press.md index e8304d77..a298d040 100644 --- a/docs/docs/behaviors/key-press.md +++ b/docs/docs/behaviors/key-press.md @@ -27,7 +27,7 @@ To make it easier to encode the HID keycode numeric values, most keymaps include the [`dt-bindings/zmk/keys.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/keys.h) header provided by ZMK near the top: -``` +```dts #include ``` @@ -44,6 +44,6 @@ The "key press" behavior sends standard keycodes on press/release. Example: -``` +```dts &kp A ``` diff --git a/docs/docs/behaviors/key-repeat.md b/docs/docs/behaviors/key-repeat.md index 5217bce8..9772fdb4 100644 --- a/docs/docs/behaviors/key-repeat.md +++ b/docs/docs/behaviors/key-repeat.md @@ -13,7 +13,7 @@ The key repeat behavior when triggered will send whatever keycode was last sent/ Example: -``` +```dts &key_repeat ``` @@ -25,7 +25,7 @@ By default, the key repeat will only track the last pressed key from the HID "Ke If you'd rather have the repeat also capture and send Consumer page usages, you can update the existing behavior: -``` +```dts &key_repeat { usage-pages = ; }; diff --git a/docs/docs/behaviors/key-toggle.md b/docs/docs/behaviors/key-toggle.md index 85b328f8..080b5b53 100644 --- a/docs/docs/behaviors/key-toggle.md +++ b/docs/docs/behaviors/key-toggle.md @@ -18,7 +18,7 @@ Example uses for key toggle include shift lock, or `ALT-TAB` window switching wi Example: -``` +```dts &kt LALT ``` diff --git a/docs/docs/behaviors/layers.md b/docs/docs/behaviors/layers.md index 7d790156..162b792f 100644 --- a/docs/docs/behaviors/layers.md +++ b/docs/docs/behaviors/layers.md @@ -16,7 +16,7 @@ add a set of `#define`s at the top of your keymap file, and use those layer in y For example, if you have three layers, you can add the following to the top of your keymap: -``` +```dts #define DEFAULT 0 #define LOWER 1 #define RAISE 2 @@ -37,7 +37,7 @@ again. Example: -``` +```dts &mo LOWER ``` @@ -53,7 +53,7 @@ The "layer-tap" behavior enables a layer when a key is held, and outputs a [keyp Example: -``` +```dts < LOWER SPACE ``` @@ -61,7 +61,7 @@ Example: You can configure a different tapping term or tweak other properties noted in the [hold-tap](hold-tap.md#advanced-configuration) documentation page in your keymap: -``` +```dts < { tapping-term-ms = <200>; }; @@ -93,7 +93,7 @@ The "to layer" behavior enables a layer and disables _all_ other layers _except_ Example: -``` +```dts &to 3 ``` @@ -108,13 +108,13 @@ The "toggle layer" behavior enables a layer until the layer is manually disabled Example: -``` +```dts &tog LOWER ``` "Toggle layer" for a : -``` +```dts #define DEFAULT 0 #define NAVI 1 diff --git a/docs/docs/behaviors/macros.md b/docs/docs/behaviors/macros.md index 377ce7fe..7ce968e9 100644 --- a/docs/docs/behaviors/macros.md +++ b/docs/docs/behaviors/macros.md @@ -14,7 +14,7 @@ Each macro you want to use in your keymap gets defined first, then bound in your A macro definition looks like: -``` +```dts / { macros { zed_em_kay: zed_em_kay { @@ -38,7 +38,7 @@ used to reference the macro in your keymap. The macro can then be bound in your keymap by referencing it by the label `&zed_em_kay`, e.g.: -``` +```dts raise_layer { bindings = <&zed_em_kay>; }; @@ -54,7 +54,7 @@ with [modifier functions](../codes/modifiers.mdx#modifier-functions) can be used Like [hold-taps](/docs/behaviors/hold-tap), macros are created by composing other behaviors, and any of those behaviors can be added to the `bindings` list, e.g.: -``` +```dts bindings = <&to 1> , <&bl BL_ON> @@ -86,7 +86,7 @@ To modify the activation mode, macro controls can be added at any point in the ` A concrete example, used to hold a modifier, tap multiple keys, then release the modifier, would look like: -``` +```dts bindings = <¯o_press &kp LSHFT> , <¯o_tap &kp Z &kp M &kp K> @@ -101,7 +101,7 @@ the macro itself is released. To pause the macro until release, use `¯o_pause_for_release`. For example, this macro will press a modifier and activate a layer when the macro is pressed. Once the macro is released, it will release the modifier and deactivate the layer by releasing the `&mo`: -``` +```dts bindings = <¯o_press &mo 1 &kp LSHFT> , <¯o_pause_for_release> @@ -116,7 +116,7 @@ which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_WAIT_MS`](../config/be be set by assigning a value to the `wait-ms` property of the macro, e.g. `wait-ms = <20>;`. If you want to update the wait time at any point in the macro bindings list, use `¯o_wait_time`, e.g. `¯o_wait_time 30`. A full example: -``` +```dts wait-ms = <10>; bindings = <&kp F &kp A &kp S &kp T> @@ -132,7 +132,7 @@ which is equal to the value of [`CONFIG_ZMK_MACRO_DEFAULT_TAP_MS`](../config/beh be set by assigning a value to the `tap-ms` property of the macro, e.g. `tap-ms = <20>;`. If you want to update the tap time at any point in a macro bindings list, use `¯o_tap_time`, e.g. `¯o_tap_time 30`. A full example: -``` +```dts bindings = <¯o_tap_time 10> , <&kp S &kp H &kp O &kp R &kp T> @@ -153,7 +153,7 @@ Another limit worth noting is that the maximum number of bindings you can pass t Macros can also be "parameterized", allowing them to be bound in your keymap with unique values passed into them, e.g.: -``` +```dts raise_layer { bindings = <&my_one_param_macro A> }; @@ -262,7 +262,7 @@ lm: lm { To trigger a different underglow when the macro is pressed, and when it is released, we use the macro "press" activation mode whenever triggering the `&rgb_ug` behavior: -``` +```dts wait-ms = <0>; tap-ms = <0>; bindings @@ -278,7 +278,7 @@ bindings The other common use case for macros is to sending sequences of keycodes to the connected host. Here, a wait and tap time of at least 30ms is recommended to avoid having HID notifications grouped at the BLE protocol level and then processed out of order: -``` +```dts wait-ms = <40>; tap-ms = <40>; bindings @@ -292,7 +292,7 @@ bindings Many operating systems allow a special sequence to input unicode characters, e.g. [Windows alt codes](https://support.microsoft.com/en-us/office/insert-ascii-or-unicode-latin-based-symbols-and-characters-d13f58d3-7bcb-44a7-a4d5-972ee12e50e0). You can use macros to automate inputting the sequences, e.g. below macro inserts `£` on Windows: -``` +```dts wait-ms = <40>; tap-ms = <40>; bindings @@ -306,7 +306,7 @@ bindings To avoid repetition or possible typos when declaring a **zero parameter macro**, a convenience _C_ macro, named `ZMK_MACRO(name, props)` can be used to simplify things: -``` +```dts ZMK_MACRO(my_zero_param_macro, wait-ms = <30>; tap-ms = <40>; @@ -320,7 +320,7 @@ To avoid repetition or possible typos when declaring a **zero parameter macro**, This can be used instead of a complete macro definition. During the firmware build process, the example above would produce the complete macro definition below: -``` +```dts my_zero_param_macro: my_zero_param_macro { compatible = "zmk,behavior-macro"; label = "ZM_my_macro"; diff --git a/docs/docs/behaviors/misc.md b/docs/docs/behaviors/misc.md index 446ba33c..c71f87c0 100644 --- a/docs/docs/behaviors/misc.md +++ b/docs/docs/behaviors/misc.md @@ -21,7 +21,7 @@ passed down to the next active layer in the stack. Example: -``` +```dts &trans ``` @@ -37,6 +37,6 @@ be passed down to the next active layer in the stack. Example: -``` +```dts &none ``` diff --git a/docs/docs/behaviors/mod-morph.md b/docs/docs/behaviors/mod-morph.md index 33d18e33..6099b428 100644 --- a/docs/docs/behaviors/mod-morph.md +++ b/docs/docs/behaviors/mod-morph.md @@ -18,7 +18,7 @@ The Mod-Morph behavior acts as one of two keycodes, depending on if the required An example of how to implement the mod-morph "Grave Escape": -``` +```dts / { behaviors { gresc: grave_escape { @@ -41,7 +41,7 @@ Note that this specific mod-morph exists in ZMK by default using code `&gresc`. Example: -``` +```dts &gresc ``` @@ -62,7 +62,7 @@ Available Modifiers: Example: -``` +```dts mods = <(MOD_LGUI|MOD_LSFT|MOD_RGUI|MOD_RSFT)>; ``` @@ -74,7 +74,7 @@ When a modifier specified in `mods` is being held, it won't be sent along with t For example, the following configuration morphs `LEFT_SHIFT` + `BACKSPACE` into `DELETE`, and morphs `RIGHT_SHIFT` + `BACKSPACE` into `RIGHT_SHIFT` + `DELETE`. -``` +```dts / { behaviors { bspc_del: backspace_delete { diff --git a/docs/docs/behaviors/mod-tap.md b/docs/docs/behaviors/mod-tap.md index 5f4fa506..d789a8b7 100644 --- a/docs/docs/behaviors/mod-tap.md +++ b/docs/docs/behaviors/mod-tap.md @@ -24,7 +24,7 @@ The Mod-Tap behavior either acts as a held modifier, or as a tapped keycode. Example: -``` +```dts &mt LSHIFT A ``` @@ -32,7 +32,7 @@ Example: You can configure a different tapping term in your keymap: -``` +```dts &mt { tapping-term-ms = <400>; }; diff --git a/docs/docs/behaviors/outputs.md b/docs/docs/behaviors/outputs.md index dad52be2..46b567cf 100644 --- a/docs/docs/behaviors/outputs.md +++ b/docs/docs/behaviors/outputs.md @@ -23,7 +23,7 @@ to select the BLE output through below behavior to be able to send keystrokes to Output command defines are provided through the [`dt-bindings/zmk/outputs.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/outputs.h) header, which is added at the top of the keymap file: -``` +```dts #include ``` @@ -53,18 +53,18 @@ However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../con 1. Behavior binding to prefer sending keyboard output to USB - ``` + ```dts &out OUT_USB ``` 1. Behavior binding to prefer sending keyboard output to the current bluetooth profile - ``` + ```dts &out OUT_BLE ``` 1. Behavior binding to toggle between preferring USB and BLE - ``` + ```dts &out OUT_TOG ``` diff --git a/docs/docs/behaviors/power.md b/docs/docs/behaviors/power.md index 11f92084..5251d76c 100644 --- a/docs/docs/behaviors/power.md +++ b/docs/docs/behaviors/power.md @@ -24,7 +24,7 @@ The following boards currently support this feature: External power control command defines are provided through the [`dt-bindings/zmk/ext_power.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/ext_power.h) header, which is added at the top of the keymap file: -``` +```dts #include ``` @@ -52,19 +52,19 @@ However it will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE`](../con 1. Behavior binding to enable the external power - ``` + ```dts &ext_power EP_ON ``` 1. Behavior binding to disable the external power - ``` + ```dts &ext_power EP_OFF ``` 1. Behavior binding to toggle the external power - ``` + ```dts &ext_power EP_TOG ``` diff --git a/docs/docs/behaviors/reset.md b/docs/docs/behaviors/reset.md index 0fc62b2f..b7850eca 100644 --- a/docs/docs/behaviors/reset.md +++ b/docs/docs/behaviors/reset.md @@ -22,7 +22,7 @@ to the device Example: -``` +```dts &sys_reset ``` @@ -38,7 +38,7 @@ you to flash a new firmware. Example: -``` +```dts &bootloader ``` diff --git a/docs/docs/behaviors/sensor-rotate.md b/docs/docs/behaviors/sensor-rotate.md index 02e56924..3ff69dc6 100644 --- a/docs/docs/behaviors/sensor-rotate.md +++ b/docs/docs/behaviors/sensor-rotate.md @@ -19,7 +19,7 @@ The standard sensor rotation behavior allows fully binding behaviors to be invok Here is an example that binds the [RGB Underglow Behavior](/docs/behaviors/underglow.md) to change the RGB brightness: -``` +```dts / { behaviors { rgb_encoder: rgb_encoder { @@ -55,7 +55,7 @@ Here is an example, showing how send key presses on rotation: First, defining the sensor rotation itself, binding the [Key Press Behavior](/docs/behaviors/key-press.md) twice, then binding it in the `sensor-bindings` property of a keymap layer: -``` +```dts / { behaviors { rot_kp: behavior_sensor_rotate_kp { diff --git a/docs/docs/behaviors/sticky-key.md b/docs/docs/behaviors/sticky-key.md index d881e6b0..8b003f55 100644 --- a/docs/docs/behaviors/sticky-key.md +++ b/docs/docs/behaviors/sticky-key.md @@ -14,13 +14,13 @@ A sticky key stays pressed until another key is pressed. It is often used for 's Example: -``` +```dts &sk LSHIFT ``` You can use any keycode that works for `&kp` as parameter to `&sk`: -``` +```dts &sk LG(LS(LA(LCTRL))) ``` @@ -40,7 +40,7 @@ This setting is enabled by default. It ensures that if a sticky key modifier is #### Example -``` +```dts &sk { release-after-ms = <2000>; quick-release; @@ -56,7 +56,7 @@ This setting is enabled by default. It ensures that if a sticky key modifier is This configuration would apply to all sticky keys. This may not be appropriate if using `quick-release` as you'll lose the ability to chain sticky key modifiers. A better approach for this use case would be to create a new behavior: -``` +```dts / { behaviors { skq: sticky_key_quick_release { diff --git a/docs/docs/behaviors/sticky-layer.md b/docs/docs/behaviors/sticky-layer.md index ac341f77..41c2ccf5 100644 --- a/docs/docs/behaviors/sticky-layer.md +++ b/docs/docs/behaviors/sticky-layer.md @@ -16,7 +16,7 @@ By default, sticky layers stay pressed for a second if you don't press any other Example: -``` +```dts &sl 1 ``` @@ -24,7 +24,7 @@ Example: You can configure a different `release-after-ms` in your keymap: -``` +```dts &sl { release-after-ms = <2000>; }; diff --git a/docs/docs/behaviors/tap-dance.md b/docs/docs/behaviors/tap-dance.md index c68b51dc..ac85b3da 100644 --- a/docs/docs/behaviors/tap-dance.md +++ b/docs/docs/behaviors/tap-dance.md @@ -37,7 +37,7 @@ values={[ This example configures a tap-dance named `td0` that outputs the number of times its binding is pressed from 1-3. -```title="Basic Tap-Dance Example: Counter" +```dts title="Basic Tap-Dance Example: Counter" #include #include @@ -78,7 +78,7 @@ Alphanumeric [`key press`](key-press.md) bindings, like those used for `td0`, wi This example configures a mod-tap inside a tap-dance named `td_mt` that outputs `CAPSLOCK` on a single tap, `LSHIFT` on a single press and hold, and `LCTRL` when the tap-dance is pressed twice. -```title="Advanced Tap-Dance Example: Nested Mod-Tap" +```dts title="Advanced Tap-Dance Example: Nested Mod-Tap" #include #include diff --git a/docs/docs/behaviors/underglow.md b/docs/docs/behaviors/underglow.md index 29f34c2a..f94d9008 100644 --- a/docs/docs/behaviors/underglow.md +++ b/docs/docs/behaviors/underglow.md @@ -12,7 +12,7 @@ This page contains [RGB Underglow](../features/underglow.md) behaviors supported RGB actions defines are provided through the [`dt-bindings/zmk/rgb.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/rgb.h) header, which is added at the top of the keymap file: -``` +```dts #include ``` @@ -65,13 +65,13 @@ However the settings will only be saved after [`CONFIG_ZMK_SETTINGS_SAVE_DEBOUNC 1. Toggle underglow on/off - ``` + ```dts &rgb_ug RGB_TOG ``` 1. Set a specific HSB color (green) - ``` + ```dts &rgb_ug RGB_COLOR_HSB(128,100,100) ``` diff --git a/docs/docs/config/index.md b/docs/docs/config/index.md index 1ff1bfa0..3d7aeb48 100644 --- a/docs/docs/config/index.md +++ b/docs/docs/config/index.md @@ -71,7 +71,7 @@ Kconfig is used to configure global settings such as the keyboard name and enabl Kconfig files look like this: -``` +```ini CONFIG_ZMK_SLEEP=y CONFIG_EC11=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y @@ -114,7 +114,7 @@ Devicetree files use various file extensions. These indicate the purpose of the Devicetree files look like this: -```devicetree +```dts / { chosen { zmk,kscan = &kscan0; @@ -138,7 +138,7 @@ search through the `.dts` file for your board, `.overlay` file for your shield, A Devicetree node looks like this: -```devicetree +```dts kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; // more properties and/or nodes... @@ -157,7 +157,7 @@ followed by the node's label, an opening curly brace (`{`), one or more new prop For example, to adjust the debouncing of the `zmk,kscan-gpio-matrix` node shown above, you could add this to your keymap: -```devicetree +```dts &kscan0 { debounce-press-ms = <0>; }; @@ -165,7 +165,7 @@ For example, to adjust the debouncing of the `zmk,kscan-gpio-matrix` node shown If the node you want to edit doesn't have a label, you can also write a new tree and it will be merged with the existing tree, overriding any properties. Adding this to your keymap would be equivalent to the previous example. -```devicetree +```dts / { kscan { debounce-press-ms = <0>; @@ -185,7 +185,7 @@ Example: `property;` If a property has already been set to true and you need to override it to false, use the following command to delete the existing property: -```devicetree +```dts /delete-property/ the-property-name; ``` @@ -240,7 +240,7 @@ Each item in the array should be a label for a GPIO node (the names of which dif Example: -```devicetree +```dts some-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>, <&gpio0 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> @@ -253,7 +253,7 @@ A path to a node, either as a node reference or as a string. Examples: -``` +```dts property = &label; property = "/path/to/some/node"; ``` diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 296cb4a1..67c37652 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -88,7 +88,7 @@ By default, a switch will drain current through the internal pull up/down resist Assuming the switches connect each GPIO pin to the ground, the [GPIO flags](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/gpio.html#api-reference) for the elements in `input-gpios` should be `(GPIO_ACTIVE_LOW | GPIO_PULL_UP)`: -```devicetree +```dts kscan0: kscan { compatible = "zmk,kscan-gpio-direct"; input-gpios @@ -137,7 +137,7 @@ The `diode-direction` property must be one of: Given the `diode-direction`, the [GPIO flags](https://docs.zephyrproject.org/3.2.0/hardware/peripherals/gpio.html#api-reference) for the elements in `row-` and `col-gpios` should be set appropriately. The output pins (e.g. columns for `col2row`) should have the flag `GPIO_ACTIVE_HIGH`, and input pins (e.g. rows for `col2row`) should have the flags `(GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)`: -```devicetree +```dts kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; diode-direction = "col2row"; @@ -229,7 +229,7 @@ One possible way to do this is a 3x4 matrix where the direct GPIO keys are shift ...which can be configured with the following Devicetree code: -```devicetree +```dts / { chosen { zmk,kscan = &kscan0; @@ -316,7 +316,7 @@ The `map` array should be defined using the `RC()` macro from [dt-bindings/zmk/m Any keyboard which is not a grid of 1 unit keys will likely have some unused positions in the matrix. A matrix transform can be used to skip the unused positions so users don't have to set them to `&none` in keymaps. -```devicetree +```dts // numpad.overlay / { chosen { @@ -355,7 +355,7 @@ Any keyboard which is not a grid of 1 unit keys will likely have some unused pos }; ``` -```devicetree +```dts // numpad.keymap / { keymap { @@ -377,7 +377,7 @@ Any keyboard which is not a grid of 1 unit keys will likely have some unused pos Consider a keyboard with a [duplex matrix](https://wiki.ai03.com/books/pcb-design/page/matrices-and-duplex-matrix), where the matrix has twice as many rows and half as many columns as the keyboard has keys. A matrix transform can be used to correct for this so that keymaps can match the layout of the keys, not the layout of the matrix. -```devicetree +```dts / { chosen { zmk,kscan = &kscan0; diff --git a/docs/docs/customization.md b/docs/docs/customization.md index 6fb39f85..4f75e743 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -48,7 +48,7 @@ default keyboard settings. For instance, building kyria firmware from a user `myUser`'s `zmk-config` folder on Windows 10 may look something like this: -``` +```bash west build -b nice_nano -- -DSHIELD=kyria_left -DZMK_CONFIG="C:/Users/myUser/Documents/Github/zmk-config/config" ``` @@ -63,7 +63,7 @@ More troubleshooting information for split keyboards can be found [here](trouble You can build additional keyboards with GitHub actions by appending them to `build.yml` in your `zmk-config` folder. For instance assume that we have set up a Corne shield with nice!nano during [initial setup](user-setup.md) and we want to add a Lily58 shield with nice!nano v2. The following is an example `build.yaml` file that would accomplish that: -``` +```yaml include: - board: nice_nano shield: corne_left diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index f57c4b5c..94bbcdf9 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -76,13 +76,13 @@ For split keyboards, you will have to build and flash each side separately the f By default, the `build` command outputs a single .uf2 file named `zmk.uf2` so building left and then right immediately after will overwrite your left firmware. In addition, you will need to pristine build each side to ensure the correct files are used. To avoid having to pristine build every time and separate the left and right build files, we recommend setting up separate build directories for each half. You can do this by using the `-d` parameter and first building left into `build/left`: -``` +```sh west build -d build/left -b nice_nano -- -DSHIELD=kyria_left ``` and then building right into `build/right`: -``` +```sh west build -d build/right -b nice_nano -- -DSHIELD=kyria_right ``` @@ -99,7 +99,7 @@ Instead of building .uf2 files using the default keymap and config files, you ca For instance, building kyria firmware from a user `myUser`'s `zmk-config` folder on Windows 10 may look something like this: -``` +```sh west build -b nice_nano -- -DSHIELD=kyria_left -DZMK_CONFIG="C:/Users/myUser/Documents/Github/zmk-config/config" ``` @@ -117,7 +117,7 @@ volume automatically -- we need to delete the default volume before binding it t Then you can bind the `zmk-config` volume to the correct path pointing to your local [zmk-config](customization.md) folder: -``` +```sh docker volume create --driver local -o o=bind -o type=none -o \ device="/full/path/to/your/zmk-config/" zmk-config ``` @@ -137,7 +137,7 @@ Alternatively, if your board supports flashing and you're not developing from within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on your board and run the following command to flash: -``` +```sh west flash ``` diff --git a/docs/docs/development/ide-integration.md b/docs/docs/development/ide-integration.md index bfcd5def..f0403dbb 100644 --- a/docs/docs/development/ide-integration.md +++ b/docs/docs/development/ide-integration.md @@ -71,7 +71,7 @@ If you are developing inside a Docker container, set the IntelliSense mode to `l Open VS Code's integrated terminal and run the following command: -``` +```sh cmake -P zephyr/cmake/verify-toolchain.cmake ``` diff --git a/docs/docs/development/new-behavior.md b/docs/docs/development/new-behavior.md index 0d70aa3b..aab056c1 100644 --- a/docs/docs/development/new-behavior.md +++ b/docs/docs/development/new-behavior.md @@ -357,7 +357,7 @@ For behaviors that do not require central locality, the following options for up For the purpose of this section, we will discuss the structure of `app/dts/behaviors/gresc.dtsi` below. -```dtsi title="app/dts/behaviors/gresc.dtsi" +```dts title="app/dts/behaviors/gresc.dtsi" /* * Copyright (c) 2020 The ZMK Contributors * @@ -383,7 +383,7 @@ The format of a behavior's `.dtsi` file is identical to declaring an instance of After creating the `.dtsi` from above, update `app/dts/behaviors.dtsi` to include your newly predefined behavior instance, making it accessible by the devicetree. -```dtsi title="app/dts/behaviors.dtsi" +```dts title="app/dts/behaviors.dtsi" #include #include #include diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 055afcf6..fa30ca38 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -53,7 +53,7 @@ shield to get it picked up for ZMK, `Kconfig.shield` and `Kconfig.defconfig`. The `Kconfig.shield` file defines any additional Kconfig settings that may be relevant when using this keyboard. For most keyboards, there is just one additional configuration value for the shield itself. -``` +```kconfig config SHIELD_MY_BOARD def_bool $(shields_list_contains,my_board) ``` @@ -62,7 +62,7 @@ This will make sure that a new configuration value named `SHIELD_MY_BOARD` is se **For split boards**, you will need to add configurations for the left and right sides. For example, if your split halves are named `my_board_left` and `my_board_right`, it would look like this: -``` +```kconfig config SHIELD_MY_BOARD_LEFT def_bool $(shields_list_contains,my_board_left) @@ -83,7 +83,7 @@ The updated new default values should always be wrapped inside a conditional on The keyboard name must be less than or equal to 16 characters in length, otherwise the bluetooth advertising might fail and you will not be able to find your keyboard from your device. ::: -``` +```kconfig if SHIELD_MY_BOARD config ZMK_KEYBOARD_NAME @@ -97,7 +97,7 @@ You'll also want to set which half is the central side. Most boards set it to th Then on the peripheral half, you'll want to turn USB on so that it shows USB status on displays properly. Finally, you'll want to turn on the split option for both sides. This can all be seen below. -``` +```kconfig if SHIELD_MY_BOARD_LEFT config ZMK_KEYBOARD_NAME @@ -136,7 +136,7 @@ values={[ The `.overlay` is the devicetree description of the keyboard shield that is merged with the primary board devicetree description before the build. For ZMK, this file at a minimum should include the chosen node named `zmk,kscan` that references a KSCAN driver instance. For a simple 3x3 macropad matrix, this might look something like: -``` +```dts / { chosen { zmk,kscan = &kscan0; @@ -174,7 +174,7 @@ Unlike unibody keyboards, split keyboards have a core .dtsi file with shield ove It is preferred to define only the `col-gpios` or `row-gpios` in the common shield .dtsi, depending on the `diode-direction` value. For `col2row` directed boards like the iris, the shared .dtsi file may look like this: -``` +```dts #include / { @@ -228,9 +228,7 @@ Furthermore, the column offset for the [matrix transform](#optional-matrix-trans because the keyboard's switch matrix is read from left to right, top to bottom. This is exemplified with the iris .overlay files. -``` -// iris_left.overlay - +```dts title=iris_left.overlay #include "iris.dtsi" // Notice that the main dtsi files are included in the overlay. &kscan0 { @@ -245,9 +243,7 @@ This is exemplified with the iris .overlay files. }; ``` -``` -// iris_right.overlay - +```dts title=iris_right.overlay #include "iris.dtsi" &default_transform { // The matrix transform for this board is 6 columns over because the left half is 6 columns wide according to the matrix. @@ -281,9 +277,7 @@ For example, a split board called `my_awesome_split_board` would have the follow In most case you'll only need to use the .conf file that affects both halves of a split board. It's used for adding features like deep-sleep or rotary encoders. -``` -// my_awesome_split_board.conf - +```ini title=my_awesome_split_board.conf CONFIG_ZMK_SLEEP=y ``` @@ -306,7 +300,7 @@ the logical key location as perceived by the end user. All _keymap_ mappings act _Without_ a matrix transform, that intentionally map each key position to the row/column pair that position corresponds to, the default equation to determine that is: -``` +```c ($row * NUMBER_OF_COLUMNS) + $column ``` @@ -316,7 +310,7 @@ Whenever that default key position mapping is insufficient, the `.o Here is an example for the [nice60](https://github.com/Nicell/nice60), which uses an efficient 8x8 GPIO matrix, and uses a transform: -``` +```dts #include / { @@ -419,7 +413,7 @@ values={[ In your configuration file you will need to add the following lines so that the encoders can be enabled/disabled: -``` +```ini # Uncomment to enable encoder # CONFIG_EC11=y # CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y @@ -435,7 +429,7 @@ If building locally for split boards, you may need to add these lines to the spe In your device tree file you will need to add the following lines to define the encoder sensor: -``` +```dts left_encoder: encoder_left { compatible = "alps,ec11"; label = "LEFT_ENCODER"; @@ -452,8 +446,8 @@ Add additional encoders as necessary by duplicating the above lines, replacing ` Once you have defined the encoder sensors, you will have to add them to the list of sensors: -``` -sensors { +```dts + sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; }; @@ -465,7 +459,7 @@ In this example, a left_encoder and right_encoder are both added. Additional enc Add the following lines to your overlay file(s) to enable the encoder: -``` +```dts &left_encoder { status = "okay"; }; @@ -479,7 +473,7 @@ For split keyboards, make sure to add left hand encoders to the left .overlay fi Add the following line to your keymap file to add default encoder behavior bindings: -``` +```dts sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; ``` @@ -493,7 +487,7 @@ Add additional bindings as necessary to match the default number of encoders on Once you've fully created the new keyboard shield definition, you should be able to test with a build command like: -``` +```sh west build --pristine -b proton_c -- -DSHIELD=my_board ``` @@ -506,7 +500,7 @@ Alternatively, if your board supports flashing and you're not developing from within a Dockerized environment, enable Device Firmware Upgrade (DFU) mode on your board and run the following command to test your build: -``` +```sh west flash ``` diff --git a/docs/docs/development/posix-board.md b/docs/docs/development/posix-board.md index d0ad571a..5a809c02 100644 --- a/docs/docs/development/posix-board.md +++ b/docs/docs/development/posix-board.md @@ -14,7 +14,7 @@ with a compiler that can target 32-bit POSIX. On Debian, you can do this with: -``` +```sh apt install -y gcc-multilib ``` @@ -23,7 +23,7 @@ apt install -y gcc-multilib To do this, you can build ZMK targeting the `native_posix_64` board. -``` +```sh west build --pristine --board native_posix_64 -- -DZMK_CONFIG=tests/none/normal/ ``` diff --git a/docs/docs/development/usb-logging.md b/docs/docs/development/usb-logging.md index 87cd0e7d..e50e7824 100644 --- a/docs/docs/development/usb-logging.md +++ b/docs/docs/development/usb-logging.md @@ -33,7 +33,7 @@ In Github Actions, you can check the ` Kconfig file` step output to ve for you successfully. ::: -``` +```ini # Turn on logging, and set ZMK logging to debug output CONFIG_ZMK_USB_LOGGING=y ``` @@ -53,7 +53,7 @@ values={[ On Linux, this should be a device like `/dev/ttyACM0` and you can connect with `minicom` or `tio` as usual, e.g.: -``` +```sh sudo tio /dev/ttyACM0 ``` @@ -74,7 +74,7 @@ If you already have the Ardunio IDE installed you can also use its built-in Seri On macOS, the device name is something like `/dev/tty.usbmodemXXXXX` where `XXXXX` is some numerical ID. You can connect to the device with [tio](https://tio.github.io/) (can be installed via [Homebrew](https://formulae.brew.sh/formula/tio)): -``` +```sh sudo tio /dev/tty.usbmodem14401 ``` diff --git a/docs/docs/features/backlight.md b/docs/docs/features/backlight.md index 717361a2..c1b5db5d 100644 --- a/docs/docs/features/backlight.md +++ b/docs/docs/features/backlight.md @@ -16,7 +16,7 @@ Unlike [RGB Underglow](underglow.md), backlight can only control single color LE To enable backlight on your board or shield, add the following line to your `.conf` file of your user config directory as such: -``` +```ini CONFIG_ZMK_BACKLIGHT=y ``` @@ -46,7 +46,7 @@ values={[ First, you must enable PWM by adding the following lines to your `Kconfig.defconfig` file: -``` +```kconfig if ZMK_BACKLIGHT config PWM @@ -60,7 +60,7 @@ endif # ZMK_BACKLIGHT Then you have to add the following lines to your `.dts` file: -``` +```dts &pwm0 { status = "okay"; ch0-pin = <45>; @@ -77,7 +77,7 @@ If your board uses a P-channel MOSFET to control backlight instead of a N-channe Then you have to add the following lines inside the root devicetree node on the same file as before: -``` +```dts / { backlight: pwmleds { compatible = "pwm-leds"; @@ -98,7 +98,7 @@ Note that every LED inside of the backlight node will be treated as a backlight Finally you need to add backlight to the `chosen` element of the root devicetree node: -``` +```dts / { chosen { zmk,backlight = &backlight; @@ -113,7 +113,7 @@ You must first add a `boards/` directory within your shield folder. For each boa Inside your `.defconfig` file, add the following lines: -``` +```kconfig if ZMK_BACKLIGHT config PWM @@ -127,7 +127,7 @@ endif # ZMK_BACKLIGHT Then add the following lines to your `.overlay` file: -``` +```dts &pwm0 { status = "okay"; ch0-pin = <45>; @@ -144,7 +144,7 @@ If your shield uses a P-channel MOSFET to control backlight instead of a N-chann Then you have to add the following lines inside the root devicetree node on the same file: -``` +```dts / { backlight: pwmleds { compatible = "pwm-leds"; @@ -165,7 +165,7 @@ Note that every LED inside of the backlight node will be treated as a backlight Finally you need to add backlight to the `chosen` element of the root devicetree node: -``` +```dts / { chosen { zmk,backlight = &backlight; @@ -175,7 +175,7 @@ Finally you need to add backlight to the `chosen` element of the root devicetree Optionally, on Pro Micro compatible shields you can add a LED GPIO node to your devicetree, this could be useful if you want your shield to be compatible with newer or untested boards. To do that you have to enable `CONFIG_LED_GPIO` in your `.conf` file and then add the following lines inside the root devicetree node of your `.dtsi` or `.dts` file: -``` +```dts / { backlight: gpioleds { compatible = "gpio-leds"; @@ -199,7 +199,7 @@ It is possible to control multiple backlight LEDs at the same time. This is usef In order to do that, first you need to enable PWM for each pin: -``` +```dts &pwm0 { status = "okay"; ch0-pin = <45>; /* LED 0 */ @@ -213,7 +213,7 @@ This part may vary based on your MCU as different MCUs may have a different numb Then you can simply add each of your LED to the backlight node: -``` +```dts backlight: pwmleds { compatible = "pwm-leds"; label = "Backlight LEDs"; diff --git a/docs/docs/features/battery.md b/docs/docs/features/battery.md index 42ba6d40..8bf78207 100644 --- a/docs/docs/features/battery.md +++ b/docs/docs/features/battery.md @@ -26,7 +26,7 @@ Zephyr also provides some drivers for fuel gauge ICs such as the TI bq274xx seri Once you have the sensor driver defined, add a `zmk,battery` property to the `chosen` node and set it to reference the sensor node. For example: -``` +```dts / { chosen { zmk,battery = &vbatt; diff --git a/docs/docs/features/beta-testing.md b/docs/docs/features/beta-testing.md index 4328ccbf..4a159362 100644 --- a/docs/docs/features/beta-testing.md +++ b/docs/docs/features/beta-testing.md @@ -44,7 +44,7 @@ values={[ ]}> -``` +```yaml manifest: remotes: - name: zmkfirmware @@ -61,7 +61,7 @@ manifest: -``` +```yaml manifest: remotes: - name: zmkfirmware @@ -80,7 +80,7 @@ manifest: -``` +```yaml manifest: remotes: - name: zmkfirmware diff --git a/docs/docs/features/bluetooth.md b/docs/docs/features/bluetooth.md index b75b8953..e58e1673 100644 --- a/docs/docs/features/bluetooth.md +++ b/docs/docs/features/bluetooth.md @@ -42,7 +42,7 @@ Management of the bluetooth in ZMK is accomplished using the [`&bt` behavior](.. Some users may experience a poor connection between the keyboard and the host. This might be due to poor quality BLE hardware, a metal enclosure on the keyboard or host, or the distance between them. Increasing the transmit power of the keyboard's BLE radio may reduce the severity of this problem. To do this, set the `CONFIG_BT_CTLR_TX_PWR_PLUS_8` configuration value in the `.conf` file of your user config directory as such: -``` +```ini CONFIG_BT_CTLR_TX_PWR_PLUS_8=y ``` @@ -64,7 +64,7 @@ There are a few known issues related to BLE and ZMK: There is a known issue with Windows failing to update the battery information after connecting to a ZMK keyboard. You can work around this Windows bug by overriding a [Bluetooth config variable](../config/bluetooth.md) to force battery notifications even if a host neglects to subscribe to them: -``` +```ini CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n ``` diff --git a/docs/docs/features/combos.md b/docs/docs/features/combos.md index bc1353b4..f4664c54 100644 --- a/docs/docs/features/combos.md +++ b/docs/docs/features/combos.md @@ -10,7 +10,7 @@ Combo keys are a way to combine multiple keypresses to output a different key. F Combos configured in your `.keymap` file, but are separate from the `keymap` node found there, since they are processed before the normal keymap. They are specified like this: -``` +```dts / { combos { compatible = "zmk,combos"; diff --git a/docs/docs/features/conditional-layers.md b/docs/docs/features/conditional-layers.md index a685bcab..7ccfdf23 100644 --- a/docs/docs/features/conditional-layers.md +++ b/docs/docs/features/conditional-layers.md @@ -14,7 +14,7 @@ Another way to think of this feature is as a simple combo system for layers, jus Conditional layers are configured via a `conditional_layers` node in your `.keymap` file as follows: -``` +```dts / { conditional_layers { compatible = "zmk,conditional-layers"; diff --git a/docs/docs/features/debouncing.md b/docs/docs/features/debouncing.md index 40170739..cbea7092 100644 --- a/docs/docs/features/debouncing.md +++ b/docs/docs/features/debouncing.md @@ -56,7 +56,7 @@ per-driver option. For example, if your board/shield has a kscan driver labeled `kscan0` in its `.overlay`, `.dts`, or `.dtsi` files, -```devicetree +```dts kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; ... @@ -65,7 +65,7 @@ kscan0: kscan { then you could add this to your `.keymap`: -```devicetree +```dts &kscan0 { debounce-press-ms = <3>; debounce-release-ms = <3>; diff --git a/docs/docs/features/encoders.md b/docs/docs/features/encoders.md index 0c493330..10575763 100644 --- a/docs/docs/features/encoders.md +++ b/docs/docs/features/encoders.md @@ -21,7 +21,7 @@ Keyboards and macropads with encoder support will typically take the two EC11 pi Rotation is handled separately as a type of sensor. The behavior for this is set in `sensor-bindings`. See [Sensor Rotation](../behaviors/sensor-rotate.md) for customizing this behavior. -``` +```dts sensor-bindings = ; ``` @@ -33,7 +33,7 @@ Additional encoders can be configured by adding more bindings immediately after As an example, a complete `sensor-bindings` for a Kyria with two encoders could look like: -``` +```dts sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; ``` diff --git a/docs/docs/features/keymaps.md b/docs/docs/features/keymaps.md index 93c2c825..9778ecba 100644 --- a/docs/docs/features/keymaps.md +++ b/docs/docs/features/keymaps.md @@ -61,7 +61,7 @@ alter the behavior when that specific key position is activated/deactivated. For the "key press" (`kp`) behavior at a certain key position, you must specify _which_ keycode should be used for that key position. -``` +```dts &kp A ``` @@ -69,7 +69,7 @@ In this case, the `A` is actually a define for the raw HID keycode, to make keym For example of a binding that uses two parameters, you can see how "mod-tap" (`mt`) is bound: -``` +```dts &mt LSHIFT D ``` @@ -87,7 +87,7 @@ for what would otherwise be cryptic integer keycodes, etc. This also allows brin The top two lines of most keymaps should include: -``` +```dts #include #include ``` @@ -100,7 +100,7 @@ The second include brings in the defines for all the keycodes (e.g. `A`, `N1`, ` All the remaining keymap nodes will be nested inside of the root devicetree node, like so: -```devicetree +```dts / { // Everything else goes here! }; @@ -111,7 +111,7 @@ All the remaining keymap nodes will be nested inside of the root devicetree node Nested under the devicetree root, is the keymap node. The node _name_ itself is not critical, but the node **MUST** have a property `compatible = "zmk,keymap"` in order to be used by ZMK. -``` +```dts keymap { compatible = "zmk,keymap"; diff --git a/docs/docs/features/underglow.md b/docs/docs/features/underglow.md index 2b1400fc..b5c4c703 100644 --- a/docs/docs/features/underglow.md +++ b/docs/docs/features/underglow.md @@ -28,7 +28,7 @@ Here you can see the RGB underglow feature in action using WS2812 LEDs. To enable RGB underglow on your board or shield, simply enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG_*_STRIP` configuration values in the `.conf` file for your board or shield. For example: -``` +```ini CONFIG_ZMK_RGB_UNDERGLOW=y # Use the STRIP config specific to the LEDs you're using CONFIG_WS2812_STRIP=y @@ -45,7 +45,7 @@ A common issue when enabling underglow is that some of the installed LEDs do not The number of underglow LEDs is controlled by the `chain-length` property in the `led_strip` node. You can [change the value of this property](../config/index.md#changing-devicetree-properties) in the `.keymap` file by adding a stanza like this one outside of any other node (i.e. above or below the `/` node): -``` +```dts &led_strip { chain-length = <21>; }; @@ -70,7 +70,7 @@ With nRF52 boards, you can just use `&spi3` and define the pins you want to use. Here's an example on a definition that uses P0.06: -``` +```dts #include &pinctrl { @@ -135,7 +135,7 @@ For other boards, you must select an SPI definition that has the `MOSI` pin as y Here's another example for a non-nRF52 board on `spi3`: -``` +```dts #include &spi3 { @@ -161,7 +161,7 @@ Here's another example for a non-nRF52 board on `spi3`: Once you have your `led_strip` properly defined you need to add it to the root devicetree node `chosen` element: -``` +```dts / { chosen { zmk,underglow = &led_strip; @@ -171,7 +171,7 @@ Once you have your `led_strip` properly defined you need to add it to the root d Finally you need to enable the `CONFIG_ZMK_RGB_UNDERGLOW` and `CONFIG_*_STRIP` configuration values in the `.conf` file of your board (or set a default in the `Kconfig.defconfig`): -``` +```ini CONFIG_ZMK_RGB_UNDERGLOW=y # Use the STRIP config specific to the LEDs you're using CONFIG_WS2812_STRIP=y diff --git a/docs/docs/keymap-example-file.md b/docs/docs/keymap-example-file.md index d8d201af..91213f15 100644 --- a/docs/docs/keymap-example-file.md +++ b/docs/docs/keymap-example-file.md @@ -1,4 +1,4 @@ -``` +```dts #include #include diff --git a/docs/docs/keymap-example.md b/docs/docs/keymap-example.md index 47d1c06b..e526d542 100644 --- a/docs/docs/keymap-example.md +++ b/docs/docs/keymap-example.md @@ -1,4 +1,4 @@ -``` +```dts keymap { compatible = "zmk,keymap"; diff --git a/docs/docs/user-setup.md b/docs/docs/user-setup.md index 9d04c347..2532fe8b 100644 --- a/docs/docs/user-setup.md +++ b/docs/docs/user-setup.md @@ -67,21 +67,21 @@ values={[ ]}> -``` +```bash bash -c "$(curl -fsSL https://zmk.dev/setup.sh)" ``` -``` +```bash bash -c "$(wget https://zmk.dev/setup.sh -O -)" '' --wget ``` -``` +```powershell powershell -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://zmk.dev/setup.ps1'))" ``` From 6c75d6986c3dfaf7562783476059349c0814792a Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Mon, 9 Oct 2023 15:08:45 +0100 Subject: [PATCH 469/494] feat(docs): Document globe key specific quirks --- docs/docs/codes/_footnotes/globe.mdx | 1 + docs/src/data/footnotes.js | 2 ++ docs/src/data/hid.js | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/docs/codes/_footnotes/globe.mdx diff --git a/docs/docs/codes/_footnotes/globe.mdx b/docs/docs/codes/_footnotes/globe.mdx new file mode 100644 index 00000000..f267a0ee --- /dev/null +++ b/docs/docs/codes/_footnotes/globe.mdx @@ -0,0 +1 @@ +Does not exactly replicate original key behavior on macOS, works for Globe+key modifiers but not Fn+key ([#1938](https://github.com/zmkfirmware/zmk/pull/1938#issuecomment-1744579039)). diff --git a/docs/src/data/footnotes.js b/docs/src/data/footnotes.js index cf91ecdb..ab7f2724 100644 --- a/docs/src/data/footnotes.js +++ b/docs/src/data/footnotes.js @@ -8,10 +8,12 @@ import example from "@site/docs/codes/_footnotes/example.mdx"; import iosApplication from "@site/docs/codes/_footnotes/ios-application.mdx"; import iosPower from "@site/docs/codes/_footnotes/ios-power.mdx"; import macosPower from "@site/docs/codes/_footnotes/macos-power.mdx"; +import globe from "@site/docs/codes/_footnotes/globe.mdx"; export default { example, iosApplication, iosPower, macosPower, + globe, }; diff --git a/docs/src/data/hid.js b/docs/src/data/hid.js index fc61555c..96697bee 100644 --- a/docs/src/data/hid.js +++ b/docs/src/data/hid.js @@ -7884,6 +7884,8 @@ export default [ macos: true, ios: true, }, - footnotes: {}, + footnotes: { + macos: ["globe"], + }, }, ]; From 0c06023ca03fe2e7e7d5f7abe24b3f5d835b5b5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Oct 2023 22:58:15 +0000 Subject: [PATCH 470/494] chore(deps): bump postcss from 8.4.18 to 8.4.31 in /docs Bumps [postcss](https://github.com/postcss/postcss) from 8.4.18 to 8.4.31. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.18...8.4.31) --- updated-dependencies: - dependency-name: postcss dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/package-lock.json | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/docs/package-lock.json b/docs/package-lock.json index f17adc4b..6e597372 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -11189,9 +11189,15 @@ } }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11938,9 +11944,9 @@ } }, "node_modules/postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "funding": [ { "type": "opencollective", @@ -11949,10 +11955,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -24533,9 +24543,9 @@ } }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" }, "natural-compare": { "version": "1.4.0", @@ -25063,11 +25073,11 @@ } }, "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } From a9f677007bccc3d2c0d988d3b1f45bb7d79d6131 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Tue, 10 Oct 2023 20:09:15 -0700 Subject: [PATCH 471/494] fix(blog): Correct incorrect info re: global-quick-tap --- docs/blog/2023-10-05-zmk-sotf-6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/2023-10-05-zmk-sotf-6.md b/docs/blog/2023-10-05-zmk-sotf-6.md index 18a52a85..5aa1567a 100644 --- a/docs/blog/2023-10-05-zmk-sotf-6.md +++ b/docs/blog/2023-10-05-zmk-sotf-6.md @@ -21,7 +21,7 @@ Here's a summary of the various major changes since last time, broken down by th [andrewjrae] added the [`require-prior-idle-ms` property](/docs/behaviors/hold-tap#require-prior-idle-ms) to the hold-tap behavior in [#1187](https://github.com/zmkfirmware/zmk/pull/1187) and [#1387](https://github.com/zmkfirmware/zmk/pull/1387), which prevents the hold behavior from triggering if it hasn't been a certain duration since the last key press. This is a useful feature to prevent accidental hold activations during quick typing and made its way into many keymaps! The same property was added to [combos](/docs/features/combos#configuration) as well to help prevent false combo activations. -Note that an earlier iteration of this feature was supported with the `global-quick-tap` property, which did not allow customizing the timeout and used the value of `tapping-term-ms` for it. This property is now deprecated and users are encouraged to use `require-prior-idle-ms` instead. +Note that an earlier iteration of this feature was supported with the `global-quick-tap` property, which did not allow customizing the timeout and used the value of `quick-tap-ms` for it. This property is now deprecated and users are encouraged to use `require-prior-idle-ms` instead. [urob] added the [`hold-trigger-on-release` property](/docs/behaviors/hold-tap#positional-hold-tap-and-hold-trigger-key-positions) in [#1423](https://github.com/zmkfirmware/zmk/pull/1423). This significantly increases the usefulness of positional constraints on hold-taps, since it allows combining multiple holds such as different modifiers for home row mods usage. From 3ab922822c0b1bbf99e9ea50f17fe15dcef6c3f3 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 2 Oct 2023 22:05:24 -0700 Subject: [PATCH 472/494] feat(shields): Add ZMK Uno nice!view support. Export the `nice_view_spi` node properly from the ZMK Uno overlay to ensure the shield will work when built along with the `nice_view` shield. --- app/boards/shields/zmk_uno/zmk_uno.overlay | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/boards/shields/zmk_uno/zmk_uno.overlay b/app/boards/shields/zmk_uno/zmk_uno.overlay index 78f3b4a7..02bb4ad8 100644 --- a/app/boards/shields/zmk_uno/zmk_uno.overlay +++ b/app/boards/shields/zmk_uno/zmk_uno.overlay @@ -11,9 +11,17 @@ status = "okay"; }; -&arduino_spi { +nice_view_spi: &arduino_spi { status = "okay"; + cs-gpios = <&arduino_header 16 GPIO_ACTIVE_HIGH>; + + // Needed so the nice_view shield will enhance the existing node which falls *first* + // on the bus, properly picking up the first `cs-gpios` specifier. + ls0xx@0 { + reg = <0>; + }; + led_strip: ws2812@0 { compatible = "worldsemi,ws2812-spi"; From a9a53e6da490e319bae5efa85c221010a2578b15 Mon Sep 17 00:00:00 2001 From: Alex Kang Date: Sat, 14 Oct 2023 19:39:42 -0700 Subject: [PATCH 473/494] feat(shields): Reviung34 shield definition * Initial implementation of REVIUNG34 shield. * Add copyright information to files * Added a README with instructions on how to enable the 1x2u layout. * Add a default chosen matrix transform in the default keymap, alongside a commented out version for the alternate layout. --------- Co-authored-by: Peter Johanson Co-authored-by: Cem Aksoylar --- .../shields/reviung34/Kconfig.defconfig | 9 +++ app/boards/shields/reviung34/Kconfig.shield | 5 ++ app/boards/shields/reviung34/README.md | 13 ++++ .../reviung34/boards/nice_nano_v2.overlay | 48 ++++++++++++ app/boards/shields/reviung34/reviung34.conf | 3 + app/boards/shields/reviung34/reviung34.keymap | 77 +++++++++++++++++++ .../shields/reviung34/reviung34.overlay | 63 +++++++++++++++ .../shields/reviung34/reviung34.zmk.yml | 9 +++ 8 files changed, 227 insertions(+) create mode 100644 app/boards/shields/reviung34/Kconfig.defconfig create mode 100644 app/boards/shields/reviung34/Kconfig.shield create mode 100644 app/boards/shields/reviung34/README.md create mode 100644 app/boards/shields/reviung34/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/reviung34/reviung34.conf create mode 100644 app/boards/shields/reviung34/reviung34.keymap create mode 100644 app/boards/shields/reviung34/reviung34.overlay create mode 100644 app/boards/shields/reviung34/reviung34.zmk.yml diff --git a/app/boards/shields/reviung34/Kconfig.defconfig b/app/boards/shields/reviung34/Kconfig.defconfig new file mode 100644 index 00000000..5dc26b4f --- /dev/null +++ b/app/boards/shields/reviung34/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_REVIUNG34 + +config ZMK_KEYBOARD_NAME + default "REVIUNG34" + +endif diff --git a/app/boards/shields/reviung34/Kconfig.shield b/app/boards/shields/reviung34/Kconfig.shield new file mode 100644 index 00000000..f3c63a15 --- /dev/null +++ b/app/boards/shields/reviung34/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_REVIUNG34 + def_bool $(shields_list_contains,reviung34) diff --git a/app/boards/shields/reviung34/README.md b/app/boards/shields/reviung34/README.md new file mode 100644 index 00000000..e62c52d6 --- /dev/null +++ b/app/boards/shields/reviung34/README.md @@ -0,0 +1,13 @@ +# REVIUNG34 + +REVIUNG34 is a 33-34 key unibody split keyboard by [gtips](https://github.com/gtips). An in-stock version can be found at [Little Keyboards](https://www.littlekeyboards.com/products/reviung34-analyst-keyboard-kit). + +By default, the 2x1u layout is used. To use to the 1x2u layout, add the following to your keymap: + +``` +/ { + chosen { + zmk,matrix_transform = &single_2u_transform; + }; +}; +``` diff --git a/app/boards/shields/reviung34/boards/nice_nano_v2.overlay b/app/boards/shields/reviung34/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..b8d21398 --- /dev/null +++ b/app/boards/shields/reviung34/boards/nice_nano_v2.overlay @@ -0,0 +1,48 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <9>; /* number of LEDs */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung34/reviung34.conf b/app/boards/shields/reviung34/reviung34.conf new file mode 100644 index 00000000..289f070b --- /dev/null +++ b/app/boards/shields/reviung34/reviung34.conf @@ -0,0 +1,3 @@ +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/reviung34/reviung34.keymap b/app/boards/shields/reviung34/reviung34.keymap new file mode 100644 index 00000000..eefc510a --- /dev/null +++ b/app/boards/shields/reviung34/reviung34.keymap @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + chosen { + // 34 keys. + zmk,matrix_transform = &dual_1u_transform; + + // 33 keys. Center two thumb keys replaced by a single 2u key. Remember to adjust your + // keymap accordingly! + // zmk,matrix_transform = &single_2u_transform; + }; +}; + +/ { + keymap { + compatible = "zmk,keymap"; + + base { + label = "Base"; + bindings = < +&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P +&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI +&mt LSHFT Z &mt LCTRL X &mt LALT C &kp V &kp B &kp N &kp M &mt RALT COMMA &mt RCTRL DOT &mt RSHFT SLASH + &kp LGUI < 1 BSPC < 2 SPACE &mo 3 + >; + }; + + lower { + label = "Lower"; + bindings = < +&kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR +&trans &kp TILDE &kp DQT &kp PIPE &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &trans &mo 4 &trans + >; + }; + + upper { + label = "Upper"; + bindings = < +&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 +&trans &kp GRAVE &kp SQT &kp BSLH &trans &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &mo 4 &trans &trans + >; + }; + + function { + label = "Function"; + bindings = < +&kp TAB &trans &kp C_VOL_UP &trans &trans &trans &trans &trans &trans &kp ENTER +&kp ESC &kp C_BRI_DN &kp C_VOL_DN &kp C_BRI_UP &trans &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans + &trans &kp C_PWR &trans &trans + >; + }; + + meta { + label = "Meta"; + bindings = < +&rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_BRI &rgb_ug RGB_SPI &rgb_ug RGB_EFF &none &none &none &none &none +&rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_BRD &rgb_ug RGB_SPD &rgb_ug RGB_EFR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 +&none &none &rgb_ug RGB_TOG &none &none &none &none &bt BT_CLR &none &none + &none &trans &trans &none + >; + }; + }; +}; diff --git a/app/boards/shields/reviung34/reviung34.overlay b/app/boards/shields/reviung34/reviung34.overlay new file mode 100644 index 00000000..46d85996 --- /dev/null +++ b/app/boards/shields/reviung34/reviung34.overlay @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &dual_1u_transform; + }; + + dual_1u_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <9>; + rows = <4>; + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(3,5) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(3,6) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(3,7) + RC(3,2) RC(3,3) RC(3,4) RC(3,8) + >; + }; + + single_2u_transform: keymap_transform_1 { + compatible = "zmk,matrix-transform"; + columns = <9>; + rows = <4>; + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(3,5) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(3,6) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(3,7) + RC(3,2) RC(3,4) RC(3,8) + >; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&pro_micro 4 GPIO_ACTIVE_HIGH> + , <&pro_micro 5 GPIO_ACTIVE_HIGH> + , <&pro_micro 6 GPIO_ACTIVE_HIGH> + , <&pro_micro 7 GPIO_ACTIVE_HIGH> + , <&pro_micro 8 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; +}; diff --git a/app/boards/shields/reviung34/reviung34.zmk.yml b/app/boards/shields/reviung34/reviung34.zmk.yml new file mode 100644 index 00000000..76ed745d --- /dev/null +++ b/app/boards/shields/reviung34/reviung34.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: reviung34 +name: REVIUNG34 +type: shield +url: https://github.com/gtips/reviung/tree/master/reviung34 +requires: [pro_micro] +features: + - keys + - underglow From 3b1d04372b0a013ec2738019166c1c2e85bf0ba7 Mon Sep 17 00:00:00 2001 From: Joel Spadin Date: Fri, 13 Oct 2023 14:58:27 -0500 Subject: [PATCH 474/494] feat: Print Kconfig and DTS for failed builds Added the combined devicetree file to the user config build action. Set it and the Kconfig output to run even on a failed build. --- .github/workflows/build-user-config.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 5891ddc1..c1a97b4d 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -97,7 +97,27 @@ jobs: run: west build -s zmk/app -b "${{ matrix.board }}" -- -DZMK_CONFIG="${GITHUB_WORKSPACE}/${{ inputs.config_path }}" ${{ env.extra_cmake_args }} ${{ matrix.cmake-args }} - name: ${{ env.display_name }} Kconfig file - run: grep -v -e "^#" -e "^$" build/zephyr/.config | sort + run: | + if [ -f build/zephyr/.config ] + then + grep -v -e "^#" -e "^$" build/zephyr/.config | sort + else + echo "No Kconfig output" + fi + if: ${{ !cancelled() }} + + - name: ${{ env.display_name }} Devicetree file + run: | + if [ -f build/zephyr/zephyr.dts ] + then + cat build/zephyr/zephyr.dts + elif [ -f build/zephyr/zephyr.dts.pre ] + then + cat -s build/zephyr/zephyr.dts.pre + else + echo "No Devicetree output" + fi + if: ${{ !cancelled() }} - name: Rename artifacts shell: sh -x {0} From 7fe9ecd87f086fe6fcf253559e751fab575faa5c Mon Sep 17 00:00:00 2001 From: Khalid Aj Date: Wed, 18 Oct 2023 05:43:50 +0700 Subject: [PATCH 475/494] feat(shields): Add Reviung53 shield. * Initial Reviung53 shield --------- Co-authored-by: Cem Aksoylar --- .../shields/reviung53/Kconfig.defconfig | 9 ++ app/boards/shields/reviung53/Kconfig.shield | 5 + .../reviung53/boards/nice_nano.overlay | 47 ++++++++ .../reviung53/boards/nice_nano_v2.overlay | 47 ++++++++ app/boards/shields/reviung53/reviung53.conf | 3 + app/boards/shields/reviung53/reviung53.keymap | 109 ++++++++++++++++++ .../shields/reviung53/reviung53.overlay | 56 +++++++++ .../shields/reviung53/reviung53.zmk.yml | 9 ++ 8 files changed, 285 insertions(+) create mode 100644 app/boards/shields/reviung53/Kconfig.defconfig create mode 100644 app/boards/shields/reviung53/Kconfig.shield create mode 100644 app/boards/shields/reviung53/boards/nice_nano.overlay create mode 100644 app/boards/shields/reviung53/boards/nice_nano_v2.overlay create mode 100644 app/boards/shields/reviung53/reviung53.conf create mode 100644 app/boards/shields/reviung53/reviung53.keymap create mode 100644 app/boards/shields/reviung53/reviung53.overlay create mode 100644 app/boards/shields/reviung53/reviung53.zmk.yml diff --git a/app/boards/shields/reviung53/Kconfig.defconfig b/app/boards/shields/reviung53/Kconfig.defconfig new file mode 100644 index 00000000..efac69b7 --- /dev/null +++ b/app/boards/shields/reviung53/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_REVIUNG53 + +config ZMK_KEYBOARD_NAME + default "Reviung53" + +endif diff --git a/app/boards/shields/reviung53/Kconfig.shield b/app/boards/shields/reviung53/Kconfig.shield new file mode 100644 index 00000000..0b0613e2 --- /dev/null +++ b/app/boards/shields/reviung53/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2023 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_REVIUNG53 + def_bool $(shields_list_contains,reviung53) diff --git a/app/boards/shields/reviung53/boards/nice_nano.overlay b/app/boards/shields/reviung53/boards/nice_nano.overlay new file mode 100644 index 00000000..4df91903 --- /dev/null +++ b/app/boards/shields/reviung53/boards/nice_nano.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung53/boards/nice_nano_v2.overlay b/app/boards/shields/reviung53/boards/nice_nano_v2.overlay new file mode 100644 index 00000000..4df91903 --- /dev/null +++ b/app/boards/shields/reviung53/boards/nice_nano_v2.overlay @@ -0,0 +1,47 @@ +#include + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <10>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +/ { + chosen { + zmk,underglow = &led_strip; + }; +}; diff --git a/app/boards/shields/reviung53/reviung53.conf b/app/boards/shields/reviung53/reviung53.conf new file mode 100644 index 00000000..289f070b --- /dev/null +++ b/app/boards/shields/reviung53/reviung53.conf @@ -0,0 +1,3 @@ +# Uncomment the following lines to enable RGB underglow +# CONFIG_ZMK_RGB_UNDERGLOW=y +# CONFIG_WS2812_STRIP=y diff --git a/app/boards/shields/reviung53/reviung53.keymap b/app/boards/shields/reviung53/reviung53.keymap new file mode 100644 index 00000000..d00ca6b9 --- /dev/null +++ b/app/boards/shields/reviung53/reviung53.keymap @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + conditional_layers { + compatible = "zmk,conditional-layers"; + tri_layer { + if-layers = <1 2>; + then-layer = <3>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ---------------------------------------------------------------------------------------- +// | | | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | DEL | +// | TAB | Q | W | E | R | T | Y | U | I | O | P | BKSP | +// | CAPS | A | S | D | F | G | H | J | K | L | ; | RET | +// | SHFT | Z | X | C | V | B | N | M | , | . | SHFT(/) | +// | CTRL | GUI | ALT | LOWER(SPACE) | RAISE(SPACE)| ALT | GUI | CTRL(\) | +// | + bindings = < + &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp DEL + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC + &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp RET + &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH + &kp LCTRL &kp LCMD &kp LALT < 1 SPACE < 2 SPACE &kp RALT &kp RCMD &mt RCTRL BSLH + >; + }; + + lower_layer { +// -------------------------------------------------------------------------------------------- +// | | | | F9 | F10 | F11 | F12 | INS | PAU | SCR | PSCR | | +// | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | +// | NAV | | | | | | | _ | + | { | } | " | +// | | | | | | | | | | | ? | +// | | | | | | | | | | +// | + bindings = < + &trans &kp F9 &kp F10 &kp F11 &kp F12 &kp INS &kp PAUSE_BREAK &kp SLCK &kp PSCRN &trans + &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &trans + &mo 4 &none &none &none &none &none &none &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp DQT + &trans &none &none &none &none &none &none &none &none &none &kp QMARK + &trans &trans &trans &trans &trans &trans &trans &kp PIPE + >; + }; + + raise_layer { +// -------------------------------------------------------------------------------------- +// | | | | F9 | F10 | F11 | F12 | MUTE | VOL+ | VOL- | PLAY | | +// | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | +// | NAV | | | | | | | - | = | [ | ] | ' | +// | | | | | | | | + | < | > | : | +// | | | | | | | | | | +// | + bindings = < + &trans &kp F9 &kp F10 &kp F11 &kp F12 &kp C_MUTE &kp C_VOL_UP &kp C_VOL_DN &kp C_PLAY &trans + &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans + &mo 4 &none &none &none &none &none &none &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp SQT + &trans &none &none &none &none &none &none &kp PLUS &kp LT &kp GT &kp COLON + &trans &trans &trans &trans &trans &trans &trans &kp PIPE + >; + }; + + adjust_layer { +// ------------------------------------------------------------------------------------------------------------------------ +// | | | BT CLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | BT CLR | +// | RGB BRI+ | RGB SAT+ | RGB HUE+ | RGB ANI+ | | RGB TOG | | | | | | | +// | RGB BRI- | RGB SAT- | RGB HUE- | RGB ANI- | | | | | | | | | +// | | | | | | | BOOT | | | | | +// | | | | | | | | | +// | + bindings = < + &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &none &none &none &bt BT_CLR + &rgb_ug RGB_BRI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_EFF &none &rgb_ug RGB_TOG &none &none &none &none &none &none + &rgb_ug RGB_BRD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_EFR &none &none &none &none &none &none &none &none + &trans &none &none &none &none &none &bootloader &none &none &none &none + &trans &trans &trans &trans &trans &none &none &none + >; + }; + + nav_layer { +// ------------------------------------------------------------------------------------------------------------------------ +// | | | ESC | | | | | | | | | DEL | +// | TAB | | UP | | | | | | | | | BSPC | +// | NAV | LEFT | DOWN | RIGHT | | | LEFT | DOWN | UP | RIGHT | | ENTER | +// | SHIFT | | | | | | HOME | END | PGUP | PGDN | SHIFT | +// | CTRL | GUI | ALT | SPACE | SPACE | ALT | GUI | CTRL | +// | + bindings = < + &kp ESC &none &none &none &none &none &none &none &none &kp DEL + &kp TAB &none &kp UP &none &none &none &none &none &none &none &none &kp BSPC + &trans &kp LEFT &kp DOWN &kp RIGHT &none &none &kp LEFT &kp DOWN &kp UP &kp RIGHT &none &kp RET + &kp LSHFT &none &none &none &none &none &kp HOME &kp END &kp PG_UP &kp PG_DN &kp RSHFT + &kp LCTRL &kp LCMD &kp LALT &kp SPACE &kp SPACE &kp LALT &kp RCMD &kp RCTRL + >; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/reviung53/reviung53.overlay b/app/boards/shields/reviung53/reviung53.overlay new file mode 100644 index 00000000..213b3b81 --- /dev/null +++ b/app/boards/shields/reviung53/reviung53.overlay @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2023 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <8>; + rows = <7>; + + map = < + RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(4,0) RC(4,1) RC(4,2) RC(4,3) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(4,4) RC(4,5) RC(4,6) RC(4,7) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(5,0) RC(5,1) RC(5,2) RC(5,3) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(5,4) RC(5,5) RC(5,6) +RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) RC(6,6) RC(6,7) + >; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> + , <&pro_micro 20 GPIO_ACTIVE_HIGH> + , <&pro_micro 19 GPIO_ACTIVE_HIGH> + , <&pro_micro 18 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; + + row-gpios + = <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + + }; +}; diff --git a/app/boards/shields/reviung53/reviung53.zmk.yml b/app/boards/shields/reviung53/reviung53.zmk.yml new file mode 100644 index 00000000..e670755c --- /dev/null +++ b/app/boards/shields/reviung53/reviung53.zmk.yml @@ -0,0 +1,9 @@ +file_format: "1" +id: reviung53 +name: REVIUNG53 +type: shield +url: https://github.com/gtips/reviung/tree/master/reviung53 +requires: [pro_micro] +features: + - keys + - underglow From 82e85699edd7261500ea2feb0697f8a6a5bbd42c Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Thu, 19 Oct 2023 22:04:04 +0100 Subject: [PATCH 476/494] feat(docs): Document ZMK_BATTERY_REPORTING config (#1971) `CONFIG_ZMK_BATTERY_REPORTING` is currently undocumented, A new KConfig section for battery has been added in line with the other sections in the configuration section of the docs, `CONFIG_ZMK_BATTERY_REPORT_INTERVAL` has been moved from system to battery for consistency --- docs/docs/config/battery.md | 15 +++++++++++++++ docs/docs/config/system.md | 13 ++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/docs/docs/config/battery.md b/docs/docs/config/battery.md index 73b4ee92..7b7e9436 100644 --- a/docs/docs/config/battery.md +++ b/docs/docs/config/battery.md @@ -7,6 +7,21 @@ See the [battery level feature page](../features/battery.md) for more details on See [Configuration Overview](index.md) for instructions on how to change these settings. +### Kconfig + +Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) + +| Config | Type | Description | Default | +| ------------------------------------ | ---- | ------------------------------------------------------ | ------- | +| `CONFIG_ZMK_BATTERY_REPORTING` | bool | Enables/disables all battery level detection/reporting | n | +| `CONFIG_ZMK_BATTERY_REPORT_INTERVAL` | int | Battery level report interval in seconds | 60 | + +:::note Default setting + +While `CONFIG_ZMK_BATTERY_REPORTING` is disabled by default it is implied by `CONFIG_ZMK_BLE`, thus any board with BLE enabled will have this automatically enabled unless explicitly overriden. + +::: + ### Devicetree Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/guides/dts/intro.html#aliases-and-chosen-nodes) diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 5a5ae5a5..25d51940 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -13,13 +13,12 @@ Definition file: [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/ ### General -| Config | Type | Description | Default | -| ------------------------------------ | ------ | ----------------------------------------------------------------------------- | ------- | -| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | | -| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | -| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | -| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | -| `CONFIG_ZMK_BATTERY_REPORT_INTERVAL` | int | Battery level report interval in seconds | 60 | +| Config | Type | Description | Default | +| ----------------------------------- | ------ | ----------------------------------------------------------------------------- | ------- | +| `CONFIG_ZMK_KEYBOARD_NAME` | string | The name of the keyboard (max 16 characters) | | +| `CONFIG_ZMK_SETTINGS_SAVE_DEBOUNCE` | int | Milliseconds to wait after a setting change before writing it to flash memory | 60000 | +| `CONFIG_ZMK_WPM` | bool | Enable calculating words per minute | n | +| `CONFIG_HEAP_MEM_POOL_SIZE` | int | Size of the heap memory pool | 8192 | ### HID From 9e8ee8684252aecca36c1e6f2403b0a9fd3ebf4f Mon Sep 17 00:00:00 2001 From: Nick Coutsos Date: Sun, 22 Oct 2023 12:05:49 -0400 Subject: [PATCH 477/494] chore(docs): Fix links to relocated files (#1975) --- docs/docs/config/battery.md | 2 +- docs/docs/config/displays.md | 4 ++-- docs/docs/config/encoders.md | 4 ++-- docs/docs/config/kscan.md | 14 +++++++------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/docs/config/battery.md b/docs/docs/config/battery.md index 7b7e9436..c56a30ef 100644 --- a/docs/docs/config/battery.md +++ b/docs/docs/config/battery.md @@ -48,7 +48,7 @@ Driver for reading the voltage of a battery using a Nordic nRF52's VDDH pin. Thi Applies to: `compatible = "zmk,battery-nrf-vddh"` -Definition file: [zmk/app/drivers/zephyr/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/sensor/zmk%2Cbattery-nrf-vddh.yaml) +Definition file: [zmk/app/module/dts/bindings/sensor/zmk,battery-nrf-vddh.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/sensor/zmk%2Cbattery-nrf-vddh.yaml) | Property | Type | Description | | -------- | ------ | ------------------------- | diff --git a/docs/docs/config/displays.md b/docs/docs/config/displays.md index a68bf26a..e22f0da8 100644 --- a/docs/docs/config/displays.md +++ b/docs/docs/config/displays.md @@ -49,7 +49,7 @@ Using a dedicated thread requires more memory but prevents displays with slow up You must also configure the driver for your display. ZMK provides the following display drivers: -- [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/display/Kconfig.il0323) +- [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/module/drivers/display/Kconfig.il0323) Zephyr provides several display drivers as well. Search for the name of your display in [Zephyr's Kconfig options](https://docs.zephyrproject.org/latest/kconfig.html) documentation. @@ -57,7 +57,7 @@ Zephyr provides several display drivers as well. Search for the name of your dis See the Devicetree bindings for your display. Here are the bindings for common displays: -- [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/dts/bindings/display/gooddisplay%2Cil0323.yaml) +- [IL0323](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/display/gooddisplay%2Cil0323.yaml) - [SSD1306 (i2c)](https://docs.zephyrproject.org/latest/build/dts/api/bindings/display/solomon,ssd1306fb-i2c.html) - [SSD1306 (spi)](https://docs.zephyrproject.org/latest/build/dts/api/bindings/display/solomon,ssd1306fb-spi.html) diff --git a/docs/docs/config/encoders.md b/docs/docs/config/encoders.md index f6bd6de1..97a0cc38 100644 --- a/docs/docs/config/encoders.md +++ b/docs/docs/config/encoders.md @@ -11,7 +11,7 @@ See [Configuration Overview](index.md) for instructions on how to change these s ### Kconfig -Definition file: [zmk/app/drivers/sensor/ec11/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/sensor/ec11/Kconfig) +Definition file: [zmk/app/module/drivers/sensor/ec11/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/module/drivers/sensor/ec11/Kconfig) | Config | Type | Description | Default | | ------------------------------- | ---- | -------------------------------- | ------- | @@ -31,7 +31,7 @@ If `CONFIG_EC11` is enabled, exactly one of the following options must be set to Applies to: `compatible = "alps,ec11"` -Definition file: [zmk/app/drivers/zephyr/dts/bindings/sensor/alps,ec11.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/sensor/alps%2Cec11.yaml) +Definition file: [zmk/app/module/dts/bindings/sensor/alps,ec11.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/sensor/alps%2Cec11.yaml) | Property | Type | Description | Default | | ------------ | ---------- | ------------------------------------- | ------- | diff --git a/docs/docs/config/kscan.md b/docs/docs/config/kscan.md index 67c37652..00360c46 100644 --- a/docs/docs/config/kscan.md +++ b/docs/docs/config/kscan.md @@ -12,7 +12,7 @@ See [Configuration Overview](index.md) for instructions on how to change these s Definition files: - [zmk/app/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/Kconfig) -- [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) +- [zmk/app/module/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/module/drivers/kscan/Kconfig) | Config | Type | Description | Default | | -------------------------------------- | ---- | ---------------------------------------------------- | ------- | @@ -44,7 +44,7 @@ Currently this driver does not honor the `CONFIG_ZMK_KSCAN_DEBOUNCE_*` settings. Applies to: `compatible = "zmk,kscan-gpio-demux"` -Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-demux.yaml) +Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-demux.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/kscan/zmk%2Ckscan-gpio-demux.yaml) | Property | Type | Description | Default | | ----------------------- | ---------- | -------------------------------- | ------- | @@ -60,7 +60,7 @@ Keyboard scan driver where each key has a dedicated GPIO. ### Kconfig -Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) +Definition file: [zmk/app/module/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/module/drivers/kscan/Kconfig) | Config | Type | Description | Default | | --------------------------------- | ---- | ------------------------------------------------ | ------- | @@ -70,7 +70,7 @@ Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/ Applies to: `compatible = "zmk,kscan-gpio-direct"` -Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-direct.yaml) +Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-direct.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/kscan/zmk%2Ckscan-gpio-direct.yaml) | Property | Type | Description | Default | | ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ------- | @@ -102,7 +102,7 @@ Assuming the switches connect each GPIO pin to the ground, the [GPIO flags](http Keyboard scan driver where keys are arranged on a matrix with one GPIO per row and column. -Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/kscan/Kconfig) +Definition file: [zmk/app/module/drivers/kscan/Kconfig](https://github.com/zmkfirmware/zmk/blob/main/app/module/drivers/kscan/Kconfig) | Config | Type | Description | Default | | ---------------------------------------------- | ----------- | ------------------------------------------------------------------------- | ------- | @@ -114,7 +114,7 @@ Definition file: [zmk/app/drivers/kscan/Kconfig](https://github.com/zmkfirmware/ Applies to: `compatible = "zmk,kscan-gpio-matrix"` -Definition file: [zmk/app/drivers/zephyr/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/kscan/zmk%2Ckscan-gpio-matrix.yaml) +Definition file: [zmk/app/module/dts/bindings/kscan/zmk,kscan-gpio-matrix.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/kscan/zmk%2Ckscan-gpio-matrix.yaml) | Property | Type | Description | Default | | ------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------- | ----------- | @@ -284,7 +284,7 @@ Definition file: [zmk/app/dts/bindings/zmk,kscan-mock.yaml](https://github.com/z | `cols` | int | The number of columns in the composite matrix | | | `exit-after` | bool | Exit the program after running all events | false | -The `events` array should be defined using the macros from [dt-bindings/zmk/kscan_mock.h](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/kscan_mock.h). +The `events` array should be defined using the macros from [app/module/include/dt-bindings/zmk/kscan_mock.h](https://github.com/zmkfirmware/zmk/blob/main/app/module/include/dt-bindings/zmk/kscan_mock.h). ## Matrix Transform From 8d09809ef0cfb29c4481e1b31327e0866c2fb902 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 18 Oct 2023 01:19:14 +0000 Subject: [PATCH 478/494] fix(docs): Updated encoder config docs. * Update new shield guide for new sensor/encoder settings. * Add DTS section to encoder config docs. Co-authored-by: Cem Aksoylar --- docs/docs/config/encoders.md | 54 +++++++++++++++++++++++++---- docs/docs/development/new-shield.md | 13 ++++--- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/docs/docs/config/encoders.md b/docs/docs/config/encoders.md index 97a0cc38..3044b392 100644 --- a/docs/docs/config/encoders.md +++ b/docs/docs/config/encoders.md @@ -29,13 +29,55 @@ If `CONFIG_EC11` is enabled, exactly one of the following options must be set to ### Devicetree +#### Keymap Sensor Config + +For shields/boards that export a `sensors` node configuration label, both global and per-sensor settings can be set by overriding the properties there. + +To override the general settings, update them on the exported `sensors` node, e.g.: + +``` +&sensors { + triggers-per-rotation = <18>; +}; +``` + +Per sensor overrides can be added with ordered nested nodes with the correct overrides, e.g.: + +``` +&sensors { + left_config { + triggers-per-rotation = <18>; + }; + + right_config { + triggers-per-rotation = <24>; + }; +}; +``` + +:::note + +The names of the child nodes are not important, and are applied in order to the sensors listed in the `sensors` property of the sensors node. + +::: + +Applies to the node and child nodes of: `compatible = "zmk,keymap-sensors"` + +Definition file: [zmk/app/drivers/zephyr/dts/bindings/zmk,keymap-sensors.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/drivers/zephyr/dts/bindings/zmk%2Ckeymap-sensors.yaml) + +| Property | Type | Description | Default | +| ----------------------- | ---- | --------------------------------------------------------------- | ------- | +| `triggers-per-rotation` | int | Number of times to trigger the bound behavior per full rotation | | + +#### EC11 Nodes + Applies to: `compatible = "alps,ec11"` Definition file: [zmk/app/module/dts/bindings/sensor/alps,ec11.yaml](https://github.com/zmkfirmware/zmk/blob/main/app/module/dts/bindings/sensor/alps%2Cec11.yaml) -| Property | Type | Description | Default | -| ------------ | ---------- | ------------------------------------- | ------- | -| `label` | string | Unique label for the node | | -| `a-gpios` | GPIO array | GPIO connected to the encoder's A pin | | -| `b-gpios` | GPIO array | GPIO connected to the encoder's B pin | | -| `resolution` | int | Number of encoder pulses per tick | 1 | +| Property | Type | Description | Default | +| --------- | ---------- | ---------------------------------------------- | ------- | +| `label` | string | Unique label for the node | | +| `a-gpios` | GPIO array | GPIO connected to the encoder's A pin | | +| `b-gpios` | GPIO array | GPIO connected to the encoder's B pin | | +| `steps` | int | Number of encoder pulses per complete rotation | | diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index fa30ca38..07711229 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -430,31 +430,36 @@ If building locally for split boards, you may need to add these lines to the spe In your device tree file you will need to add the following lines to define the encoder sensor: ```dts -left_encoder: encoder_left { + left_encoder: encoder_left { compatible = "alps,ec11"; label = "LEFT_ENCODER"; a-gpios = ; b-gpios = ; - resolution = <4>; + steps = <80>; status = "disabled"; }; ``` -Here you will have to replace PIN_A and PIN_B with the appropriate pins that your PCB utilizes for the encoder(s). For keyboards that use the Pro Micro or any of the Pro Micro replacements, Sparkfun's [Pro Micro Hookup Guide](https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro) has a pinout diagram that can be useful to determine the right pins. Reference either the blue numbers labeled "Arduino" (digital pins) or the green numbers labeled "Analog" (analog pins). For pins that are labeled as both digital and analog, refer to your specific board's .dtsi file to determine how you should refer to that pin. +Here you need to replace `PIN_A` and `PIN_B` with the appropriate pins that your PCB utilizes for the encoder(s). See [shield overlays section above](#shield-overlays) on the appropriate node label and pin number to use for GPIOs. + +The `steps` property should corresponded to the documented pulses per rotation for the encoders used on the keyboard, typically found on the datasheet of the component. If users use different encoders when they build, the value can be overridden in their keymap. Add additional encoders as necessary by duplicating the above lines, replacing `left` with whatever you would like to call your encoder, and updating the pins. Note that support for peripheral (right) side sensors over BLE is still in progress. Once you have defined the encoder sensors, you will have to add them to the list of sensors: ```dts - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; ``` In this example, a left_encoder and right_encoder are both added. Additional encoders can be added with spaces separating each, and the order they are added here determines the order in which you define their behavior in your keymap. +In addition, a default value for the number of times the sensors trigger the bound behavior per full rotation is set via the `triggers-per-rotation` property. See [Encoders Config](../config/encoders.md#devicetree) for more details. + Add the following lines to your overlay file(s) to enable the encoder: From 34c8b3f1e30725d2711d5a75cd2da8e60da7b995 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 18 Oct 2023 02:33:03 +0000 Subject: [PATCH 479/494] refactor: Update boards/shields for encoders. * Update existing boards/shields for new `steps` and `triggers-per-rotation` set up. --- app/boards/arm/bdn9/bdn9_rev2.dts | 7 ++++--- app/boards/arm/bt60/bt60.dtsi | 5 +++-- app/boards/arm/ckp/ckp.dtsi | 9 +++++---- app/boards/shields/knob_goblin/knob_goblin.overlay | 7 ++++--- app/boards/shields/kyria/kyria_common.dtsi | 7 ++++--- app/boards/shields/lily58/lily58.dtsi | 5 +++-- app/boards/shields/lotus58/lotus58.dtsi | 7 ++++--- app/boards/shields/murphpad/murphpad.keymap | 1 + app/boards/shields/murphpad/murphpad.overlay | 4 ++-- app/boards/shields/nibble/nibble.keymap | 1 + app/boards/shields/nibble/nibble.overlay | 2 +- app/boards/shields/reviung5/reviung5.overlay | 5 +++-- app/boards/shields/romac_plus/romac_plus.dtsi | 5 +++-- app/boards/shields/snap/snap.dtsi | 4 ++-- app/boards/shields/snap/snap.keymap | 1 + app/boards/shields/sofle/sofle.dtsi | 7 ++++--- .../splitkb_aurora_corne/splitkb_aurora_corne.dtsi | 7 ++++--- .../splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi | 7 ++++--- .../splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi | 11 ++++++----- app/boards/shields/tidbit/tidbit.dtsi | 10 +++++----- app/boards/shields/tidbit/tidbit.keymap | 1 + app/boards/shields/zodiark/zodiark.dtsi | 7 ++++--- 22 files changed, 69 insertions(+), 51 deletions(-) diff --git a/app/boards/arm/bdn9/bdn9_rev2.dts b/app/boards/arm/bdn9/bdn9_rev2.dts index d2d1c65c..1b85067c 100644 --- a/app/boards/arm/bdn9/bdn9_rev2.dts +++ b/app/boards/arm/bdn9/bdn9_rev2.dts @@ -43,7 +43,7 @@ label = "LEFT_ENCODER"; a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; mid_encoder: encoder_mid { @@ -51,7 +51,7 @@ label = "MID_ENCODER"; a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; right_encoder: encoder_right { @@ -59,7 +59,7 @@ label = "RIGHT_ENCODER"; a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -67,6 +67,7 @@ compatible = "zmk,keymap-sensors"; status = "disabled"; sensors = <>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/arm/bt60/bt60.dtsi b/app/boards/arm/bt60/bt60.dtsi index 6e4900af..8a270250 100644 --- a/app/boards/arm/bt60/bt60.dtsi +++ b/app/boards/arm/bt60/bt60.dtsi @@ -22,9 +22,10 @@ zmk,matrix_transform = &default_transform; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder>; + triggers-per-rotation = <20>; }; @@ -34,7 +35,7 @@ label = "LEFT_ENCODER"; a-gpios = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; diff --git a/app/boards/arm/ckp/ckp.dtsi b/app/boards/arm/ckp/ckp.dtsi index 6c52d620..ec2bd6a8 100644 --- a/app/boards/arm/ckp/ckp.dtsi +++ b/app/boards/arm/ckp/ckp.dtsi @@ -26,9 +26,10 @@ zmk,battery = &vbatt; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1>; + triggers-per-rotation = <20>; }; kscan0: kscan_0 { @@ -76,7 +77,7 @@ label = "ENCODER_ONE"; a-gpios = <&gpio0 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpio0 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; @@ -85,7 +86,7 @@ label = "ENCODER_TWO"; a-gpios = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; @@ -94,7 +95,7 @@ label = "encoder_3"; a-gpios = <&gpio0 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&gpio0 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; diff --git a/app/boards/shields/knob_goblin/knob_goblin.overlay b/app/boards/shields/knob_goblin/knob_goblin.overlay index d3ba8c5b..03051ce5 100644 --- a/app/boards/shields/knob_goblin/knob_goblin.overlay +++ b/app/boards/shields/knob_goblin/knob_goblin.overlay @@ -39,7 +39,7 @@ label = "TOP_ENCODER"; a-gpios = <&pro_micro 19 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 18 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; @@ -48,13 +48,14 @@ label = "BOTTOM_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&top_encoder &bottom_encoder>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/shields/kyria/kyria_common.dtsi b/app/boards/shields/kyria/kyria_common.dtsi index 2e10cd37..1056794d 100644 --- a/app/boards/shields/kyria/kyria_common.dtsi +++ b/app/boards/shields/kyria/kyria_common.dtsi @@ -23,20 +23,21 @@ left_encoder: encoder_left { compatible = "alps,ec11"; label = "LEFT_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; }; right_encoder: encoder_right { compatible = "alps,ec11"; label = "RIGHT_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; // TODO: RGB node(s) diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index ec520f6b..eb427a58 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -51,12 +51,13 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/shields/lotus58/lotus58.dtsi b/app/boards/shields/lotus58/lotus58.dtsi index e24d75e7..8b1c66f9 100644 --- a/app/boards/shields/lotus58/lotus58.dtsi +++ b/app/boards/shields/lotus58/lotus58.dtsi @@ -50,7 +50,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -59,13 +59,14 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7 label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/shields/murphpad/murphpad.keymap b/app/boards/shields/murphpad/murphpad.keymap index ccdff9f7..74a852a8 100644 --- a/app/boards/shields/murphpad/murphpad.keymap +++ b/app/boards/shields/murphpad/murphpad.keymap @@ -48,6 +48,7 @@ sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1 &encoder_2>; + triggers-per-rotation = <20>; }; diff --git a/app/boards/shields/murphpad/murphpad.overlay b/app/boards/shields/murphpad/murphpad.overlay index 13905092..f175c55e 100644 --- a/app/boards/shields/murphpad/murphpad.overlay +++ b/app/boards/shields/murphpad/murphpad.overlay @@ -39,7 +39,7 @@ label = "Encoder 1"; a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -48,7 +48,7 @@ label = "Encoder 2"; a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; diff --git a/app/boards/shields/nibble/nibble.keymap b/app/boards/shields/nibble/nibble.keymap index 5b90f6c1..4cb6f5b0 100644 --- a/app/boards/shields/nibble/nibble.keymap +++ b/app/boards/shields/nibble/nibble.keymap @@ -12,6 +12,7 @@ sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1>; + triggers-per-rotation = <20>; }; keymap { diff --git a/app/boards/shields/nibble/nibble.overlay b/app/boards/shields/nibble/nibble.overlay index cd117640..43be6c76 100644 --- a/app/boards/shields/nibble/nibble.overlay +++ b/app/boards/shields/nibble/nibble.overlay @@ -18,7 +18,7 @@ label = "Encoder 1"; a-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; diff --git a/app/boards/shields/reviung5/reviung5.overlay b/app/boards/shields/reviung5/reviung5.overlay index 24b0f582..8b885245 100644 --- a/app/boards/shields/reviung5/reviung5.overlay +++ b/app/boards/shields/reviung5/reviung5.overlay @@ -43,12 +43,13 @@ label = "encoder"; a-gpios = <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "okay"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder>; + triggers-per-rotation = <20>; }; }; \ No newline at end of file diff --git a/app/boards/shields/romac_plus/romac_plus.dtsi b/app/boards/shields/romac_plus/romac_plus.dtsi index 71ec87b2..5324174b 100644 --- a/app/boards/shields/romac_plus/romac_plus.dtsi +++ b/app/boards/shields/romac_plus/romac_plus.dtsi @@ -43,13 +43,14 @@ RC(3,0) RC(3,1) RC(3,2) label = "LEFT_ENCODER"; a-gpios = <&pro_micro 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder>; + triggers-per-rotation = <20>; }; // TODO: per-key RGB node(s)? diff --git a/app/boards/shields/snap/snap.dtsi b/app/boards/shields/snap/snap.dtsi index a374ad17..7523f35b 100644 --- a/app/boards/shields/snap/snap.dtsi +++ b/app/boards/shields/snap/snap.dtsi @@ -16,14 +16,14 @@ left_encoder: encoder_left { compatible = "alps,ec11"; label = "LEFT_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; }; right_encoder: encoder_right { compatible = "alps,ec11"; label = "RIGHT_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; }; diff --git a/app/boards/shields/snap/snap.keymap b/app/boards/shields/snap/snap.keymap index 7c750f9f..febaff97 100644 --- a/app/boards/shields/snap/snap.keymap +++ b/app/boards/shields/snap/snap.keymap @@ -13,6 +13,7 @@ sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; keymap { diff --git a/app/boards/shields/sofle/sofle.dtsi b/app/boards/shields/sofle/sofle.dtsi index 71dc04d8..4917ca32 100644 --- a/app/boards/shields/sofle/sofle.dtsi +++ b/app/boards/shields/sofle/sofle.dtsi @@ -50,7 +50,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) label = "LEFT_ENCODER"; a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -59,13 +59,14 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi index a1b7b643..3eefdc6a 100644 --- a/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi +++ b/app/boards/shields/splitkb_aurora_corne/splitkb_aurora_corne.dtsi @@ -48,7 +48,7 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 left_encoder: left_encoder { compatible = "alps,ec11"; label = "L_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; a-gpios = <&pro_micro 4 GPIO_PULL_UP>; @@ -58,16 +58,17 @@ RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10 right_encoder: right_encoder { compatible = "alps,ec11"; label = "R_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; a-gpios = <&pro_micro 19 GPIO_PULL_UP>; b-gpios = <&pro_micro 18 GPIO_PULL_UP>; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi index 908356c7..06b3ef39 100644 --- a/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi +++ b/app/boards/shields/splitkb_aurora_lily58/splitkb_aurora_lily58.dtsi @@ -34,7 +34,7 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) left_encoder: left_encoder { compatible = "alps,ec11"; label = "L_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; a-gpios = <&pro_micro 5 GPIO_PULL_UP>; @@ -44,16 +44,17 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,1) RC(4,10) RC(3,6) RC(3,7) right_encoder: right_encoder { compatible = "alps,ec11"; label = "R_ENCODER"; - resolution = <4>; + steps = <80>; status = "disabled"; a-gpios = <&pro_micro 18 GPIO_PULL_UP>; b-gpios = <&pro_micro 19 GPIO_PULL_UP>; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi index ab568a09..c5483af5 100644 --- a/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi +++ b/app/boards/shields/splitkb_aurora_sweep/splitkb_aurora_sweep.dtsi @@ -28,34 +28,35 @@ left_encoder1: left_encoder1 { compatible = "alps,ec11"; label = "L_ENCODER1"; - resolution = <4>; + steps = <80>; status = "disabled"; }; left_encoder2: left_encoder2 { compatible = "alps,ec11"; label = "L_ENCODER2"; - resolution = <4>; + steps = <80>; status = "disabled"; }; right_encoder1: right_encoder1 { compatible = "alps,ec11"; label = "R_ENCODER1"; - resolution = <4>; + steps = <80>; status = "disabled"; }; right_encoder2: right_encoder2 { compatible = "alps,ec11"; label = "R_ENCODER2"; - resolution = <4>; + steps = <80>; status = "disabled"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder1 &right_encoder1>; + triggers-per-rotation = <20>; }; }; diff --git a/app/boards/shields/tidbit/tidbit.dtsi b/app/boards/shields/tidbit/tidbit.dtsi index fb84c89e..c7af2001 100644 --- a/app/boards/shields/tidbit/tidbit.dtsi +++ b/app/boards/shields/tidbit/tidbit.dtsi @@ -49,7 +49,7 @@ label = "Top Row Encoder"; a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -58,7 +58,7 @@ label = "Encoder 1"; a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -67,7 +67,7 @@ label = "Encoder 2"; a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -76,7 +76,7 @@ label = "Encoder 3"; a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -85,7 +85,7 @@ label = "Encoder 4"; a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; diff --git a/app/boards/shields/tidbit/tidbit.keymap b/app/boards/shields/tidbit/tidbit.keymap index 2e415bf8..a98a2eaa 100644 --- a/app/boards/shields/tidbit/tidbit.keymap +++ b/app/boards/shields/tidbit/tidbit.keymap @@ -17,6 +17,7 @@ sensors { compatible = "zmk,keymap-sensors"; sensors = <&encoder_1_top_row>; + triggers-per-rotation = <20>; }; keymap { diff --git a/app/boards/shields/zodiark/zodiark.dtsi b/app/boards/shields/zodiark/zodiark.dtsi index cda0b1a6..66ebb7b4 100644 --- a/app/boards/shields/zodiark/zodiark.dtsi +++ b/app/boards/shields/zodiark/zodiark.dtsi @@ -50,7 +50,7 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R label = "LEFT_ENCODER"; a-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; @@ -59,13 +59,14 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) R label = "RIGHT_ENCODER"; a-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; b-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; - resolution = <4>; + steps = <80>; status = "disabled"; }; - sensors { + sensors: sensors { compatible = "zmk,keymap-sensors"; sensors = <&left_encoder &right_encoder>; + triggers-per-rotation = <20>; }; }; From c2d220fbdf2c9ae6957d080a47545aa28e3ec275 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Wed, 8 Nov 2023 22:05:53 +0000 Subject: [PATCH 480/494] refactor(hid): Use proper defines for HID values. * Add report ID defines and use them consistently. * Add defines for main item value flags to avoid magic constants. --- app/include/zmk/hid.h | 51 ++++++++++++++++++++++++++++++++----------- app/src/hid.c | 5 +++-- app/src/hog.c | 4 ++-- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index ab42adaa..da6bfa65 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -15,13 +15,43 @@ #define ZMK_HID_KEYBOARD_NKRO_MAX_USAGE HID_USAGE_KEY_KEYPAD_EQUAL -#define COLLECTION_REPORT 0x03 +// See https://www.usb.org/sites/default/files/hid1_11.pdf section 6.2.2.4 Main Items + +#define ZMK_HID_MAIN_VAL_DATA (0x00 << 0) +#define ZMK_HID_MAIN_VAL_CONST (0x01 << 0) + +#define ZMK_HID_MAIN_VAL_ARRAY (0x00 << 1) +#define ZMK_HID_MAIN_VAL_VAR (0x01 << 1) + +#define ZMK_HID_MAIN_VAL_ABS (0x00 << 2) +#define ZMK_HID_MAIN_VAL_REL (0x01 << 2) + +#define ZMK_HID_MAIN_VAL_NO_WRAP (0x00 << 3) +#define ZMK_HID_MAIN_VAL_WRAP (0x01 << 3) + +#define ZMK_HID_MAIN_VAL_LIN (0x00 << 4) +#define ZMK_HID_MAIN_VAL_NON_LIN (0x01 << 4) + +#define ZMK_HID_MAIN_VAL_PREFERRED (0x00 << 5) +#define ZMK_HID_MAIN_VAL_NO_PREFERRED (0x01 << 5) + +#define ZMK_HID_MAIN_VAL_NO_NULL (0x00 << 6) +#define ZMK_HID_MAIN_VAL_NULL (0x01 << 6) + +#define ZMK_HID_MAIN_VAL_NON_VOL (0x00 << 7) +#define ZMK_HID_MAIN_VAL_VOL (0x01 << 7) + +#define ZMK_HID_MAIN_VAL_BIT_FIELD (0x00 << 8) +#define ZMK_HID_MAIN_VAL_BUFFERED_BYTES (0x01 << 8) + +#define ZMK_HID_REPORT_ID_KEYBOARD 0x01 +#define ZMK_HID_REPORT_ID_CONSUMER 0x02 static const uint8_t zmk_hid_report_desc[] = { HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP), HID_USAGE(HID_USAGE_GD_KEYBOARD), HID_COLLECTION(HID_COLLECTION_APPLICATION), - HID_REPORT_ID(0x01), + HID_REPORT_ID(ZMK_HID_REPORT_ID_KEYBOARD), HID_USAGE_PAGE(HID_USAGE_KEY), HID_USAGE_MIN8(HID_USAGE_KEY_KEYBOARD_LEFTCONTROL), HID_USAGE_MAX8(HID_USAGE_KEY_KEYBOARD_RIGHT_GUI), @@ -30,14 +60,12 @@ static const uint8_t zmk_hid_report_desc[] = { HID_REPORT_SIZE(0x01), HID_REPORT_COUNT(0x08), - /* INPUT (Data,Var,Abs) */ - HID_INPUT(0x02), + HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), HID_USAGE_PAGE(HID_USAGE_KEY), HID_REPORT_SIZE(0x08), HID_REPORT_COUNT(0x01), - /* INPUT (Cnst,Var,Abs) */ - HID_INPUT(0x03), + HID_INPUT(ZMK_HID_MAIN_VAL_CONST | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), HID_USAGE_PAGE(HID_USAGE_KEY), @@ -48,8 +76,7 @@ static const uint8_t zmk_hid_report_desc[] = { HID_USAGE_MAX8(ZMK_HID_KEYBOARD_NKRO_MAX_USAGE), HID_REPORT_SIZE(0x01), HID_REPORT_COUNT(ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1), - /* INPUT (Data,Ary,Abs) */ - HID_INPUT(0x02), + HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), #elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) HID_LOGICAL_MIN8(0x00), HID_LOGICAL_MAX16(0xFF, 0x00), @@ -57,8 +84,7 @@ static const uint8_t zmk_hid_report_desc[] = { HID_USAGE_MAX8(0xFF), HID_REPORT_SIZE(0x08), HID_REPORT_COUNT(CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE), - /* INPUT (Data,Ary,Abs) */ - HID_INPUT(0x00), + HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_ARRAY | ZMK_HID_MAIN_VAL_ABS), #else #error "A proper HID report type must be selected" #endif @@ -67,7 +93,7 @@ static const uint8_t zmk_hid_report_desc[] = { HID_USAGE_PAGE(HID_USAGE_CONSUMER), HID_USAGE(HID_USAGE_CONSUMER_CONSUMER_CONTROL), HID_COLLECTION(HID_COLLECTION_APPLICATION), - HID_REPORT_ID(0x02), + HID_REPORT_ID(ZMK_HID_REPORT_ID_CONSUMER), HID_USAGE_PAGE(HID_USAGE_CONSUMER), #if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC) @@ -86,8 +112,7 @@ static const uint8_t zmk_hid_report_desc[] = { #error "A proper consumer HID report usage range must be selected" #endif HID_REPORT_COUNT(CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE), - /* INPUT (Data,Ary,Abs) */ - HID_INPUT(0x00), + HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_ARRAY | ZMK_HID_MAIN_VAL_ABS), HID_END_COLLECTION, }; diff --git a/app/src/hid.c b/app/src/hid.c index 2a6b5d39..58e5824d 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -12,9 +12,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include static struct zmk_hid_keyboard_report keyboard_report = { - .report_id = 1, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}}; + .report_id = ZMK_HID_REPORT_ID_KEYBOARD, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}}; -static struct zmk_hid_consumer_report consumer_report = {.report_id = 2, .body = {.keys = {0}}}; +static struct zmk_hid_consumer_report consumer_report = {.report_id = ZMK_HID_REPORT_ID_CONSUMER, + .body = {.keys = {0}}}; // Keep track of how often a modifier was pressed. // Only release the modifier if the count is 0. diff --git a/app/src/hog.c b/app/src/hog.c index 930714b0..9ccfd9d2 100644 --- a/app/src/hog.c +++ b/app/src/hog.c @@ -47,12 +47,12 @@ enum { }; static struct hids_report input = { - .id = 0x01, + .id = ZMK_HID_REPORT_ID_KEYBOARD, .type = HIDS_INPUT, }; static struct hids_report consumer_input = { - .id = 0x02, + .id = ZMK_HID_REPORT_ID_CONSUMER, .type = HIDS_INPUT, }; From 5b49bc10cd7251bb9a90c018410abfc557fa0e9c Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 3 Nov 2023 23:20:42 -0700 Subject: [PATCH 481/494] feat(blog): Show all posts on sidebar --- docs/docusaurus.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 701b5b99..20e6a75c 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -146,6 +146,7 @@ module.exports = { showReadingTime: true, // Please change this to your repo. editUrl: "https://github.com/zmkfirmware/zmk/edit/main/docs/", + blogSidebarCount: "ALL", }, theme: { customCss: [ From b80c0be0cedf42b58be2fc431b2a673ab9760c64 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 3 Nov 2023 23:20:23 -0700 Subject: [PATCH 482/494] feat(blog): Add keymap editor post for spotlight series Co-authored-by: Nick Coutsos --- docs/blog/2023-11-09-keymap-editor.md | 109 ++++++++++++++++++ .../editor-screenshot-dark.png | Bin 0 -> 74997 bytes .../editor-screenshot-light.png | Bin 0 -> 75097 bytes 3 files changed, 109 insertions(+) create mode 100644 docs/blog/2023-11-09-keymap-editor.md create mode 100644 docs/blog/assets/2023-11-09-keymap-editor/editor-screenshot-dark.png create mode 100644 docs/blog/assets/2023-11-09-keymap-editor/editor-screenshot-light.png diff --git a/docs/blog/2023-11-09-keymap-editor.md b/docs/blog/2023-11-09-keymap-editor.md new file mode 100644 index 00000000..1fe3b867 --- /dev/null +++ b/docs/blog/2023-11-09-keymap-editor.md @@ -0,0 +1,109 @@ +--- +title: "Community Spotlight Series #1: Keymap Editor" +author: Cem Aksoylar +author_title: Documentation maintainer +author_url: https://github.com/caksoylar +author_image_url: https://avatars.githubusercontent.com/u/7876996 +tags: [keyboards, firmware, community] +--- + +import ThemedImage from '@theme/ThemedImage'; + + + +This blog post is the first in a series of posts where we highlight projects within the ZMK ecosystem that we think are cool and that the users might benefit from knowing about them. We are starting the series with a big one, [Keymap Editor] by [Nick Coutsos](https://github.com/nickcoutsos)! + +In the rest of the post we leave it to Nick himself to introduce the project, detail his goals and motivation in developing such a tool, and talk about the future of the project. Stay tuned for future installments in the series! + +## What is Keymap Editor? + +_[Keymap Editor]_ is a web based graphical editor for ZMK keymaps. It provides a visual way to manage the contents of your keymap and if nothing else offers two critical features: + +1. Automatic formatting of the keymap file, so that bindings arrays remain readable +2. Searchable behaviors, keycodes, commands, etc, so you won't have to remember if it's `LCTL` or `LCTRL` (I just had to double check myself and I guessed wrong, apparently) + +## What can Keymap Editor do? + +- Render [devicetree keymaps](/docs/features/keymaps) using pre-defined, auto-generated, or side-loadable keyboard layouts +- Integrate with a GitHub repo to streamline firmware builds, or FileSystem/Clipboard if you'd still rather build locally +- Edit [combos](/docs/features/combos), [behaviors](/docs/behaviors/key-press), [macros](/docs/behaviors/macros), [conditional layers](/docs/features/conditional-layers) and [rotary encoder bindings](/docs/behaviors/sensor-rotate) +- Manage references: moving a layer or renaming a behavior will look for references throughout your keymap and update them. + +But check back regularly, because I update pretty often. A recent significant achievement was enabling [parameterized macros](/docs/behaviors/macros#parameterized-macros) and tying it in with my existing parameter type resolution so, yeah, you can finally create that reusable macro combining bluetooth profile selection with RGB backlight colour. Or use it for an actual useful thing, even. _(See also: [Using Parameterized Macros in Keymap Editor](https://github.com/nickcoutsos/keymap-editor/wiki/Using-Parameterized-Macros-in-Keymap-Editor))_ + +My goals are, broadly: + +- **Treat code as a first-class entity:** as long as ZMK keymaps are described in devicetree code then an editor needs to produce readable devicetree code. +- **Flexibly support ZMK features:** use of any ZMK keymap feature should theoretically be achievable within the app. In some cases this can mean more initial setup _(See also: [my thoughts on implementing "autoshift"](https://github.com/nickcoutsos/keymap-editor/wiki/Autoshift-using-ZMK-behaviors))_ but having that foundation makes its easier to add shortcuts and niceties — something I do quite often now. +- **Don't get in the way of not-yet-supported features:** If a new ZMK feature is released and the app isn't able to add it natively, you can always edit your keymap file directly. While the app may not _recognize_ the new features, further changes through the app should not break your keymap. + +## History of Keymap Editor + +When I started writing Keymap Editor I had a handwired Dactyl variant running QMK. Manually editing keymap code was fine, but keeping things readable was important to me, and automating that was the best way to ensure consistency. Programmatically modifying source code was beyond me at the time so the first version persisted keymap data in JSON and spat out formatted versions of both the JSON and C keymaps. + +After switching to ZMK I added a few more features, I guess as a pandemic project, and then gradually migrated from generating a templated keymap file to manipulating devicetree syntax directly, and that has made a big difference in adding new ZMK features. + +## Why am I doing this? + +It started out as a useful tool for me. I shared it with the ZMK community and gained a little traction, and then apparently quite a bit of traction — turns out it's useful for a lot of people. + +I'm a software developer because I enjoy building things. Much of my day-to-day work isn't user facing, so seeing how helpful the keymap editor has been for people in the ZMK community is a big motivator to keep improving it. + +## Future plans + +### Runtime updates + +Streamlining the keymap update process is probably top of mind for most users, but that involves a really big _firmware_ feature, and I'm the wrong person to tackle it. + +That said, once there's a protocol I would _absolutely_ be down to integrate it as an additional keymap source. Being able to pull data directly from the keyboard should unlock a lot of possibilities and ease some of the constraints imposed by using devicetree code as a medium. + +### Simplifying behavior use + +I think a lot of people would like to see the concept of behaviors abstracted away for new users and to prompt them with + +- _"When the key is tapped..."_, +- _"When the key is held..."_, +- _"When the key is double-tapped..."_ and so on. + +Users who are less familiar with ZMK's behaviors and how they are composed may find these prompts to be more intuitive, and their answers could be mapped to an appropriate combination of behaviors managed internally by an editor. + +### Uh, what else? + +This has been long enough already, if you're looking for a feature I haven't mentioned don't assume I won't add it. Feel free to make feature requests on the GitHub repo, and I'd be happy to discuss it! + +## About Me And My Keebs + +I like computers and write software. Many in this field enjoy using mechanical +keyboards for their feel or aesthetics, but what piqued my interest was the +Dactyl keyboard. I think, ergonomics aside, I'm more interested in the DIY/maker +aspect than the collecting of keyboards and switches. + +So [I made a Dactyl](https://github.com/nickcoutsos/dactyl-flatpacked/), and +then [I made another Dactyl](https://github.com/nickcoutsos/dactyl-deskmount/) +and I made a third Dactyl that isn't interesting enough to photograph, but now +I'm using ZMK so I left room for 18650 cells. + +That last Dactyl (with MX browns and a cheap blank XDA keycap set) serves me +well the eight or so hours a day I'll spend at my desk, but I also spend a good +deal of time computing on my couch where I'll use... my Macbook's built-in +keyboard. + +In case that's not surprising enough I'll leave you with this: despite all of +the work and testing I've put into the keymap editor project, I've only updated +an actual keymap once in the last year. + +Thank you and good night. + +## More information + +- [Keymap Editor Wiki](https://github.com/nickcoutsos/keymap-editor/wiki) +- [Keymap Editor Discussions](https://github.com/nickcoutsos/keymap-editor/discussions) +- (YouTube video) [Ben Frain's overview of the Keymap Editor](https://www.youtube.com/watch?v=Vy7IoQAe3oU) + +[Keymap Editor]: http://nickcoutsos.github.io/keymap-editor diff --git a/docs/blog/assets/2023-11-09-keymap-editor/editor-screenshot-dark.png b/docs/blog/assets/2023-11-09-keymap-editor/editor-screenshot-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..166edf8ae806520abd95ab0eb7889e3b64fcc1c1 GIT binary patch literal 74997 zcmbTd1yEaE_b(iv6t_Z)yB2pRI23pH;!-G0@nFSDad(0hXz^mjp|}QjD+PjEus}<1 zc%Jv2|9s!fow@g(nM`ul-e>QnzqPaWKGE8m%6Qlm*Z=?kPvw<@E&zZ71OU*#Vxl1_ z_2(ts008QZwz|F|DLp5jtR@K+GrO3gtn<&mfB)|8?keaTNY;Du$6Il*3-t64^2=-A z-#>_$bn{577nD{ADr!b2XLk1ua7n7rycGIUT`#3>T=KP=l%A{eNB{TsE+GXST27Ie z#B>T~-fs=fntsSonZKzrKx3_l~dBijGOGK3Q5)$%q3QPGEbzi^n`ThI1kfQG7 z^xWt;bZBH;)!3FrKt{vV-U$Q_ii&sf^o5js@e7Ob@cYo--Rl$b@jW)ZJB+?lxr z9ZP2=18Wbj07fq1(2t3E#pQWREc!OCR`zd_GV=NdM=md~5>m54ejyr$7Q(MISeBNO zvmk~R_5u=$oD#}>8YY}VKr2@-2~9Oo8I_m(5^L)lGFoPQs)j{nmE)7sm357!6}2il zX62Q2W{#dRD!QVo>MN^j^NUM5rZz^l?yt0rz>#rjIR$J&at>}FK3$8N`sR(FzhY9d zO>La{l=Ur~K@~L()!&+0JA0&bRe=f`{=pHw1H*FK=AJ%5M<=HT2S+CM9$_Ejc|>LT zGz*!<-=4!SPR}mDA3nnN4uy@HzxBc?Un(yyuaPnc(efGr?U!DP$dfZmNm}&>N5m+o z8wluDa;s+Ay1bRJ8k2Td<5Y@w^zb^p_!E|QM9rm5FJSEu36pv~6A&KDDB{E_<;!dM zTE=OUT|Pp^W9!%cy^i-bbxFy)#Ql!ZOGy3M@)m+kCRoPsRbttRcQG}GxYFSCC1@yX zcJ0=#H{LvG=fgxv^Y&=TYDdy+&6~(6y|=>(O+Mz%t`mzlnyo<**-OylRkkVTDfOo;NO{9|a79`;ZscbG z3Vn-;f~>yp@=;GHGAsZg1%JMfenEZw`TurVU!SZuMvKP(x^)~{2*c%OXoyk78u7q9 z(9h8BlYL1wO&_CW_liysR#4Kw{A!=}tvs8?es2NE!Q=<|C^?J!sHM@~IVNSuUg-6D z&3@3|o*bTyjnn@hFK4uwm5pEHURo$kf)}vSk*#+6ErKGhWuG8_TDf(X8uYZDJQ8(m z>}Our7vO&BNb)vcWT86ur@E|G7m@M1VCnf zw#khykt8Vkg#f#%uK#tB|6iE$VSt`%r8LBsla4FTFkryKsdVjtO;+3N!hJ-SOZ!7{ zTw7anZn;Im_#SN#p33Y)|(ZNh4Ckt!SN)7?3t?Hf;Sf%r$! z7$O?a!TDf!!%AoU;p9M~#K=$Z-rvj-ofRcU(7O1Ccgdq9cjSPOYG+EQqtJSG$3l6) z3l46N<*fLSoP~3X%&vw>1a;oafPFR&@65s_(01k@Jmj#n$rmQX4z3i9G=uQ4d)=$K z&07l@Y*TlkVDyUW&x_kd8S#pEzlX-w;oUu{NOjIXgSX5|#opOTF)JRJb=HDUnEA7lWy10y%qQ*)ZQRC z+nh9-i-!UT>E8x(lZ*#BtIshIAAB+1t_aZ=&FFdtBgwg$=CA4OFyB4G0szceA*8c2 z3=qDfjbTR~se`twU^Vh)4glb7-cB4e<-mXV;%THE2LwdUgrrqfgsps<1-|nl>>Yxc zX#xP7{saqEPqLS-e*F}WrGt2g{Uiv0-AoTX??1m!Y~$JCh_F}lqVHjTBg=N6_ay0C zs&1Ar^^=(oRXR?nD2$a=3{^u6&kJAp=$Q17F==`Bd?1pe{X|48o4Bb~vXw&6FI@sU z9b2_aHq)qRYdl8O9Z!s&fthh@HEZ)Li*U~BI~uCXA6qfgXd2=MP6XcX@jVbC=YahXMj`GM{Mk>O2% z!gy58j|O&sQ;HH>w*uI+ugTCXG2uEzHCj7BkY(B-AI$^)&3@BDv}AMyErC8xPk%0Q z0FM+pTFCUyc3pb#ID}VLK!-DUQc9o;GIwCKAomvf;C-o&0e(EJ3lnsKEXc_)Rch-s zAuCp7xn;zaNttfoU168sAOAF8Wks+GXIl5Ere7i`9un@_n@`)&uf1=~+{e~WEK`1J zjoTrLMTP@OA!hsA8Zk|Jf;^Uxr&f1sgZdlTHB=BgYC)&+O|G*bGl?2rEfe(&Xh{eU3efU12AMvFvrE0Nv<`a`EEivi$ zTX00LX`uISF%N8s>!%Bc^*jHu#nh9YvO{wlb>^ixa4-5PhKC+RnLn!;b$TaYIz)_* z%}1C&3w@Vx#BP@?XTt7o@y8asp?!8C3Nh^ip)EcrVIcH8!F-f@NWHF`ha9ctH@8zQS+W9MTK9sGPqwAWZj!|wWIDJOc>5*qT86)%{Ft-SGX(%F7X<*@$UkOfLd67z9_SwCGX{p|pEXt_-2Q z9mK1Yrn2W&(=!Yqka$)C{hJGfMRYU?z8yyIuT0&=NueDrhMDUUVGxLkO4l5~bu`8- z_>92cnMb46OPwBA?>K*F{p-rv^wT2NuUKgaSQouw@j)^8-Z6LWxbM}Zs03|h@)~F< znun-PdK>UHP!nvQKH2vzAbln<@MKs~w4K@-l^Dv1R_m9r@AMZHpZZvxKQFS+clQ89 zktZi<@$853Mr7}AL1Hle*!%7xS;)q5jlOKW9ATKj>o5HxFla9UR)x|b4Q;iXmUDBO`P}Ix^7Cay}(wy&+gDg zY59ew_9meR8tvR89c|Xj8{;NqO4`IPXH$m7OHqH1gjyG#s*y1@plm0782TP7#f(gv+Zk z^DfOw07pz1<(txTuPPvhlF~ZrIt4j7k>X84rQk}F_j(h<=K(55iw4z!hr#-*4VUKc z?`_|DqU#hwvlTx{Vzf?6fy}H>_K8X)cJob8c>6M0^rZ;+=c5yz!hTnD%X_e^LQ?X0 zoAY+#)-~;bIrsj6?x)0@fGvqn-dpP=`|!A{mZ9-_e&3V6Z-%an<_&#*h24HCi=a?g zJb{?>1@#W64p+JJ(+&6@=vt6N*n24p7A|0w?~n$>v1rmt+u2Zav~s9Fy@J`=LpAp6 z&m5;6k&*l1d%ftLBxZxu+wHl;dA3gjJe9{h-NGrci^VEB^?1wZ2CnI3=%*`X=^>|# z?=F0deHuu7i(?@B#SJc;ZOnTh2@Ea@Tdy&8=54YM<#EL=I1A zeyj^0fFi6uYD|(-_-G%G1l^( zWbXTWsj-h7JyzK0G*qzyDv;t(7G5H|Wc-3Cp-FU*Zgj)h+ zQ>`fPTQ`UvP3hPCmPw?&{IaDR-b7FPiIJI)`}s}Bo%xodDkOr2Hs5H1Kx<7^aOCRF zT(Yx$$ndJAyIvKN&@O_N9*&O_;BEBC;4-JjUX*MN`3w-@q5;S@JCe|C(;BGmJBUCj_LNpc z{Xvere)0$2$qK6ytQo$=28zH0uRu1QQK3-B$QSzT27&SK>4iqV-boI)&C@M3Vvh0V zbf0x;LgeLr)FE%KV^krEQp?BC#b&z~$^miB_z$fw^A_fI%w@gYF}eLdYeGDIhx~pv zEVuV)r2$W|iH){F)3G`8j{n7RPZ6TKc3bPO7UUMBAm68w^?9Bvo(n3!MtEi!N9(gP(c1mQi|DB5FfUZ@DH>+;G^gBS6oAI6qJbt=3~8)y1wrX?CN+OI6=xO#ho7i^$y$z zvd6f8NhL6979<4R!5 zUEqld%htT3)O+3-nx&2;LBdW$NCy8~?Yq?h^WWWa9jifD1fU{v3f1SVkK&B;X5i`? z?bX9{i950tEeoN`+LnPYu&lm7KO|8E=D+5a>Q=j!d7tq;yzx#lLHK%k>JY9+Y>>|s z4wQCQg#_c=Q{O3B6#`?q9x$7GV^@yA&7yuH-y#i0*zj(E65yU*#o^PE1sS+{~J82as9F7<=zv(R4k3 zN&7DMOGPD1+4Cx0(v7dtj*3pio>bnKNdEEoqvpNF7DOvpKC}wbPtS5*UWa(+b6MsshL9L{{)1?* z9}u;L1CTqMu11vppJnDpiD5!sD8okE&0(CZ-X7Ip(d07hNIdW)f=_?r-t7s}(G&Z{ z(<#T^el7JB{kq_|GenWTP9~&_s&Xc#Tp8ZFFHD^p=dkB251-He;;Ri;M%sa8RuP;Dfzko{Gmt!h>^OHVv7h}Z%7 zf8p{@5`#|a@TA|6-boeG{QF@;^4H3|Bcr3<1vOl5zuYO+PqsnIOya(i_-yNBiVu2> z6DOpK(UwE_%hs~mFgz|7*5l=vHZzjNJYgT?M?dtbn3S~rt*1`ir}5A5knDzWVod4`cR_QW5s$qGiA;chhfyzF4yZx13{Se2c z3F(O1k8YP-mGt?k(m6*yxW;FwR_3^4w_bpObR+*T&fcY1SdFpmqJMEblPRT@Euz2y z75>Z^=eI#14ZzT`qOBgTaR|2!{@(OV%2*0y!Fajnq<43udvOdgq11B{ti14uhqpH- zk&@U~wLIbDrot>n7Xfn*7LlxNy>r*twpWAn8`7yxqI0(p>b}ttZT8^YUj44WHr4d; z@IS8l7d0MOPmsHU;fRO3f|`-3d|+Y3M7k1wZ&?MElafvqFqM`!fSjWckC83E2*yho}1l%T1A)1H1GYxB+vCH?$Um5sQMJkcr?IZEcs`O>V&H zaGb-gOC$Hn&6V|yvPZUph%d6tFE*D6o1pE3X)Lzc_~QO zQ*XJp^Jp`twLnWMymhmfd!QN`&QZeyz4gvdU&$Lzr!{6vJhZSo@Via?7n<8}rVvWv zUzUuMQK9!}zuGox(0VMq4S@kxs5f1z6Nh2OiL~(93`q`%R>z#Pz)JT-3Su!u$2#6? z!cmx3xNF_Q+E*AHz>x2MM&|o9sC~=v5*eOt@<1N6y6b$J$eltHcz#Z8W#8N>8%8hd zZW#it6l1KR4Q~dc4K@TL?Jg?*{05Et1W1`hCFN!1C)ZrkS7^0xtc;z~dP2PN(LMS* z6c!^f76T44%J$CXv7mzp#Qovl5ugtzoW{`yCL9A=U)7;3=JSp&zBrQ&z5(YWh)QA6 zhUuDJq5EF6ht^7s*1owa!(5p(%v1=@KvWym_M@kq`%HS{%Tt$}>eBv|VE4bt78fml zs>Dt5B6il*%fRWn-PfgKFxa`EIt~pBx-~Wn8uf)A;3sf*vKg&}Rw4aLL!F2JF3S|+H1whw9y)7&IJe-f|2=wm7AdQRDxA!wPLXhiXcs;w1l$Zvn#oUk$FVfyD)n+$NFzdSi+ z8{RHNQT`VgVz%2wgQ@k82HK5$enmTTcpKdHXG!El4@0#koPL^Us9)Cy3pbLi*=gFg zO}(7Yas*Xged}w;X!$7wl!5UqMXWR*Kw<}^#-uzX#g`tQ!qsdmi^(^2Ry>XSzLB5> zB}d0o>HWpAS$F%o$)ty9-)l6Z@fpvE%j{x=iq|ePL)t(Bry$M}N>ta*%n_J_fXm6w zn0WjU3XOvZtPkKMMW`1h#x@M_xsNAr5?Bj(QeJPkrK|!^#V)CjrY-n z<`tb*ynPdDI|6>JzhsidN~nrmp8Zl0Ga7ES&AsFhfJB*aK)PJknl1UGy2qMJQ}HdF zfgD&}?%0T;gOabm>~$8e_u^7%K8_6HEttxe$s6TBM<87tGaWE#A+&$uMDD$H!UZB* zQsHf^n50CDdW_a(o&9q%VK^d*5fV6-Dx~(C`9t6s2?ovgQP@PWP-(FR+(c#jH@$^u z%YpUu!EU9HKV!-Lc-~Thlzk**hhu7Kwm;?hN+%r%^ar0h&U($ zO(bo`zMk)wJ&m{@2d|?(<%;R9tpK0=uG~DJY=4&lWiMRNmyRi(U0#Vxbl-vJS1XTa zyJsu=&%Zum;Yo+4DXHB193(<7_vny8ez8ILgtvK^4N@~`Oh}M5L%3<9nV>+s;+=Ss z4z+ABd7lM!t=&IZ#pK=Qhoo&s3MDBqRB-S^icwlLvKWQH{yDo#2=j6W7rf&Jw9cA8 z5?@r^Nk-TqJHNdIJ*gj2E)FMMFheT_`d!u-fP3Ntg__rDRt zy-n>X83jM!q|+l+fi2^c163U}muDuQylPJBFc)ZXBk;FODHf6Q?`tKMnsSTIPlKk} za#LMe17pY!*`vIH3$YrZ7g?s0C4o@1eRwiA%@s}WsG9m;qSLyI-=W+>!Yx5V}Iqdpu4b* zGB8Uxa_E-tHnHD?gJc}j>&O|ad_n`_oy9v(vZ2kPw~BD`pC7-%6akdgG}N)-a&_}M zuXaH)H)ewY?5Su2nyS!cxZJ(PE*zMF^C#`1eF}sa!`Uj(e~xgQ56=4!<3H|xkXgSe z{opGwTr$Tcw(x`V2VDIE7p;yPu_|mZXaVsU4g_|!VD%b#l0$1~&~AUM^?8ZG`o>i( zpd;d%Cam-Nz_QpWO8R?i`RZ(j{_OGkiGhIMJxOqBo;Qs4a*0mekefE-ASK_IvYk<1DtTF3 zZGdYGl$trs%^+_NbKtB&p;hPmiDBK)U`VbrYcZyxU^#@I2HR*sv^5S0E;hW&5Q$LuXlLoa~%^4r%ZAv z%EI0Y6(BvHIE!tR(x=BIGguYfW`I=i2XM&N1#`NZxVv1uC$b-(Z`FRNH=L%hpNQEa zh>t6B-|mm$!8%=pl4~N=k8B&_xrg^w%!&)`*RwxO|x~-HoU3MfCAOH+ARaaZ-p`VF9bnTZN`j6+aj^bU z{oNg6#kE94?n}}gF`_Q?AiH@l6^TuQr7?`>8t*L2A0mr}VA$GqPfc7iB76>Dxc_>$ zKQ!=nZK~3UX$m(CqjWKAKsP7W9M6LcQmf~1`3CT_MO#|H?{^G;esHEk^+nck5DS_= zFYIBehj~-2MSy(D1Gqv40d5qn=>*GU2+x8kh>~UtSEJ&=ntN|XL9lQ9`HWNbG}NhU zxz767%I#h^EpAeZY)?ImDc(86>n0ir!UsTU#fH$L^xbME_JDb#Z zV!baRSoGnEG=ed#IUbw!=^^=0dePpAl3yr{MvU0E#u$H6roKmsX>c)@c8qm&&MB-O zI_%;xi`Tsr{xk|UEE->3w-lK7W+(r1<~C)_xg5CF`Z|m9!XRk%(@e7MZk%qRz)}>#NJ8^4H{pUgQfH7}?qe zh0ESQ3&}U}CSnc;;7=yIJ(z$UV#o}s^ zjmE@-xi|^JoIU5J@$f=7;t>{yHjdW1T#0SSy3ZYb6GAS&V{Q@D(iwK6h{+D@r$R3HkXSi*r{yfcL+QiQ{0#&2y*HY z4?5ibf@SgSa%^>~*m-|~Znxf~(WUxkhP^toNqO}7P1)UP;;5o)hp9#Vd{uU{Sa-Wg zPqmQc`RWJZ;Q3D8+bFq0WAi3eSsl_CJfFK+(AG6Tv%tyUl@1PjDad1wb zlI2fNsdKUI!Xpsleu2X+tD55?(Vp>aI^V%;iOf0=4&EGz!b!7et zNU>@YXQnpLre({6iF57)<5_!=L9?N-lz=7>4M0e)@+K=QjSfQ~36mA4&L%Ul5`O0{1-5yQ)dwgCpsc3=r^!3WrZgKLIb zb@OX~r?rD_q2nP(06>m&2nJ^*j_zA4livbeB99}?MCtkjD1lR!>M{rfHz?K#H|*{2 zt=}I(z$bEVU%Yp8|4c&C(CBveqtV-lGp8#F3IK#BL!c(ku)UaTFbz>snTLUw`N{<% z?v^_VO7yG;%$+m6{^2_XZdj_TVgIGF{f+-R-}&(4?9Pqr9OosK2bjblEWMRg5L@Gyr*UK@L_BpRccRoDa?F zk5=}n=@e53DpMe+#Q$ka+udp5_F5Ddl_(o{n|$YvLoZve>@h-ZFlrt zP-F1U-jw3SShoow@*qLD;rayip4`NQnjXtM54rQL!_x_oe;ycLf@8GudO%f1-72L^ z?M5eA1+3QzkUQG|xzXsA7I#bFAhoj?@nJ%VU?3mbZVa-4u20vSp&90{x%ko<)_2#F zB-}M7gJ4FsVAk8(Hc3H7srJ}Xa+;6%mfZR01LED_hi&9!8^M^5gK|G_zG2HxmS!${ z-652gDh(#jM8LGv-H~laXcOkZ&M5B*sMxnK^*hf>BbqXSZ($xdQ4GPsBW?0Hxh+VR zgX%Fb{y7&S^H394@b&-sVn14x#RJgcKH<%mAi{YVFGL|#qpOPjXJ{ld|2G%-iY(IiawLN8QwFN{PELZ-xDh~fHGVF+4 zjU#`aXk3^e350SV|FSObY;9@PLR+M~y*;M{mhqc-%m-wBHY@K19W$yl4=;{rFIs#r z*=aURR+$Fh`Z)^meG76S5He_dm5yhCN2FsSlvY9iEz3i-LW&_(Z;qo8n{GNbVg<-+1#P72@4^mW{%Uk!q~WE}Rx z&Dy(z6VnS>v=(~f<6M0=_?-stCM12=R=dU;?RFeesS5uL7k11=@9eTI6@dig&%>_R z5#5eZzlV48F5NG*xprQMXTr|w2o7m+>TA-Ax7AGTmm=Y3ZTcVC4o{wrlsiKwoZd_S z^)y&3mA$VlH~l7dQT^pnB{by)huF8&M>8m5| zC^$Z~yCKcyb(xnjix@;zW(;WjG`8oowz4XSuGBhjkJZ0~4ec%V4uN&F2_zHs#Snj( zs0lmZ>&YR5-{%n8*)jl_sn=$qCpW$W^Yav!Rs+G{a>Mhue$hqU$lt>Rp>rA0iuumg zDz1B2fSYzK89x5!!uD>t#-7;eNWH$tbt{ntmILyW-XybbR?mfS0iu%23H@kkN2Q-i z1Zf0;KU7WFONMe|G5CjzF13W0^t|=Ik9NVNqNw6U$`Glck3y* z8ueB78xnRIC{X~eeGVHQ6$aHW2O#TKq!eDc{n!CEofxP*auCp=8svr%GM8pmqb5W* zCUu8C8L6twp_S6D-Zud=Ix)`!(`4u6Q7=!2kV@_Z;@w`}ZVygy6E5z;IYceR#QpUE z>5+eS>do>C#Y5DgrfZ$(A;zoPlPEih?tb7)bTSE@t_~}-AjBwa@hDCXuUllok$IEs zVz=JMaZDbxD;?fwL(u^JA+y?mZvExwf0U(wRMs=0%@1A5hLhMA9Gm=3^Y0|~Hbdcb zZQ7GRC+Gj3)d{@^@4y9X-LKd71UNJ_LziDFAD|G%m?A1k?l1g4Z0KPDqTGS?Xp*cB zj^lgJc++7_)hHlu;9%rET&%_hhi?P%`zZu4@ww>3;6y*`@EGi=*NTrWzwSJ*qR4u2 zr);Dfp4zs&Wt8QvNu12E>Bc3C?{bb>w`Ldg4bw4r0?s+#bJ$WSkEJ|xrV%>7 zz5IJ5<~^$V?TDj>{8Y;?ro?@dij`(S?W;=ikmS~#b1wNWiy~QLh!L0y$1f|H(JaL8 zX!CXO^+~K?!E!OS_tVpQUXs^eo)>KYj~+}0PhHK;UcOoI#JHO)0Pl)$82$Eh1Q-D? z#PD(xcc_zl6$-ibDD6yss&oDH14L*C1M63xxqOj;o1j}Jf7a>soE?LG|DYQTgce$& zTnFyLov5QcE5&CfGQ$EeOWdK3O%tKMv0|*;Nk#WLfb71=X5Ke~wI6&_jo)XVZem4t z+Cmn&U#x;1)K-r?LIq9OyEBQ(WYUaL^g1v6-pu(oPDE5*(&w@U8Ldb{oO5b4x6oc~w*V3TQa4(vn*2BcYfR)L!y2F7~&myC4 zjBi4r=mHQ(=b+g=>TvM`I4G7>>CD+Y!mY0zp+|R+YZ-HUckM@RrpcEP8tYTlZdM=y z(d*vgO5o{%=Gb~q1p`3?UvGvTPbV_Ng*8j*pU9zIn^*xe3L@HF*&i_;!^s-hJc-?u zHzfc!knj^gvTT)!QA1+>FcWNUw9{GZ<{nS1!AQtFNLA~xE5IcK^}EPoPW;XRxd|0} zr+{j_1J>-<#=P1F5jjnB?CBs^DG5X)FTMNi$L~k>jSD2;EpEbY`trkBmP`sa-kAEs zFV73jXs3h9veg;wkK*W1>95_mWYBR|sF$X1oYK_VH! zOaa)PW8gHuX3En=d}%lMWDNEqc#pyLg#V8c>VDPZpG_srnXCW0U+6m6^65ph zWT)4rE3+#8UqpLdjPm=M$LQi3Tkcvb$6t2rKv1pqKM{MhQSee*SGw>w-uPe8aURS7 zJwj%~p#lZ8A3eUG=`24ErIUzYMn*WjwkF18`r%#??oOD*9op#h>Vw=f9)F{rm`;Ku zr9$l|_m;u}tOAY>til5J8RI|Tq4UyHg86>jo%xz9v2`}rRp3tLgZj=SH^cJ`2a(9* zoT)sCnPTLA2KYb*JiQU1j^gBf;(-iGu|%JU{U&(tdmeMckWUp-wn0EFu{K2CFc}z6b~N(-9xX7@J|Vd74Xo%j`ggX4c^lDCJB-I zDf_^8!-HR#P@vO?BnNF*eFs!%s93BJFJvFfH?UZHX9x^dR6dd2_@c*u;H#Z8J`(p^ zVGKa$E%4g+2y<_X+G-*2ft>GME2{T!X@oToYJ zR@-Haa@s4l#KfvZ;bJ(c_CPHmZN3A(FBgbj)rA3wM+hB}5U-}N4re005v54BK>mP%CP$f1YvGbL=m9e$BuDK9vhd7Ns?mNb zLf&A_`I}oIXfijVK#*Ob`d@qU-YEe$WLNiTX0HTjc9@y}h^pgh&R_>k}C z`Ora`e5xP*PdL!6)pqM+lXSbl4}e&_A()^-CX-j&nB#KKa%L8^pX{r%1#TB&2*%jg zG-F{Z;xLWZ3%Qt#GVlz7*2zh2oW)f z%Y>ye)XI9l*(`>F@ylwpo{uGtIWCx9QKFy<>$ktYj_xfZ3GT~>f(^U;EPRI@Z|o-B zsM_>NL?6Y#TqX6W%#e`=j? zJUk0}@y+@K+)0>8nF_tWYkTh2H-u0Zfd&VzBG1|WmP3-hL@+`S z>NSLgXjH>s@0zrLC%K4r%+x#D&b7Pc)GArxjWnozfuty8Ev3+Gkf0&P!FMxv7@R)O zt8wzL%MreV)wlV0glYld2>c(n64xecYhgFw(yv_UgY>PZj>jmvsB%p3CH3*95l6Ef zyb;GwMPh2DUJVX!5S1Ou`nw>kSElHVyJ8T7Q-=^P2%_D^jkb)4Ko82HKU}}m+G;w` zhZ`hvf@9C0hhonG3I4Gn-_QU=P-*_;(wVYcUuO1>tu{FUzpoVfe3Rn!`SrZ*W8kLcH6_WV#)ZSl^bAu5zla;WW^X0x@qqn?sN1Yp$o+K*%Y5` zIM3&N)JFQs6$ZkVAVe;g$+HP?HHu$RG&<%|TA9vATm&yx?%v;BMM7f{sQoLhi34c` zu1E)!9f2xYI#(!6x4I%R7wuZ`4@M3O3l6b@-e>l=G8PDN3VVd@lgU@NVHj((|wN2dw8)?aq?b(-1`w&Sgw25bupr7Ei`#+0v41)&qyYK1{=$Q)|{38*T!NO zCVpgyrHw?conq8Gr#|yW7Plyzt)aAo)l)L_6NBkQtDp*l#KF zH1<~=A;w#NX4(z_Dm0iH4{-GiF#*F4LGH*}xbD!PI08vSt@1^|rX(Ld;vsGWp`TCN zPe3j@-tB9t637spS`k(9-^>+*`{AD#x&G@1vH2q~Gv(9y^EspkpnCnHJb8jkAj0S^ zXskG|&R(JeHRi?7D^K4$MdYd>6*Q*rYD19;jXa{kjl+x62dXV70kv!sIL*2n%fQ?y zP3w6*YQYFFdP{^DWwb0S%jkB(yt^FfcNRSxWf{`oJk|i96-rk!2gEk#R~zx{Om*+s zKx^|42{K(Z^a}{olv+CZ(TE2UsMn3|42Ey1fhrOey}VXAxB1{saL{|z^@}Ab@>Y@V z{cbVPE{Ia}ZS~8pGrC8QE>U`TW91H9TiXDWdou96OY@#4CnApcH5rxQcNaD8uw1w{ zMuPX{b;}F!3iHI^<^6M$`4;n^6(@PjgL@L@`V%5en!}~qVmNc(uL^ zN>2#@kO*#tPXPc01rnOyDF6U{!Pn!rxBx&+ex2F%Qvg7y>dr(84bVL(B;Y-~e}ioK zKe^6oZ3hJj(f9yQ)+iKGS$;dW2t<}y2UdSPanP=O@&6eCc(^~(Wgv|#+Le9husT2% z@isAyc3kac&;V~EC(y-__W&bqPvrYxM>PV+$eLZ|7xN-yVevX623gcQ(n8kQLy$G* zkVIr9kCz2m^s`n+lDab=X?zGIzqXIU4r~jY*}~#2mOpL*;{T?LJR!nn5X8nFETjw1 z9F`R)5mBQ+bx^SsqzjcHF?|)qP9Dyw`+*a_Cw`1 zh^~Eu8G+U*xsK$Qko<8PfPxZoUH~BJv9J!1v3smD{VOP(R* zLOVwTbU)i_Nw-1&FxVZds(xnuhUa~Btrl>QaR~OQUazyotY%n1F~ID^E&VIQRh*kF z_*l18uX7}~YQ&g6=QPzPH|ztFxy>uMNs1qt>OMV!DvA!W;{5A=S9SApB(_A=eKa#U zwvx=Mnyqs?Xe9PG=i~dj52L9$VSmmv1rbzXbdau8jZHlbFzwi4bWl@&y;I!CPAtqc zztVmz^Vef976IRv1JpXFKxva8t1O>EdqyXMpBA&2F+Yg_CMgu0v)}+S!nDY zrfLeEbM7~^>Fis&QyL_bwghCsKb4R8IY8$cTa&H6JPygQ4bN@tk+i-MQ^NZt#{IEu z{|c^rPPMkTH16GT#r9NPubOF!LbIojX2Oj<8>)oyVLTU9W)7ux@@K((n11!(W98c}P^JN0~9)R1yb?W+t z=ZYv)(xWdws>xF6ztXOZ_)#owKp4fKsKbQmfTcy09YToK827}iuW(W^mMpr!>uts6 zX4$lC2DiA^UdwQRh>!)p0?p80jGy^FDFkP}y`McAhg*0TVthNh!}cDpglcy>-WZj9-i4be z9qRBxs6G`t>{t;iKI+d0zEp(pvHcFjyzw7`A^Fi%88w?DZK7KCwrqdDd9k#D0Dql$ zuRs5|u@S;L4$JA`ZSOj1@e{@Db-fTH0zzOk8*(DGg#?@udBqq9M|?hr(s3Sg(6>?^{Om=~p+Q>D@$ymV4EPcwB*kDp z@*o6fizsI|X1dlMxH^W|d1Dqt|$zm-%|2^z( zB{CgVXmmO?&j2(pVen3a8V33~Bo!D4GFfXVOnt#hTAsDPW;XQQLktu7x~L3L+DPJS zHpR4YVv4c1oGq*0A?$REq-hREq-4LSbX~al5#|!1(0LgZf#<`}a^kV)CHB4u^*n@@ ziOJaPe93;TV9kWHMZ4P{PV8fSQzR?MF|7vwydHS>geE0iE_})W)Vv*9ylp-NL@sVP8 zheZ0U$NXZyfp3`e@dqz16w1lUJIylSf?62C-eZu1X*l^*u!6gbCLW_0n(#T_^k zPmcCacC+7_7I6{L8dje=FrGf8tn zelX2ZEc^LyMI!G#Di;H!kVSdTN&kio?U}t*fd;a(9T^@RNR#}ZyKP|#?;MoqZ#0xR&Cu67?k^t%4-mrwrCV zi1Qohxd;remZ#R}BJNI2dRw4tu?@N3_k-=zuRk+8cy>bptez<{&yzSC(pb>-K0in2 zn3ii}d(Viu_EG;p7w2<98~0u43M;)!@t)h(YMEHqTqOYr+A-$9g!aLoQE0`Esj~Sb zD-V@v9?drc|2AVj=VQ5*Lea%-kcSsA#!iNJwoh%f&FoyjyA03xL_kjtNM-&o zXzqd2hoqR5wOAJ@rL#u?R%5DMY-ynoVZgJ1DRlpN$A7x>NQ0h~TcKXXd@q2TY#DMT z7r*v;*CFL9BJFXrdt7ce{KKi^`GgxrvctVujkHIAdIHp3p=ie`9&n{r5JW`!9;h~( zuRmn4Gu-EI`@g7r@3*G5EnJwY2uM?!Aiaq6COvd%iV9Lf?@_As77$d5(u*KcB1mrv zp?9SVBp|&bEkNj@g?bmd_dffa``tg_`vIOjD`ULl9q$-(W@ToswS23eukL6E3%W?} zG2oP(!D5HZVDC4qD%hlKNg~s}V1nL(M<*>}3NV1^#j<^r-jAEZryil;U7Yuc(GPh??_JZh zW%~J9Yw>Lbp)|GMySRDN9TAi6{eJGrfICrIFJt>5Dc!j}8Qk81Nwzy!mXqjh^TWge5pf#+6|q#P{8>?CqjH2$4jt(-@d9_J%8sv9sNP*2D(oJ zkQZ<2->4M5)iTqc_XxX@+{`Sdp1SvN{`+uHoy(JP}(1G_s-IL?3Z z7X{?E#<_ihQf%HJ zcgpSufcA7P@#**sl^(0A_;pR5~aQMRH@`bi@$n!rKHlOORZm1UdjZb1*J(w(}UEcu#TQn5!1*@K6^-hr^@ zxz1Kh1}d!U+^~c~-L{frz!feyhq_IfhO7-=%su9FJO08V7gX8ictd?7Hh2Sv!>j9Y zK-`UYZZi$NIZx{p6(lsN=;crF0%s_{VbdbioePm{?4$t>0=VlRbNJPZT7s_!wQYI@ zXY5NAu%P;SOf=!tc!et$5^M|4%yA^P!snm}RSt<^NE~J8W<}~334f9UP~{@mbLu-= zlQbNC2YF^Mzj;X(2%-AAO-hG}3cX4=D0eCZgHpX!UVu<+@u_R@E+Vz0s??FO$-D5A z8s(QvK%e2nA0Gz}2NqXI=G^)1dE-OiOZK}N2ZSv>GHjACK;DP@U>kzy_poY7-U4Os z=(1dF1NK9Y0p5vGe7Mg9ZS;|k8Ue~(fUULw6cH(;uY-E|;FoWY+pv29rQshAk(pas zRYe~n*5GgQj`^NglcrZY8ptIRv!f-X4$fE&@^yYAb@U%{0xWO7UW2Pdm0giJjrpEd z&En1@?`Txn^zE_H64b*!k6Bs!AVhdCp!=ZNeIPYSvH+MTh_u0OcD}Z&s3=0?E5i_} zR#X#3TKUSuh)0D;D)CpkNl-A87)|hQvhk;5KFHA&?JHfH#^*a4`{1nmFMh-eYIW+< z(GO=r+_#}`YnRTc=soO7uC?_17f8KNlFaKp7Z^702*IHCV8_lp z|7lvpKtVbUj@d!T99L3KJvRN6?PG+xHc(}d{6ZSCB!v{ei{_W_!dO;`P`rMo?AP?m z0f(5ne=;c}pp@rjFSKZ5PULI_o)8tix=1r%qT;3#K(m9TM?vFLNab0L-=Ly0Yq6o@ zR~WU5JPtQV6s+WeAW^uqnYuFKI1(pHFA{!~pQDO)gBz^=75GuWaL?DTG(g z*Z-sr#YZ3!cYJDttpL8~jbg6!m(gxpY|RKB-@96H_SG&qGaC{2-afe}QY96G}e0WS&`A_+ZT2RZxnT^_70hyH&Iwm)uD>m=U_KoE>?4AeHRxd22v z=ok`o7p@JbNLzC+<@28C8%=E_^oJR_VQR?UA3Bi$pIW+Knk{5ZXogWWIL<)PpTgkS z2DQ@iF8V@bh)2o&$CVDC-|kI(T9XeQ)}7vu2TWzklLHe!jz&O0v%S2&(QoflJCw6g zYIv4VG{zCJOeXn&gGXaZOkInoAT(F(2}5K+8J(7c0uQx>scoiVyOQG5{#Wx#v}b&Q zAc#or!}QdYx6+7|T2%E$7CCDQCaehuC;5;>hZ|emiD7b`V0*;@ivn)-P~YKxd63aN zV)zSNmjK>A6%_}tL`pZm6R5bx0o(VPVb?ZRiCu)pfmm#reVi{3UN}dXs(j~w!3kM& z1DokEQpCw9=(0zQq!XoLJo0|syF}BaTEc<^=tvxtCLWnqwI~6Tn*JN7)WRl!sR`-5 z!)*HNx7B$)f4V8hgIy_O3ahol2w~Xg7rqFH_F?!S4J8NGk>jYio?7pY^Y?|D+wx^I zRLsr%p(yv=%kTv~3rVNTqOuK}lo9-F>bv9W+qdtaeB8CggZG#z)2iA!T_Tc^{zcX_ zG{PxTUwS+ivlp-EBzN-HA}{gV|KO9Byr;!6+@c8{y7YMvJe$NuC?*{DZ+qY0_MLy( z4-XOFzt7yG#`$ShpTB)jIP|y zT<;e{0H1&1RlZ&^7oMDZ$LeG#{xUx1Jqoqzg<^JSTwIs?|@6GzTSop|nLE_e$Rl+wfK1j-Hij>Sq8Gsc+sJ^?0PxF7`Wr zmM#Hlcm`V{CAPt2D$5;q4?&@Pa4D;j+U~f*cB0)6O(#51UeK}sJ{gYVFkX<_5*byi zj}{+4TV3$8Gqg$tX?ofPDvIejUpni%MR+U}G|HXDPOz>5(kJag{roOhw|JZiVzb>~ z5*}ys;DB8xKu$T9oR>pM8^*x+X-cC4F0IzI%fEbgZ@sl_;7r1;J)m4=rF803=0;&p zqdhjoDHV6Y>Y$hhYeU>|F|bn<=5tPjbFR7emGJmV|2CV5{y6A83Y?)KYm1Hj64461 zYcGaq^$Gw`;R>C6b{=SToAn0e04p1Hcs>z7{;qFxPcXL|tP2@DYfbpB?MR+id#gl+5{rpL^1`r&{we!r0GMtvCn9O== z5{+N=oVm3vkTM|)g_QGI)cpwCU8KYQV}=+FM*5nvGp*m^uD6;)ZG7|^(F)UhNgq?eknjJ zH&#|-HQa=GR4CWJ6N}aF*rZJUt4z>hF&v9eiMoVoctN_uxE4jj(m_e~?81@NZ51ji zGBw2mEw=B%?LI*)K*>xL1B^-ATH8Wq*^|p{@Gf{E(0Ip8Yc7)-&94#YEt0h!P3rDn4V)PPZnv#_kL9vT z1UjbnqaRTFaV=vs_go^i{-#>96>#B6P<*@AyvCAMW%+W1{ch4A;)D6q9@2VlN9$Yu=h)B!Gu5!Y*4|tqyTU;H$$cNoHP`s$2KV;9l`5=GAbQ_7pXiWU`vg8k@XkK# zs$^cSwoX$%S{vNiv9rJb*?52FV+r!xSc2OfX?WTfUu%i+h9F|U}|~~H^G7? z`snRr68i$ozEov8e$r6yHE5&ZKwfEtb->8RK(KAd;5lDHi=OySX}j98_T#^?;RoM5 zX}LQB8|XbuC9KizESJ0yeB=&HXxXbKNg1~Tx1Ceixdnv%3&yS(N)09BH?&toO3U=j zEJ}Uuq^BQCpyDQG6>t2Y^SR)gYh~<*Q1m3;H66!j{3 zX=?etR5(#uB8SQwykn2pA$s!T{k($4-a^NlKBY!)$0KY?k+9IE&(?6#!J(>K!y{wza?EFG4_2hJ5-rtk+}t;3U9TF=F_+5+uPF)h#YHk^o1tb0}> zTR$ju!kfM(Gk`G2by&04>_?UG_VP__f6o=shl{%QHjgyZ?z{oDFzBae7Af%X-Y|xF z0{n4A8$}ohnTqba9Zz^-*#&S}}x zPaSz{mJEcsdV<3KajV}v8&h!uL&|i?r|{?o<;%I37Io?BnYIRvIdLg7Kjj9^hYyj@$mvZH zWT+DcMXmt~iwr}qn-W$nB1a%aC*VV-xoEQD_d!T@;?E^uKS+?=ZO?167tgKI1ydDb zB9DVGg$ZemZ!F*fchg?FZB?QX<5x!ssoo|~U4%b=TtIK3w9uk<7AK%6Ttuz=j@wR9 zWCW6q&-4RUg492RmsT@>82@R07(7*@^xP%MbM9fQ4<RIGYh;*r`Lyn1p+drCU}VJe{>fx&^ zmEk`rdi_mhA-fI4c5}>W&eopk{{ARCxquU{ne`?4<>NHmktIMGUShBW`u6#0hY#6N ze(Xf5EwPWU!TzyvHP#2!b32GooUUVU^s=1*@MkZKu-Gxr>CvKSU{niHO7XbH5D_Nz z;cl%pckPnV2{p?lerWuFb|=2`TNaLTV0j`l3VLOiCuC@bPg!*?YYmG34vc;0-DHCb zp8pVSSdX`E(It{e}GF%-8H6`a;O zKpUU5I~kCiqg)_>#7BzjIpwxKwSFp`6z@S{$0q3u@VQln;0>n7$A!`h=nu@@aX?M2 z-~z;q=6T$v!0xwJR{)#uFYM)f$&xY~! zZyKe-vqx}g29F)wt{Oh-HlM=S60%f(x&>Dax=s&tnI$k4;dPEypbs{rqf3y}!0gxu zr22!na3{7LmmZi&mXA-#4C8^%jFNDhX~q_-yX1S>)JFAi#|<3W)LTEB_Dtkk5J^Vi z{!Q6ix?cMov3LDk%(9BPIbScXtA=z(zA6XP;zq;3qXD};W&2XZL!LV+OKdHi!MbhRVA3tfRtlc}G z&!eIyFBbvk6%i(^IH4`P^n{U__IPTPr*j0Q{&=(GK?bp zn-b+FvJoxiP!4NBb_15`TmbUSZtL9aW8}P0&>@Aa#I+Drh9y;wR>~}AM;%@60`Ydz zJPXnshA$0|%kO+>tGn}UH%nmTf}w7_o*6RR2+2$K_G*IllroWRN|A?ol-2W$`R=Xk zd0UvE;8B)!I!Zfvr9x5(1)p2tyHmuy4N}QbDSEB+j_JwVECbl$&^$Dax|9~U!%$yGC(WzX%Jqd^Ul$rBbx>Gyb$0j{qfShs_=}40@psa0qi<+O+S{g zpYN5y`mWWrS48j!@2~m=j+DZ4FyoKH(;bqO-ah0p>vsHn^`*TDT-^h7a#g?sbX6?k zQ-^a30YRKC{T>!vk4Qp5c6K)Rd z?N?ppVi_><7z>R*0GY5hyYf~$JcH#egZ{f00^=T#ifxkMuDe!AwED;woTjN<-D{G) z|2HC-;3v68IgX+Y_zLurdoE^NYXuT#sy&eSQ1~^?TPkBlfoR2fGs-@fvWHPw!vpy7 z4dR5N=KqtCJBU4wRqE=0!{nLSg(ZlJHFEg|DMW9WDKDB)wm*-bC4QD1_$dB{5GJQX zJVFHpe>tawa#w&8)h&yb-wbril1u)U0joq81GS+#zNKM4!Ff2Ce7`@@jN6wvm=WA} z4;tw8Aa^ac#-PnT-b5v@fV6wb^@Fd@!bjCC%((oEOpMegFu^p2UX%mH8oq7v({@(~ zmv_Q*!~^7i%`!bc@7duyj%0&vgJ{`~_w&M1xWWFaH%B!PQJ=JIQx4 zMGurnKL+lVE}o7wQU}}|`#LV7*YEcd}ZxN7- zmJkFg$c~b38I!y1uP^|MIQtKUTgMB>?n37we1C@SL07gmiLTSbRC3C;u%+ zDE9QjA{jwk#=j9lf%_}XGYV;d?kl69W`J4%gm`=oTclZBarC#|h+Ct4RF|WTBpr#{ z$F`DzWDn!OP^kC|$Z&XDD%K-DB7n0=Mj$<>hEoKAx8@0Srqu122oLqnM{8H0*DX;% zhWURQ#UJDnYXW=4^3%QS<=_2A)F}kqRYr4+g}XnIot*djRb){bLTS#7(nUQm1RTd9 zpLz8XX0J>wBa)S`QKwX{Cgm%G;>_iUB>|#8h=bxOR-mjdPK!+;4^i-B3hhHEi2V?k z<%yMeR4AkIhApe>m+(U!em#xSOj`0wEY}x@s9Q>dyh{_WQ+H@Z3E!alQ0njsAV;ic z{IC;ImK^QLe~MLy!UW`&*SrWzQ&Wz1a$aJ6@g>|n{__f}@-DsK&L^Oc85(uYCBoC~ zuov(lb#3l1P`Tw0LZU1X?c^nj|L>C5En~jemd@*hG=zjQ)}}euT)ZNaiqK%SAVz2QA~>7_aYarmqGRN@OLG2Cgv2 zd(w+qyTx$;Uf+nFdV{|qodOi`%yKKxEbCpCWYFx^ay`A}m51!=DR32z{A0&G?;|(ejYHJNZrDK-n$!$dGU}{`l zt7=a2(yUd2ApA$y(6;dvZLtC#K^wWPdFrPbGoCbuyrEQtIdg)~^@3Uu{{9H{zy z#&Pc1E}Hfb4N3Q06$8;ymD5KeCC2jft_t0Ry-Y|@|0T_qG=}w49#QA=G~DrQj8Yz} zfuZnR?-LTtpBAg4v1iM)v|jdPX`Z(FUu43OD5_oK zPVe2j0FvxatDg$Qqm*Snb4api=<|zYYV*<50>!5f*}IxNa^4XB#i)3Pp2T?+DUJU5 z94f$JBT4}?=<;6iQ$XM=@A&>WNR@C5V386A?f{dpLFMFAKhx_=B>jcb=4GAEcRbg? zkt|FO@5Ir%&si~CAiV>nq;&6W2m52;+(h=#IZo(2hI{v>j$}-@ZM;d#*Ro~~Zp-f3 zeLK4z3Z0B$A~zgU9?M`!d4~b)PiiNqS3}?kI9Yqaos~89{0JImqVy%^ftdvh$o%91 z7e@UTh>a=M@u6jxXna~IXAF>w9&47-AdwrzzffGDUiJS*k!{t#-S}~l7e|)^S<%NA zzkyW$CCgT&zPqPNYN(~I9o-U-ME8BzLA&%w>MvD~c8b4Zd|;qy$bvu`c{F*nGr*=x z|0$Dwuw&K+Ay^US7x4wRx9pJv;p&uHn|Hiy*;`PI5y#8G5dP-TROUEc2Pq^PUKNhPu`cCl@AhFskH zo#FRi9*xv58rv@-6Azs88%Zv4#59@|^)2_b(!@Yl@zg}(cPWjXD|-VLtKgVt_0>Y( zoTzOw(Iq};{&Prng}3sCX?TPLXwp<$>(bU(vK(Z|J`RpAj z3JR22&&0KZx|apf#Q^KC=2kE7Yx+wJ&4fsf8da&6e)}$bpp~#FXhW^k+@`VM&cY%P zVc&;jbi1K8KPKv@Jc>T0peES$u6PDRSGEh?hYS>mfh^d8z;u=nTlNW^(|XHp0XC(H!Kd;Dx^KZ1$uLq9d-m@ zBzyC#H3N<1O%#PxC2&PlJ{_~RDhQS{=k7}WYAJn>#jzDBUx@yfTe{%w83gTO_Ra^B z=Bp0UXtK|&K&NdntNvf=}w2-@_iK-=~F@12ZfD7^4IcL#f?K_ zcZ-EP{tM^eNX9%ixkJy5WW?jooI{bU%uhR@{}PS>8N6(Lw_2$9v~N$ET=8P8{`GL~ zDI%SbwH;iMs`^2&GiSn&m{aO4K>ffSRYIr_cDH7G)37H6C@j&4p zT?yc&-8At_s1i21!B{(Z(L96U7wds__tu7q)gHzROOF!HlX4QZt;(wPCR_Vq2+N*N zO@;tZn0QuJzJ?TC*hH#{Vp=9auw*(a9GfL?&VuNF zT#V!)bd`n-s0@B45CZ_O0W&%0a>V%=o@;0*@O_m#d{8Qa3(V+X(vewPPiI*bLRS#b zBKVuM=w07MEu!9JRv)Jayd$VLL6Yh4XRnk~uB!SwXT2?*BDgX473AJbaj2CKwG7a&zNGe|7`aOD+eWUk zfEPz(>n;vj^pM20`OOd75s2prAhj=%2@Jz~GJH%j0&$59$6XC4+DqKv-&^8({H#j9 ze_!l1!eozJWZ)%d(7tcY(_+AxpfB0}_VBnb3pIN8k&jdMi+$h2vy2GGnci}czm*E9 zx|+%-ZqaFhUxvJ6`=F)s=XY3Bp4r3j|TR4?aEv@1!E zESYalsQ+4XAG}?EeFP%^hX`Yx$o9@-gn<6q5`8_1NAWbzsPjb5#_RjPG6N!qhERMe z1&!7?KsLR}@#$$(3ebvWlFLFWF)-xJr^$>tJ(aIYukSiu52F-jxlI{d`h796@*!jQ zxGj$73DL?JBO7w#E?YHi+{feIlVPgEo>i1q_rw*eY;p6;df%KFBf?5JyA&N3PI)=M z-XAAnw^ER1!!s2fTq^pKTNMpj7+`HA>u0Qs{=(;qd^3(H%OoD+b^NKWfpJlD?8RfM9 zX!Xmz-c-^L+h3bpj0`k{wFUy#Gd`q*@k;K}biqmUA`RR^p6)Z?s`2|;@V zrR*-JO2EiRL5e(g8e*sQFE*pVMH_(7`%;Xeb5sPT(mPB}v@R^WKPTWhx}`uSs-t|_ zu-vmO2#wF8R`_x8ABh)P4Fdwpc4lhzW_(+3pxq^x^LF?MY&&1Rj42#!hm?%dpR5)4 znS!Q|i#<)n0(4a0eu6aLkyZ;*Ya+-;{v|Eb_aT%EdP`oiS`G#YIA}X&j7Dr}WT85A z2DF_(y>m-S^oLBJ9nL8G4U5^zn;$D@mmA<^d|}fDSPdR>@X%MR(>_EIZTBYk(air< z`$g6V0q2`_GZjZ;H_eNYzgAA)gQ9KpHDf;kJkB&>fnU9^mOLbQ!q|d=#N1FXey)?C z7kVX9eVgUUg#G7hPR~B^$17>^`0x;!y{i~YSYag^PVEn*mVa&Dq3ptx?&Q?}p@Vc? z+NJzr_M0D6_Mj1~TrblUyVIclk=xV=lz35;G?3hpyNp85HN>jX;+KcD_ zdeyaYbqx}(!T!3Jh$F|49Vw}lV8+tosn(pFJUZ*L2*ahZe)6RKQDbDNf< z`J74Ud8&nyjFAK#tV9Sz&S9=qrT0W4;MCoDR5DjEwt+Uk!&oK-`{?@Mprimrvu^&5T_23M}-T=1?*(gXd1m} zR5E8K1orfv|7PaPvSajd=>(^I3yre?uW6#d64QNT?@&2tPcXXk{2N`fsd)IKI&+IZ z$Ugjf`*iqNHqG=+8n$|HgR#g3i$mZWg&*_q$V=CtX-4shXM6(qbAcKz<`yyjqsrgt z%qs#@NZ7s@8O{DmmRP^c%uLJcT&V3mw9M>@W&lCIZu)J^EcW$U9JXxa{@+lceT=p+ zSu+746RsS*i)`KI(kd!uGK2-J(`YNwls!?&E1HR005VWURVl7bs^>Ep}8 z%j}io7j-&D27g|Zn?T+$^S37#|b*N!Edz>Q1K{rCiNqyCSVDNgRi1kQZ zKPH_~z5FNH1WTwF@XNb4wR3kd;eFF|oM*H>`yo<7pa^utj_g%6H>Bv|ZDAw{AL`Ci zBt_oyalxHK)n#9f0-9Su6Gz$o8Y=ELvUobo7U^YHAV3Fe-{(xIB?;TK>k@U#pe038 zUbc|Bbd1Wd(o1WoHn)`8yKEzhRRgB)J|#mBx{mlt1yjZu8Gr1k??iq=5w^OwT^@=@ zu!Af6&FNsen!SQzoWrlwt($hs>kV~X?4F)8Ex;?9wrM{uqL~YEe>;?1I#^cr3w59> z;&-K^vW;H+`emp3K4t{&(`eKVrww0s!r^tePM25okZvEz`n5Sq@-1lQ&0fft!PqZf zH1Lz$J%&`%a_ySirf9praA_5WgbIQ3k|SfJGztluZK{=OSWbKr2519&-$KvSxdpmD zuwRaDAgXU=KQkTdEeA8t4J{4+2F)O7BO5WIEa{04|Bc$tqX%ZMfs^^ff#kJPV5le1 zoHLl&py@S`Bx%` zvV@3R8&b!og2|pgw4#!@KB1#D6npcALy=z5H@4wdIs_7>b&rRv6z}Lg&a89$MP8LK zB;*t-q#-l2W!D5*C}kAzUQPq6@1^LAtU~p*Tc!Krg?e}sCT9(W`1^sS)vg9X!#wc6 z-{$MFe|~M7+yU5MdOgn9{Hr#6MYP1`C$=~()bk@JIH?f4+-5;0C)nckTB&G|B~;&u z3s=4N|3Zn7zbI3hZI-Hde$TRCtj;OYx26wlR5?z-veaaeZZ`li>dwZ1rLLpJw7&Cc z*`+j{GwzP|>J#EwPYi$WIIZ?h%hgML^5)GHZSf%A@dMrz4-jvjWxAb4V$Needib}u zQ+)e^%M>g^PC=*~aqYpvzB>xN0pFzivXB+=8YsBit&!(RDqx!BqW#010G~q-@ib+$ zVu9A352hS@ZZSk96YF?D&Hn+HQT-Vc{G;m?kfTOYp)YQcfAvMbFkx2;EZ2nl=He#Hczb?c~xX`uv%9BJigp4HHHGWYq69jZY;6a*5{?cPA)DX;m7lvOt)cg&ze3 z%?ZmL{s67^W7lb7-7ocQOBh%CS)M=W0fG!q)AOa&^4=o>$Z~)SbFY78q8lW1Tb6LJ zBViG0zP6OC4y@w+9W&vonJ7FFsI00SJWO~B_v&IoWXipmVG&oxki_+#~_G~y~KcP`V6 z*23Bz5xB*)4S1xXKa7~qFMymbA1anPdh(?1ndPhRBl4(GjuJWH4S zk%&W}fWaU1%LbCLOj0v@M(DG!KlLhjgd3JIiw*EI0nus%aPUOj%Ed?}lv<2ar+~jY zm-9{5ckTkahU)`7uiToMOzn(j*e-bFrh|^UaqbmjsmQcOsFRHu=ilq9`HlN|!9Wvz z9!C7s+yA4`V_B@>Y?Eu{{g@sUTR{wm?UPnOnV$xHCwE0jM$*}}#EYxxt_$MiUkJ}I zb!(JJ+$Y}61{TbW=`80@MD~$S(proy$1Fe+r7yRrmX>SP*Vr|{Lqh4u6tOT{_e&K* zfPK}V)-@-Wur@$i_7$kUG;Ht()kVO$3rGScS4g?E@^7zJd2$;1$q`(XxTuI0B!qIp zRA49)c*4QLyD!yUP`l9+RVyH~xREM#V5zNI==&Vw7psTq7_v#4KC(DC{(-TZDX=`qm>#y6HQ9jOcG z$G!sQ=f^#_j1tZkg?$ElfXtsYs-oNn{Iyl=5VjADcytNSx!hW(hrR>GzKgy&(h#7@ z;y~pf7&~D6NcfUOo_*5W{PhZQp~K+CQ^n?gP+C; zyr9uZGEtfGgJX`&*tT0h_PS#$&dL`q%pP9Q?U;*#AOwnXevMxm)?+aGwyU=`QiIp_ zoyGJ`TR;XuznQ+PF^!y|HU0wDdr#cc?M}!}WB6WUPaAM1uM?MOzs3xBPn#cXe&MVX zd$%BIekCK7GxARMN)uh=W0iICyYF)rpJ=&d$y=zjPI(NstLNRhGw<<>AbqesEyAqF z*T7wP%K|YY$%KGsCFf6(e1e8eU1XMX?AIQ!QltGp{!X#eg`j=HNMUkNbr zd{+jK*qTeby}QK}#P1wZm1yD{hHHT6dehTdN}rxlQ5SeJCunPe*nWv<`;E-QG*wj> zY0&EdlyAlJkSaEx-$WzjB#Wy{kD&W;&Iv!06<6Pj+Zt0e;(%^~Z4aZix#y3Ei850tdii>9Pf`R+`zb;)yLu^_98ds(Dz?QBbkDEZbpYceJ=C% zy{`wic+dkGkU4&_CNZKZ5yv?jw;g)r(*Yf90Y}ewMRwU}lj%{<{3i&1;5eb?ZjtXh z<~j9SI1vmhM^mpC{NM|4$|pS@sUMn1)xRW`1*1C(l2Az0LGwef9<#FSui+-ruQ8-? zBEQLGyDSb`gSBw#(E$`Ox#IipvxRYz6`=XKb z%|?p_8mm2@_B82fYn+SieGj0{osjs#@1is7Jvb*_u^bKN{J|F8%mtRaS8secK+;8L zc(N;YLSk?}Bwe|Q*d^!F3db+_S>+ST328^MB_-S-TO`v}xTs~t&+pT zW{1Cy?~Hd9u|4vE3%*`wR|c;4Fv8mfXFYEbh%gcA6WS|gxGoLyCs5Gb4Ep($qmnN4 zIXHJC|JBmSJLIIH_QC@#nn8o-3hUl{?@N!Se0%!>Rw=dphO!ngFVGKDevA>re^l_a z;~^hBFu#&*@S_H35WNWV6q;`%AG9oZkhgadxlcs8KqA>)G9y&6QS9Tp!Dni&BUzx( zEXcI_Weelv+Ftv#NLzqAz&??*#G9+j3o;N2$tD}X$xRfqK$GO=dbC6Gtkd@MRXZW3 z5o-1W_nAuvD}73mN&^=4pp3aW>kKVAC!b$SwIq|;%?bJ7idp{*`Ur(L&EAI9180{wZy(t*?)^`M(j>%R5hw_p zOJ-M-+r_?e^!z78is9bjgpP?e-u$CjBDLu9f=UaTa;j2@%PU=dsIzK(j}}A+pBQx* zY+vfecAbUAxYAFO1|5w|?_^X1p>&GOv-~Aj^ddUv-JjQMUo_O~TzT9y{pCc+HX)4O zY;L;g*=O?6RsTI}`vRs-;Wtf(aaud$wKTk-6X$HQ^JnYO=TZWbq{_&;Cz%UyH4E_A zJI%%7&4n6~>p2Rl991?r;|ZVAKsI^MWycyat$tYh&{VWWli^VsA+%OEZqbYdXDNzQ zA=6E9RG4-rf67JN^(Q=O{$6gY`39W%E@99REq?SZ(zUSYof|oY9>OE{N=vP(ucbX` z@tbUXiY_FiFhGl*9anZ=>}{FSD=pFnrYT=o6cV$gx9*@z!Vf zt?0l9{5_U93oA6Ix=X2_pa^DmB9hmr$x1Q)-CHqdb<|R+4@rQKYwFa<4$wcYX}D zMedxWpxNJlZq2-l*EHNCiF}}9?xoEthLIT>#+}M182etRAwhnq$`DYqxv>@JWWaBQ z*_4~7j@HZZl}c?H5e3Cqo1f~EK19|H{7#AaHq5-LSo@BtQ)tUQ`7lnK?ID}Jr5VT0 zUP`_KIjZIji@_bRe_S*&DdVt9qZXpOUp{rCqhoNT+bu^$F&3%_v5xbg(Y z1f}IE_1oWXt#Q@?GtIAGd}ikKyKmWvxBP>G3>oG9-R!_oLq(29Ik+OAA{9 zq>QIWO*ZfH4&9Swum!1)9$v{bc&D~QocW%VOoW%!&p+AUCUx=XG%_0LqKuTTJ{^jI z6%99gLYexBiW4>HC>t^#YdH;6m#sx?9gy1^KjQjYdoqLizL9o33qyI6s(iUAX!RmQ zD`(SZ*|4C8K(1j>u6*@qO0g4Foe4=d4qWT3HV-UVJCbENH29$sNi?IgqMUIarE7lc z?nGB#n_I0rbyua`{Mb|^atj(8Et3F7(C35C_hx3?>{EOZ(^Y)c6 zGajanIS@|{2=hRdr&5W0%O@r>r{6lKNLKU!(++gopUn5lUm`rAUbD^X(>?YHigX>W zOduZ#yBrHuQ)o89yPMYUb|{3YZajLb%9|Z-MH`|-dtI~4BCak!kU@ZlrXQk(=u6@PN!9lhceg6CikU<&VZL*WYCBezNfr(5 zzHj6g=MHSQxkL^ynwj=3_fhup5;lrN+BSK(VNF)0`i;g5%)mTWEu+xQz{HI45}NZA ze-n^5J(o`oqxDy61QfI)XRnU^zUH_p9m@HlNkM|0H}518q_HYXEAu;sU+l}{AK3NV z4H0!Ye)AcC?aj!xLlZ7ggxKUtK}q;it}?ZHHzs99+2n5Us?8&@LPC+Z_m&E)Q8WcR5 zzfQ$S{g)fa8*>`afn~(;>7=QWbO7Isi*Xlf;TQMo15&dVwAwVG9~`hXGvsaj7~C*d*aLv8ssHBMAd zU#w7~;MXqIamKL#_t#pD$ep>~#$(?U06i{_3(NijqEti^+_+q+_H4|El&_ z5n-*q0^u&)!H8roE=HldWf~Iq9}cO^E0UjntJ<|rw)L8R?$j(Jv*rHkg)e=m z#1@{AmWuN6J&IQBI^ozn^qzH+*z{e#2a6^nsx~*kW$0p8(8;y6`#o*}IR~W5+n+j8 z+ULr{hvt=2FykZuQO6EGo?9iNdWIj`YGrAC!+OU&M}Tod;K^=V+eGDI-y@XLJf>Pc zKPn0TP~pHv#Wzm??5Md^gC5S|P_a2xF@{W#N+xIXwCN~?cVO4K^BGusEaU{OdK!QS z_uP%AZURECSMBX5QMCWVQ6)J-9J+J$>ngTx$a?Rj#0q z{mFns8aRF`uE{9xZ8+D3)4Qt{5t#8va4*@2DBl6*4Pq&M&n}L>9&rl=hkbG$_nR?RE!_J90; z`Q6(@nUm;}I2gobkBKAro;QsyehKM;AUzKddy8Kxxgw9UZxTAXf>MPeG-@)UPJGWh zu2^w-2|!+{+I0S%y@-~F9K!*osn}YJiA5t5VDgiHI#yR-A};8Wrs5yv=t9ur6|k3g z&IJ(bH~GH)Ri)5gw*XZm#jkIJ4HO?oY@kx~sfR~^^(D8c*WmMCYsVi|hP@=>A|GiA zx6Cw!7cV5b7ray(g~8bE-af0a;U8;P5GC@Xnndb8g0X!6<(?^tfIL#1js+J^J0BKQ z2ydSTUL>5|Fn8+1k>qt^d{I~WsniF|G<(vYpe%vLsCRPb5DC3OM5J^|F7;sYnUj71Oawi%yuKQRb3ERLTcr{y3wQIQUt}<8(*y7~L z=|(iPBua9^*#@*^sTR=AJoyZrQ0J~V{x>EiMZ}4EyS@UC4cNjIOhNFk=1M>z*XzX6 zkQuM)TzgSpWSUd)hbvQwYK;ucKdozlkc4ZRixl}i5Sjz6aG+~UlS6-p1~v+2>vsl6 zJF+i6Gwo9xH~D{B{)C=a$Zdn}!6a;MTwQkXmt3|tHO*JhTT=QjmuEv*=u3Z#ZXsAb z09_QdXsGViAN)&&Op9_utuD|&T#~&-3{312m zJ3R990U9mb?fj3Ek$mgP`L4EL;(Hd{orfXXbI^mEL&91~bstL=RBb;Va$bYoto|cj zR>yl=;Ca})Q1d(QE>-E|8(*{E96^h46`mfCFm7py{1f@j?y=mfIx5cj-)Iq9o`jy* zUZt17CXYnPtUJW5hs@re6pHYvM8wAxmWjVTv|*-~@fd&SB$4$L-Q~XNk23!D%XPMZ zpp86g^RV=+EwupyEM?S7++Q!B4d2_dR=^#6}HeC@y##y{c*Ygr5ih}?iLDQ|(7 zs1(kbo?}_gMOk=pc!_QIs!43oGXg23|6&{P64OhyWgCz|<(2{7q^v(Y%`g4O`_7r0 z)udpTURvC~uV$C89ro>5>eZe=RjcXI8%TG>(k#kF*{vtXOKnx=u|<;XXiOr2=2pp8 zX*TR2LBiJaP|r7m#Em+N1?3y_Q&6qx?3GD-RWZ{2QqYaKiBX49B2$C^r%A*pyRG6g z*MK3mKe^mF+x=eiuR!t4VlmK{E2{s{NbziDF(~6fW3mAn@y&y2W9NNDweRl7Vj9#| zX>qm!6-%vjM^GB9fFOeI(q#eN)c=q>zvPx%j7$KyMcl}HbWQSidOviI+h3Z+7L6tC z`)UIUxR$@zJCwLeUJa$6BtQL4%$DbDULFw15s;W0kXZ89+~h{g^wOaWj(`BROANK^ zn~8+>ne%M7Yi7FQ9;K=!BTQak zOChw|_#s;&f#WsKh<=&`rP;6TN<=w?rbNyrwUlKm<)-1EWM~5|#D$-wCfkWNLfl}p z+&+@-o3&xFHqOSs0>9O(FAp9way7tH+NtgzI5@F1&ET23tkFJce%3Tq_5JLXcU*7Y zzSILBh-d_7WW|)gjRf>Y7ICs^q0E_pD8UojBwBS-m9s2txzYdFw)Mqa@8BApY`Ola zu?mh#lc`-S655Ra_@gL%oK zSzawpyymoL<|UUA&IhKC9?>D6i9ZiOT>G6M&b^N%h_DHWkNi|vg-_ZL0!RH_Do#V) zygchr`^@CeHj({^<%rFWVZZxDs{@TyVXaOj$eCY2un{w+NjE{u3;QkZ0E3XB0B_)G zXN{1!X{#_t!;+pGvi?*W(PL;@1{9H)`QFdX_6m@Ew%XyX(l6wdApbD$d+^gI0>4xX zWX~e2rX=QSbSC|(u4Hev8%spu#?wYJ4qKO7Rtm&u`RMsEYD62NX?ZV!a5QbFqcG0` z0@Y(SE6;(aiEnKq?2=~5NPK{k`JL6rXD9QII`Ec{UIY1}2ad(aN<5Zo;U2->*2HBN9(z9wt0 zbN0Q@{rCNC-dQzj)R@J5Ua0~{YgI;7G8uyl{c4gB$9)LA%i5f{D997e-#E zpn0g#t@%nUjoxS0t%g3tx0-@{I{J9*0n#0JrE_bJP}4qZeI{QO>K4Od1N3al4;N+? zO0z4xNwZKGDae0weJLa@(c0Tuu8(27nq9wF4ad3a7gBKkShUx9%KbBPrd8`cr(ioc z#jnOC7QkuHFB50CD(QhYNTCB3{S4z$>plhO-eWeM;wcNX+x~_!B+^ zp2ioz?`=}JL4QD4=Yd%0&x4Nt-fZ5vay z{{5Xx?{PqXa|_Hd4nSfId$p9sbBIDa^P%X3FH{GdRtT%9=Gy<+moZKtSL{JX08AYJ zn55SM_kMOyt^2zz+5D74hFNB^{n7~3(iU7N@bTC@V}B{Q4yxj&e>7M{!CuuKd(9)v zjh`8P7D)KP+s*>Q=k7eHUp9QyY8f3hFDU6z+`3I4^=N#G3F|NMoeup*d~X+tePq6X z#wjTPLp&%F_f5k@nR?CVysv0IF^qVTS}xSBbU`yAERQ|bTzTC6)&i>>*%yyNy#pP5 zr1gW@KMaVOav2iTx$1t+7;70bjeccEKV+5?*>gWAKOP;}7Q4!S14wB3f`bE~xC!6m zgyv04%4pldS3}GSE(J1Wv;id$9ucjbOwRlphV~ayBBbjYCQ=Fohw`Q@=HiGymnrk6 zvZ7Q->CI|hwgb}=CK(lBYqTugy%gU;HqI;wCT*#$mH}jgt$^hfGTO;28g{%w$uE_3 zoMUKYptx`a5Q~g&L2@6>*}a~KWW-U4Ic|VLGr}+-6v&R^D%GoDc@2=Vw$&Z-+7@kD zRogx9TQ zR%SKCF!qv1NI6q#0gkOJ?f&^)uW|~=_Y=)O?5Jx67cBVAk}`dEJ*Uujpa7kba#oi7 zDM9+5^$}(@2A;kwj49PqbY@0NrOF(f+_MaV?Tbe5Vcko9y-Qq7(bS&Tu};9-_j;2a z)umt}{*=KPF!V2Y9o*rmT&w<5_qcXo)c7qMZ6TA7YRigoaRE{XKi^~(PfW}0KvqSG z@Z=zOjJKFe21xmUvV$oVEb8y##mRqswIIf(u0m;XaK)|t8>H+z+kHu&jaT#wI()h< zj3+#7dPcm6Qw^bsq}OvudOB@UBWRo4Dd$PMb$E=o>!JJSQqxc1N}_h4ZZ6x5V|JHv zhF27O+EAhSPwR3(0l}Ysb?;wrWX_+ydrxI858j0`S-SM&@vnounvzPpEke2lq1zFAs#fW;L~a)uNP4f-v(_#Kjvj=_&lsmp^*JYVR(9Wx%qW z^>n0@)>WY60LXSkPURW%HGOpuA6hwn1Q$O&-jU(eGr3L4HvetOHuvE} zkd?3T^T#qMy@1#oaSxW$px%n(j5cBwxdgL(IjfjOPL4FHim%~$vc;GYIEb!4zkc>3 zIv59!lP+>n6$pe(9W6b`J@_aLXLT}hJP3}(dbvcC^~WCAkvD&5F6Wut@w}n%HWw%s z&q++1JwqCIJ`GG+6gynzebsgqcH)IdrbFAXT(TZk3E6@78p8{!OSR>PCN$#K!M>&L zJ(#2mjQ*suB;qKpYc4FCSJMY{_r^J&2Idijc)70w#uVSET` z3COt!S+AhZ9P=!w=p!;byol$Q{y^K%_)2dgHG^u5i(cW-17Y263%#2Xx=Hgx-Eht| z@MpFS0&&x4+D6#C+ONAl*O*w^EG%7x4?G`|&6M_k|_eR#HT zWV-dSnq#Zc1aI`UX5dilQa}mYU3(qp7WY}-EYulpI*av%1@nT-7^OOMQCuZNbblWI zV+`@sf`}ucZdSNn=OCFSu|vU_oDSE1djd$#1w#>}MR+b)@b&G4gWKEEzXm6EKiSkWPR==-tuM>7E?zgnfHCMqyASM2 zqGmR&U0-6V+~_?T+x0VlxQ#=RXAUbaH&YPHankC&=-f7;-02c=oK^Y$>_
~y{` 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

n{U;|*<63&-Enc$9Bc{ia~fEJN>9 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 literal 0 HcmV?d00001 diff --git a/docs/blog/assets/2023-11-09-keymap-editor/editor-screenshot-light.png b/docs/blog/assets/2023-11-09-keymap-editor/editor-screenshot-light.png new file mode 100644 index 0000000000000000000000000000000000000000..cdaae5c799da8f63a5a4d1af865e63441c949049 GIT binary patch literal 75097 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 +knUbIx+ui8%&y{z+C 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 I^qph>14ln7O8@`> literal 0 HcmV?d00001 From 91aa3378f32f5688329a663fdaba4772e069d548 Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Tue, 14 Nov 2023 03:04:04 +0900 Subject: [PATCH 483/494] feat(usb): Add boot protocol support * USB boot protocol support * Use a single definition of a boot report, used for regular reports in non-6KRO, and for rollover in all branches. * Handle gaps in the zmk report when producing a boot report in HKRO mode. For .example, if it was 8KRO, it would be possible to have the state 0 0 0 0 0 0 0 17 (by pressing 8 keys, and letting go of the first 7). Copying the first 6 bytes would not show up the single pressed key. * Disable usb status change and callback on SOF events: SOF events were introduced by the boot protocol changes, and required internally by Zephyr's idle support, but are unused within ZMK itself. Ignore them in the usb status callback. --------- Co-authored-by: Andrew Childs --- app/Kconfig | 6 ++- app/include/zmk/hid.h | 28 +++++++++--- app/include/zmk/usb_hid.h | 6 ++- app/src/endpoints.c | 10 ++--- app/src/hid.c | 92 +++++++++++++++++++++++++++++++++++++++ app/src/usb.c | 14 ++++++ app/src/usb_hid.c | 88 ++++++++++++++++++++++++++++++++++++- 7 files changed, 229 insertions(+), 15 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 0dd9316a..798cb785 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -103,6 +103,11 @@ config USB_NUMOF_EP_WRITE_RETRIES config USB_HID_POLL_INTERVAL_MS default 1 +config ZMK_USB_BOOT + bool "USB Boot Protocol Support" + default y + select USB_HID_BOOT_PROTOCOL + select USB_DEVICE_SOF #ZMK_USB endif @@ -575,4 +580,3 @@ osource "$(ZMK_CONFIG)/boards/shields/*/Kconfig.shield" source "Kconfig.zephyr" - diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index da6bfa65..afe92101 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -116,12 +116,24 @@ static const uint8_t zmk_hid_report_desc[] = { HID_END_COLLECTION, }; -// struct zmk_hid_boot_report -// { -// uint8_t modifiers; -// uint8_t _unused; -// uint8_t keys[6]; -// } __packed; +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + +#define HID_ERROR_ROLLOVER 0x1 +#define HID_BOOT_KEY_LEN 6 + +#if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) && \ + CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE == HID_BOOT_KEY_LEN +typedef struct zmk_hid_keyboard_report_body zmk_hid_boot_report_t; +#else +struct zmk_hid_boot_report { + zmk_mod_flags_t modifiers; + uint8_t _reserved; + uint8_t keys[HID_BOOT_KEY_LEN]; +} __packed; + +typedef struct zmk_hid_boot_report zmk_hid_boot_report_t; +#endif +#endif struct zmk_hid_keyboard_report_body { zmk_mod_flags_t modifiers; @@ -179,3 +191,7 @@ bool zmk_hid_is_pressed(uint32_t usage); struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report(); struct zmk_hid_consumer_report *zmk_hid_get_consumer_report(); + +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) +zmk_hid_boot_report_t *zmk_hid_get_boot_report(); +#endif diff --git a/app/include/zmk/usb_hid.h b/app/include/zmk/usb_hid.h index 1748835e..777f2b48 100644 --- a/app/include/zmk/usb_hid.h +++ b/app/include/zmk/usb_hid.h @@ -6,4 +6,8 @@ #pragma once -int zmk_usb_hid_send_report(const uint8_t *report, size_t len); \ No newline at end of file +#include + +int zmk_usb_hid_send_keyboard_report(); +int zmk_usb_hid_send_consumer_report(); +void zmk_usb_hid_set_protocol(uint8_t protocol); diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 138e790f..10357d4e 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -121,12 +121,10 @@ struct zmk_endpoint_instance zmk_endpoints_selected(void) { } static int send_keyboard_report(void) { - struct zmk_hid_keyboard_report *keyboard_report = zmk_hid_get_keyboard_report(); - switch (current_instance.transport) { #if IS_ENABLED(CONFIG_ZMK_USB) case ZMK_TRANSPORT_USB: { - int err = zmk_usb_hid_send_report((uint8_t *)keyboard_report, sizeof(*keyboard_report)); + int err = zmk_usb_hid_send_keyboard_report(); if (err) { LOG_ERR("FAILED TO SEND OVER USB: %d", err); } @@ -136,6 +134,7 @@ static int send_keyboard_report(void) { #if IS_ENABLED(CONFIG_ZMK_BLE) case ZMK_TRANSPORT_BLE: { + struct zmk_hid_keyboard_report *keyboard_report = zmk_hid_get_keyboard_report(); int err = zmk_hog_send_keyboard_report(&keyboard_report->body); if (err) { LOG_ERR("FAILED TO SEND OVER HOG: %d", err); @@ -150,12 +149,10 @@ static int send_keyboard_report(void) { } static int send_consumer_report(void) { - struct zmk_hid_consumer_report *consumer_report = zmk_hid_get_consumer_report(); - switch (current_instance.transport) { #if IS_ENABLED(CONFIG_ZMK_USB) case ZMK_TRANSPORT_USB: { - int err = zmk_usb_hid_send_report((uint8_t *)consumer_report, sizeof(*consumer_report)); + int err = zmk_usb_hid_send_consumer_report(); if (err) { LOG_ERR("FAILED TO SEND OVER USB: %d", err); } @@ -165,6 +162,7 @@ static int send_consumer_report(void) { #if IS_ENABLED(CONFIG_ZMK_BLE) case ZMK_TRANSPORT_BLE: { + struct zmk_hid_consumer_report *consumer_report = zmk_hid_get_consumer_report(); int err = zmk_hog_send_consumer_report(&consumer_report->body); if (err) { LOG_ERR("FAILED TO SEND OVER HOG: %d", err); diff --git a/app/src/hid.c b/app/src/hid.c index 58e5824d..689a2361 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -17,6 +17,13 @@ static struct zmk_hid_keyboard_report keyboard_report = { static struct zmk_hid_consumer_report consumer_report = {.report_id = ZMK_HID_REPORT_ID_CONSUMER, .body = {.keys = {0}}}; +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + +static zmk_hid_boot_report_t boot_report = {.modifiers = 0, ._reserved = 0, .keys = {0}}; +static uint8_t keys_held = 0; + +#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ + // Keep track of how often a modifier was pressed. // Only release the modifier if the count is 0. static int explicit_modifier_counts[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -85,15 +92,58 @@ int zmk_hid_unregister_mods(zmk_mod_flags_t modifiers) { return ret; } +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + +static zmk_hid_boot_report_t *boot_report_rollover(uint8_t modifiers) { + boot_report.modifiers = modifiers; + for (int i = 0; i < HID_BOOT_KEY_LEN; i++) { + boot_report.keys[i] = HID_ERROR_ROLLOVER; + } + return &boot_report; +} + +#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ + #if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) #define TOGGLE_KEYBOARD(code, val) WRITE_BIT(keyboard_report.body.keys[code / 8], code % 8, val) +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) +zmk_hid_boot_report_t *zmk_hid_get_boot_report() { + if (keys_held > HID_BOOT_KEY_LEN) { + return boot_report_rollover(keyboard_report.body.modifiers); + } + + boot_report.modifiers = keyboard_report.body.modifiers; + memset(&boot_report.keys, 0, HID_BOOT_KEY_LEN); + int ix = 0; + uint8_t base_code = 0; + for (int i = 0; i < (ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1) / 8; ++i) { + if (ix == keys_held) { + break; + } + if (!keyboard_report.body.keys[i]) { + continue; + } + base_code = i * 8; + for (int j = 0; j < 8; ++j) { + if (keyboard_report.body.keys[i] & BIT(j)) { + boot_report.keys[ix++] = base_code + j; + } + } + } + return &boot_report; +} +#endif + static inline int select_keyboard_usage(zmk_key_t usage) { if (usage > ZMK_HID_KEYBOARD_NKRO_MAX_USAGE) { return -EINVAL; } TOGGLE_KEYBOARD(usage, 1); +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + ++keys_held; +#endif return 0; } @@ -102,6 +152,9 @@ static inline int deselect_keyboard_usage(zmk_key_t usage) { return -EINVAL; } TOGGLE_KEYBOARD(usage, 0); +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + --keys_held; +#endif return 0; } @@ -125,13 +178,52 @@ static inline bool check_keyboard_usage(zmk_key_t usage) { } \ } +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) +zmk_hid_boot_report_t *zmk_hid_get_boot_report() { + if (keys_held > HID_BOOT_KEY_LEN) { + return boot_report_rollover(keyboard_report.body.modifiers); + } + +#if CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE != HID_BOOT_KEY_LEN + // Form a boot report from a report of different size. + + boot_report.modifiers = keyboard_report.body.modifiers; + + int out = 0; + for (int i = 0; i < CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE; i++) { + uint8_t key = keyboard_report.body.keys[i]; + if (key) { + boot_report.keys[out++] = key; + if (out == keys_held) { + break; + } + } + } + + while (out < HID_BOOT_KEY_LEN) { + boot_report.keys[out++] = 0; + } + + return &boot_report; +#else + return &keyboard_report.body; +#endif /* CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE != HID_BOOT_KEY_LEN */ +} +#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ + static inline int select_keyboard_usage(zmk_key_t usage) { TOGGLE_KEYBOARD(0U, usage); +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + ++keys_held; +#endif return 0; } static inline int deselect_keyboard_usage(zmk_key_t usage) { TOGGLE_KEYBOARD(usage, 0U); +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + --keys_held; +#endif return 0; } diff --git a/app/src/usb.c b/app/src/usb.c index cf04ef46..9d27900c 100644 --- a/app/src/usb.c +++ b/app/src/usb.c @@ -15,6 +15,8 @@ #include #include +#include + LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); static enum usb_dc_status_code usb_status = USB_DC_UNKNOWN; @@ -35,6 +37,7 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state() { case USB_DC_CONFIGURED: case USB_DC_RESUME: case USB_DC_CLEAR_HALT: + case USB_DC_SOF: return ZMK_USB_CONN_HID; case USB_DC_DISCONNECTED: @@ -47,6 +50,17 @@ enum zmk_usb_conn_state zmk_usb_get_conn_state() { } void usb_status_cb(enum usb_dc_status_code status, const uint8_t *params) { + // Start-of-frame events are too frequent and noisy to notify, and they're + // not used within ZMK + if (status == USB_DC_SOF) { + return; + } + +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + if (status == USB_DC_RESET) { + zmk_usb_hid_set_protocol(HID_PROTOCOL_REPORT); + } +#endif usb_status = status; k_work_submit(&usb_status_notifier_work); }; diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index f46c70a0..c72bb36c 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -23,11 +23,75 @@ static K_SEM_DEFINE(hid_sem, 1, 1); static void in_ready_cb(const struct device *dev) { k_sem_give(&hid_sem); } +#define HID_GET_REPORT_TYPE_MASK 0xff00 +#define HID_GET_REPORT_ID_MASK 0x00ff + +#define HID_REPORT_TYPE_INPUT 0x100 +#define HID_REPORT_TYPE_OUTPUT 0x200 +#define HID_REPORT_TYPE_FEATURE 0x300 + +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) +static uint8_t hid_protocol = HID_PROTOCOL_REPORT; + +static void set_proto_cb(const struct device *dev, uint8_t protocol) { hid_protocol = protocol; } + +void zmk_usb_hid_set_protocol(uint8_t protocol) { hid_protocol = protocol; } +#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ + +static uint8_t *get_keyboard_report(size_t *len) { + if (hid_protocol == HID_PROTOCOL_REPORT) { + struct zmk_hid_keyboard_report *report = zmk_hid_get_keyboard_report(); + *len = sizeof(*report); + return (uint8_t *)report; + } +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + zmk_hid_boot_report_t *boot_report = zmk_hid_get_boot_report(); + *len = sizeof(*boot_report); + return (uint8_t *)boot_report; +#endif +} + +static int get_report_cb(const struct device *dev, struct usb_setup_packet *setup, int32_t *len, + uint8_t **data) { + + /* + * 7.2.1 of the HID v1.11 spec is unclear about handling requests for reports that do not exist + * For requested reports that aren't input reports, return -ENOTSUP like the Zephyr subsys does + */ + if ((setup->wValue & HID_GET_REPORT_TYPE_MASK) != HID_REPORT_TYPE_INPUT) { + LOG_ERR("Unsupported report type %d requested", (setup->wValue & HID_GET_REPORT_TYPE_MASK) + << 8); + return -ENOTSUP; + } + + switch (setup->wValue & HID_GET_REPORT_ID_MASK) { + case ZMK_HID_REPORT_ID_KEYBOARD: { + *data = get_keyboard_report(len); + break; + } + case ZMK_HID_REPORT_ID_CONSUMER: { + struct zmk_hid_consumer_report *report = zmk_hid_get_consumer_report(); + *data = (uint8_t *)report; + *len = sizeof(*report); + break; + } + default: + LOG_ERR("Invalid report ID %d requested", setup->wValue & HID_GET_REPORT_ID_MASK); + return -EINVAL; + } + + return 0; +} + static const struct hid_ops ops = { +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + .protocol_change = set_proto_cb, +#endif .int_in_ready = in_ready_cb, + .get_report = get_report_cb, }; -int zmk_usb_hid_send_report(const uint8_t *report, size_t len) { +static int zmk_usb_hid_send_report(const uint8_t *report, size_t len) { switch (zmk_usb_get_status()) { case USB_DC_SUSPEND: return usb_wakeup_request(); @@ -48,6 +112,23 @@ int zmk_usb_hid_send_report(const uint8_t *report, size_t len) { } } +int zmk_usb_hid_send_keyboard_report() { + size_t len; + uint8_t *report = get_keyboard_report(&len); + return zmk_usb_hid_send_report(report, len); +} + +int zmk_usb_hid_send_consumer_report() { +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + if (hid_protocol == HID_PROTOCOL_BOOT) { + return -ENOTSUP; + } +#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ + + struct zmk_hid_consumer_report *report = zmk_hid_get_consumer_report(); + return zmk_usb_hid_send_report((uint8_t *)report, sizeof(*report)); +} + static int zmk_usb_hid_init(const struct device *_arg) { hid_dev = device_get_binding("HID_0"); if (hid_dev == NULL) { @@ -56,6 +137,11 @@ static int zmk_usb_hid_init(const struct device *_arg) { } usb_hid_register_device(hid_dev, zmk_hid_report_desc, sizeof(zmk_hid_report_desc), &ops); + +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + usb_hid_set_proto_code(hid_dev, HID_BOOT_IFACE_CODE_KEYBOARD); +#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ + usb_hid_init(hid_dev); return 0; From c1bf35ce1de4b7d99c034300c9a813a0a3d11669 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 10 Nov 2023 22:40:55 -0800 Subject: [PATCH 484/494] feat(build): Add support for artifact-name in build.yaml --- .github/workflows/build-user-config.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index c1a97b4d..5aacadca 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -55,12 +55,14 @@ jobs: - name: Prepare variables shell: sh -x {0} env: + board: ${{ matrix.board }} shield: ${{ matrix.shield }} + artifact_name: ${{ matrix.artifact-name }} run: | echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}" >> $GITHUB_ENV - echo "display_name=${shield:+$shield - }${{ matrix.board }}" >> $GITHUB_ENV - echo "artifact_name=${shield:+$shield-}${{ matrix.board }}-zmk" >> $GITHUB_ENV + echo "display_name=${shield:+$shield - }${board}" >> $GITHUB_ENV + echo "artifact_name=${artifact_name:-\"${shield:+$shield-}${board}-zmk\"}" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v3 From 2554b5c88f4d304f311d9f29017ac6fbe948ca7a Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 10 Nov 2023 22:08:37 -0800 Subject: [PATCH 485/494] fix(docs): Update boards in build examples to common+uf2 ones --- docs/docs/development/build-flash.md | 6 +++--- docs/docs/development/new-shield.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs/development/build-flash.md b/docs/docs/development/build-flash.md index 94bbcdf9..0243983c 100644 --- a/docs/docs/development/build-flash.md +++ b/docs/docs/development/build-flash.md @@ -65,7 +65,7 @@ west build -b planck_rev6 When building for a new board and/or shield after having built one previously, you may need to enable the pristine build option. This option removes all existing files in the build directory before regenerating them, and can be enabled by adding either --pristine or -p to the command: ```sh -west build -p -b proton_c -- -DSHIELD=kyria_left +west build -p -b nice_nano_v2 -- -DSHIELD=kyria_left ``` ### Building For Split Keyboards @@ -77,13 +77,13 @@ For split keyboards, you will have to build and flash each side separately the f By default, the `build` command outputs a single .uf2 file named `zmk.uf2` so building left and then right immediately after will overwrite your left firmware. In addition, you will need to pristine build each side to ensure the correct files are used. To avoid having to pristine build every time and separate the left and right build files, we recommend setting up separate build directories for each half. You can do this by using the `-d` parameter and first building left into `build/left`: ```sh -west build -d build/left -b nice_nano -- -DSHIELD=kyria_left +west build -d build/left -b nice_nano_v2 -- -DSHIELD=kyria_left ``` and then building right into `build/right`: ```sh -west build -d build/right -b nice_nano -- -DSHIELD=kyria_right +west build -d build/right -b nice_nano_v2 -- -DSHIELD=kyria_right ``` This produces `left` and `right` subfolders under the `build` directory and two separate .uf2 files. For future work on a specific half, use the `-d` parameter again to ensure you are building into the correct location. diff --git a/docs/docs/development/new-shield.md b/docs/docs/development/new-shield.md index 07711229..7f6a8644 100644 --- a/docs/docs/development/new-shield.md +++ b/docs/docs/development/new-shield.md @@ -493,7 +493,7 @@ Once you've fully created the new keyboard shield definition, you should be able to test with a build command like: ```sh -west build --pristine -b proton_c -- -DSHIELD=my_board +west build --pristine -b nice_nano_v2 -- -DSHIELD=my_board ``` The above build command generates `build/zephyr/zmk.uf2`. If your board From a5c3edd51b46f45a7fdf9ff157f69296d7a9fddb Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 10 Nov 2023 22:22:05 -0800 Subject: [PATCH 486/494] refactor(docs): Remove local build section in customization --- docs/docs/customization.md | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/docs/docs/customization.md b/docs/docs/customization.md index 4f75e743..a68e8595 100644 --- a/docs/docs/customization.md +++ b/docs/docs/customization.md @@ -11,15 +11,15 @@ This makes flashing ZMK to your keyboard much easier, especially because you don By default, the `zmk-config` folder should contain two files: -- `.conf` -- `.keymap` +- `.conf` +- `.keymap` However, your config folder can also be modified to include a `boards/` directory for keymaps and configurations for multiple boards/shields outside of the default keyboard setting definitions. ## Configuration Changes -The setup script creates a `config/.conf` file that allows you to add additional configuration options to +The setup script creates a `config/.conf` file that allows you to add additional configuration options to control what features and options are built into your firmware. Opening that file with your text editor will allow you to see the various config settings that can be commented/uncommented to modify how your firmware is built. @@ -27,7 +27,7 @@ Refer to the [Configuration](/docs/config) documentation for more details on thi ## Keymap -Once you have the basic user config completed, you can find the keymap file in `config/.keymap` and customize from there. +Once you have the basic user config completed, you can find the keymap file in `config/.keymap` and customize from there. Refer to the [Keymap](features/keymaps.md) documentation to learn more. ## Publishing @@ -39,18 +39,11 @@ GitHub Actions job to build your firmware which you can download once it complet If you need to, a review of [Learn The Basics Of Git In Under 10 Minutes](https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91/) will help you get these steps right. ::: -## Building from a local `zmk` fork using `zmk-config` - -[As outlined here](development/build-flash.md), firmware comes in the form of .uf2 files, which can be built locally using the command `west build`. Normally, -`west build` will default to using the in-tree .keymap and .conf files found in your local copy of the `zmk` repository. However, you can append the command, `-DZMK_CONFIG="C:/the/absolute/path/config"` to `west build` in order to use the contents of your `zmk-config` folder instead of the -default keyboard settings. -**Notice that this path should point to the folder labelled `config` within your `zmk-config` folder.** - -For instance, building kyria firmware from a user `myUser`'s `zmk-config` folder on Windows 10 may look something like this: - -```bash -west build -b nice_nano -- -DSHIELD=kyria_left -DZMK_CONFIG="C:/Users/myUser/Documents/Github/zmk-config/config" -``` +:::note +It is also possible to build firmware locally on your computer by following the [toolchain setup](development/setup.md) and +[building instructions](development/build-flash.md), which includes pointers to +[building using your `zmk-config` folder](development/build-flash.md#building-from-zmk-config-folder). +::: ## Flashing Your Changes From 7b4b5d4ff20957c3cba0d3e3eb679dd45c3181f5 Mon Sep 17 00:00:00 2001 From: Cem Aksoylar Date: Fri, 10 Nov 2023 22:01:31 -0800 Subject: [PATCH 487/494] fix(docs): Fix debouncing driver support note --- docs/docs/features/debouncing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/features/debouncing.md b/docs/docs/features/debouncing.md index cbea7092..38ded2d7 100644 --- a/docs/docs/features/debouncing.md +++ b/docs/docs/features/debouncing.md @@ -20,7 +20,7 @@ socket or using some sharp tweezers to bend the contacts back together. ## Debounce Configuration :::note -Currently only the `zmk,kscan-gpio-matrix` driver supports these options. The other drivers have not yet been updated to use the new debouncing code. +Currently the `zmk,kscan-gpio-matrix` and `zmk,kscan-gpio-direct` [drivers](../config/kscan.md) supports these options, while `zmk,kscan-gpio-demux` driver does not. ::: ### Global Options From 964c54139dcc5fca466eb2a6dc72b4092c7152a0 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Mon, 13 Nov 2023 11:00:28 -0800 Subject: [PATCH 488/494] fix(usb): Tweak how ZMK_USB gets enabled. * Previous version of multiple overrides of the default value of ZMK_USB were problematic. Move to using board _defconfig files for the defaults for those, along with proper `depends on` for ZMK_USB that accounts for split and split roles. --- app/Kconfig | 13 ++++++++----- app/boards/arm/bdn9/Kconfig.defconfig | 3 --- app/boards/arm/bdn9/bdn9_rev2_defconfig | 1 + app/boards/arm/bluemicro840/Kconfig.defconfig | 6 ------ .../arm/bluemicro840/bluemicro840_v1_defconfig | 3 +++ app/boards/arm/bt60/Kconfig.defconfig | 6 ------ app/boards/arm/bt60/bt60_v1_defconfig | 3 +++ app/boards/arm/bt60/bt60_v1_hs_defconfig | 3 +++ app/boards/arm/ckp/Kconfig.defconfig | 6 ------ app/boards/arm/ckp/bt60_v2_defconfig | 3 +++ app/boards/arm/ckp/bt65_v1_defconfig | 3 +++ app/boards/arm/ckp/bt75_v1_defconfig | 3 +++ app/boards/arm/corneish_zen/Kconfig.defconfig | 6 ------ .../arm/corneish_zen/corneish_zen_v1_left_defconfig | 3 +++ .../corneish_zen/corneish_zen_v1_right_defconfig | 3 +++ .../arm/corneish_zen/corneish_zen_v2_left_defconfig | 3 +++ .../corneish_zen/corneish_zen_v2_right_defconfig | 3 +++ app/boards/arm/dz60rgb/Kconfig.defconfig | 3 --- app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig | 2 ++ app/boards/arm/ferris/Kconfig.defconfig | 3 --- app/boards/arm/kbdfans_tofu65/Kconfig.defconfig | 3 --- .../arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig | 2 ++ app/boards/arm/mikoto/Kconfig.defconfig | 6 ------ app/boards/arm/mikoto/mikoto_520_defconfig | 3 +++ app/boards/arm/nice60/Kconfig.defconfig | 6 ------ app/boards/arm/nice60/nice60_defconfig | 4 ++++ app/boards/arm/nice_nano/Kconfig.defconfig | 6 ------ app/boards/arm/nice_nano/nice_nano_defconfig | 3 +++ app/boards/arm/nice_nano/nice_nano_v2_defconfig | 3 +++ app/boards/arm/nrf52840_m2/Kconfig.defconfig | 6 ------ app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig | 3 +++ app/boards/arm/nrfmicro/Kconfig.defconfig | 6 ------ app/boards/arm/nrfmicro/nrfmicro_11_defconfig | 3 +++ .../arm/nrfmicro/nrfmicro_11_flipped_defconfig | 3 +++ app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig | 3 +++ app/boards/arm/nrfmicro/nrfmicro_13_defconfig | 3 +++ app/boards/arm/pillbug/Kconfig.defconfig | 6 ------ app/boards/arm/pillbug/pillbug_defconfig | 3 +++ app/boards/arm/planck/Kconfig.defconfig | 3 --- app/boards/arm/planck/planck_rev6_defconfig | 2 ++ app/boards/arm/preonic/Kconfig.defconfig | 3 --- app/boards/arm/preonic/preonic_rev3_defconfig | 2 ++ app/boards/arm/proton_c/Kconfig.defconfig | 3 --- app/boards/arm/proton_c/proton_c_defconfig | 1 + app/boards/arm/puchi_ble/Kconfig.defconfig | 6 ------ app/boards/arm/puchi_ble/puchi_ble_v1_defconfig | 3 +++ app/boards/arm/s40nc/Kconfig.defconfig | 6 ------ app/boards/arm/s40nc/s40nc_defconfig | 3 +++ app/boards/shields/nibble/Kconfig.defconfig | 4 ---- app/src/split/bluetooth/Kconfig | 3 --- 50 files changed, 85 insertions(+), 105 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 798cb785..282339e3 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -91,10 +91,18 @@ menu "Output Types" config ZMK_USB bool "USB" + depends on (!ZMK_SPLIT || (ZMK_SPLIT && ZMK_SPLIT_ROLE_CENTRAL)) select USB select USB_DEVICE_STACK select USB_DEVICE_HID +config ZMK_USB_BOOT + bool "USB Boot Protocol Support" + default y + depends on ZMK_USB + select USB_HID_BOOT_PROTOCOL + select USB_DEVICE_SOF + if ZMK_USB config USB_NUMOF_EP_WRITE_RETRIES @@ -103,11 +111,6 @@ config USB_NUMOF_EP_WRITE_RETRIES config USB_HID_POLL_INTERVAL_MS default 1 -config ZMK_USB_BOOT - bool "USB Boot Protocol Support" - default y - select USB_HID_BOOT_PROTOCOL - select USB_DEVICE_SOF #ZMK_USB endif diff --git a/app/boards/arm/bdn9/Kconfig.defconfig b/app/boards/arm/bdn9/Kconfig.defconfig index d1c82811..96b7fe55 100644 --- a/app/boards/arm/bdn9/Kconfig.defconfig +++ b/app/boards/arm/bdn9/Kconfig.defconfig @@ -11,9 +11,6 @@ config BOARD config ZMK_KEYBOARD_NAME default "BDN9 Rev2" -config ZMK_USB - default y - config ZMK_RGB_UNDERGLOW select SPI select WS2812_STRIP diff --git a/app/boards/arm/bdn9/bdn9_rev2_defconfig b/app/boards/arm/bdn9/bdn9_rev2_defconfig index 24dddb93..05087eeb 100644 --- a/app/boards/arm/bdn9/bdn9_rev2_defconfig +++ b/app/boards/arm/bdn9/bdn9_rev2_defconfig @@ -23,3 +23,4 @@ CONFIG_HEAP_MEM_POOL_SIZE=1024 # clock configuration CONFIG_CLOCK_CONTROL=y +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/bluemicro840/Kconfig.defconfig b/app/boards/arm/bluemicro840/Kconfig.defconfig index 732805ae..ff61ec92 100644 --- a/app/boards/arm/bluemicro840/Kconfig.defconfig +++ b/app/boards/arm/bluemicro840/Kconfig.defconfig @@ -18,10 +18,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - endif # BOARD_BLUEMICRO840_V1 diff --git a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig index 99d51a94..3e13e77d 100644 --- a/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig +++ b/app/boards/arm/bluemicro840/bluemicro840_v1_defconfig @@ -21,3 +21,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/bt60/Kconfig.defconfig b/app/boards/arm/bt60/Kconfig.defconfig index e7cf1a48..c44901bd 100644 --- a/app/boards/arm/bt60/Kconfig.defconfig +++ b/app/boards/arm/bt60/Kconfig.defconfig @@ -19,12 +19,6 @@ endif # USB config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - config ZMK_KEYBOARD_NAME default "BT60" diff --git a/app/boards/arm/bt60/bt60_v1_defconfig b/app/boards/arm/bt60/bt60_v1_defconfig index 813dcece..04adb8a3 100644 --- a/app/boards/arm/bt60/bt60_v1_defconfig +++ b/app/boards/arm/bt60/bt60_v1_defconfig @@ -23,3 +23,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/bt60/bt60_v1_hs_defconfig b/app/boards/arm/bt60/bt60_v1_hs_defconfig index f2327fd3..f16d82ac 100644 --- a/app/boards/arm/bt60/bt60_v1_hs_defconfig +++ b/app/boards/arm/bt60/bt60_v1_hs_defconfig @@ -23,3 +23,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/ckp/Kconfig.defconfig b/app/boards/arm/ckp/Kconfig.defconfig index d5bf4ded..376d4619 100644 --- a/app/boards/arm/ckp/Kconfig.defconfig +++ b/app/boards/arm/ckp/Kconfig.defconfig @@ -25,10 +25,4 @@ endif # USB config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - endif # BOARD_BT60_V2 || BOARD_BT65_V1 || BOARD_BT75_V1 diff --git a/app/boards/arm/ckp/bt60_v2_defconfig b/app/boards/arm/ckp/bt60_v2_defconfig index f6dc7e09..fd1ae985 100644 --- a/app/boards/arm/ckp/bt60_v2_defconfig +++ b/app/boards/arm/ckp/bt60_v2_defconfig @@ -36,3 +36,6 @@ CONFIG_WS2812_STRIP=y CONFIG_SPI=y CONFIG_BT_CTLR_TX_PWR_PLUS_8=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y diff --git a/app/boards/arm/ckp/bt65_v1_defconfig b/app/boards/arm/ckp/bt65_v1_defconfig index e40ae2db..be5f17eb 100644 --- a/app/boards/arm/ckp/bt65_v1_defconfig +++ b/app/boards/arm/ckp/bt65_v1_defconfig @@ -36,3 +36,6 @@ CONFIG_WS2812_STRIP=y CONFIG_SPI=y CONFIG_BT_CTLR_TX_PWR_PLUS_8=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/ckp/bt75_v1_defconfig b/app/boards/arm/ckp/bt75_v1_defconfig index 510d6994..b4d85338 100644 --- a/app/boards/arm/ckp/bt75_v1_defconfig +++ b/app/boards/arm/ckp/bt75_v1_defconfig @@ -36,3 +36,6 @@ CONFIG_WS2812_STRIP=y CONFIG_SPI=y CONFIG_BT_CTLR_TX_PWR_PLUS_8=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/corneish_zen/Kconfig.defconfig b/app/boards/arm/corneish_zen/Kconfig.defconfig index feab3eca..f3cc959e 100644 --- a/app/boards/arm/corneish_zen/Kconfig.defconfig +++ b/app/boards/arm/corneish_zen/Kconfig.defconfig @@ -25,12 +25,6 @@ config ZMK_SPLIT config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - if USB config USB_NRFX diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig index a71ac680..d7382556 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_left_defconfig @@ -39,6 +39,9 @@ CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 diff --git a/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig index f099392f..5284159d 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v1_right_defconfig @@ -39,6 +39,9 @@ CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig index 3b7b4d9e..29a5f878 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_left_defconfig @@ -35,6 +35,9 @@ CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 diff --git a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig index b361b08d..506aa67e 100644 --- a/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig +++ b/app/boards/arm/corneish_zen/corneish_zen_v2_right_defconfig @@ -35,6 +35,9 @@ CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_30PPM=y +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + # enable display drivers CONFIG_ZMK_DISPLAY_WORK_QUEUE_DEDICATED=y CONFIG_ZMK_DISPLAY_DEDICATED_THREAD_STACK_SIZE=2048 diff --git a/app/boards/arm/dz60rgb/Kconfig.defconfig b/app/boards/arm/dz60rgb/Kconfig.defconfig index 2e30e3d0..6e059256 100644 --- a/app/boards/arm/dz60rgb/Kconfig.defconfig +++ b/app/boards/arm/dz60rgb/Kconfig.defconfig @@ -8,7 +8,4 @@ if BOARD_DZ60RGB_REV1 config ZMK_KEYBOARD_NAME default "DZ60RGB Rev 1" -config ZMK_USB - default y - endif # BOARD_DZ60RGB_REV1 diff --git a/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig b/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig index 33840f96..53bc0e11 100644 --- a/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig +++ b/app/boards/arm/dz60rgb/dz60rgb_rev1_defconfig @@ -25,3 +25,5 @@ CONFIG_CLOCK_STM32_PLL_MULTIPLIER=9 CONFIG_CLOCK_STM32_AHB_PRESCALER=1 CONFIG_CLOCK_STM32_APB1_PRESCALER=2 CONFIG_CLOCK_STM32_APB2_PRESCALER=1 + +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/ferris/Kconfig.defconfig b/app/boards/arm/ferris/Kconfig.defconfig index 7cf43bcb..420ea01f 100644 --- a/app/boards/arm/ferris/Kconfig.defconfig +++ b/app/boards/arm/ferris/Kconfig.defconfig @@ -11,9 +11,6 @@ config BOARD config ZMK_KEYBOARD_NAME default "Ferris rev 0.2" -config ZMK_USB - default y - config ZMK_KSCAN_MATRIX_POLLING default y diff --git a/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig index 993d5142..0444f510 100644 --- a/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig +++ b/app/boards/arm/kbdfans_tofu65/Kconfig.defconfig @@ -9,7 +9,4 @@ config ZMK_KEYBOARD_NAME config RP2_FLASH_W25Q080 default y -config ZMK_USB - default y - endif # BOARD_KBDFANS_TOFU65_V2 diff --git a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig index cf546683..57014acf 100644 --- a/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig +++ b/app/boards/arm/kbdfans_tofu65/kbdfans_tofu65_v2_defconfig @@ -18,3 +18,5 @@ CONFIG_USE_DT_CODE_PARTITION=y # Output UF2 by default, native bootloader supports it. CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/mikoto/Kconfig.defconfig b/app/boards/arm/mikoto/Kconfig.defconfig index 8c7746db..8117cc87 100644 --- a/app/boards/arm/mikoto/Kconfig.defconfig +++ b/app/boards/arm/mikoto/Kconfig.defconfig @@ -21,12 +21,6 @@ endif # USB config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - config PINMUX default y diff --git a/app/boards/arm/mikoto/mikoto_520_defconfig b/app/boards/arm/mikoto/mikoto_520_defconfig index c755633e..354fa56a 100644 --- a/app/boards/arm/mikoto/mikoto_520_defconfig +++ b/app/boards/arm/mikoto/mikoto_520_defconfig @@ -21,3 +21,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nice60/Kconfig.defconfig b/app/boards/arm/nice60/Kconfig.defconfig index f3347df9..76818e87 100644 --- a/app/boards/arm/nice60/Kconfig.defconfig +++ b/app/boards/arm/nice60/Kconfig.defconfig @@ -16,10 +16,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - endif # BOARD_NICE60 diff --git a/app/boards/arm/nice60/nice60_defconfig b/app/boards/arm/nice60/nice60_defconfig index 48936a04..fabcb7ed 100644 --- a/app/boards/arm/nice60/nice60_defconfig +++ b/app/boards/arm/nice60/nice60_defconfig @@ -28,3 +28,7 @@ CONFIG_WS2812_STRIP=y CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=160 CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 + + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nice_nano/Kconfig.defconfig b/app/boards/arm/nice_nano/Kconfig.defconfig index ada59dd9..63102a57 100644 --- a/app/boards/arm/nice_nano/Kconfig.defconfig +++ b/app/boards/arm/nice_nano/Kconfig.defconfig @@ -16,10 +16,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - endif # BOARD_NICE_NANO || BOARD_NICE_NANO_V2 diff --git a/app/boards/arm/nice_nano/nice_nano_defconfig b/app/boards/arm/nice_nano/nice_nano_defconfig index a837b7d2..6b7fcab2 100644 --- a/app/boards/arm/nice_nano/nice_nano_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_defconfig @@ -22,3 +22,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nice_nano/nice_nano_v2_defconfig b/app/boards/arm/nice_nano/nice_nano_v2_defconfig index 667cf71a..6b5044e5 100644 --- a/app/boards/arm/nice_nano/nice_nano_v2_defconfig +++ b/app/boards/arm/nice_nano/nice_nano_v2_defconfig @@ -22,3 +22,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_BLE=y +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/nrf52840_m2/Kconfig.defconfig b/app/boards/arm/nrf52840_m2/Kconfig.defconfig index 50a049bb..a5227fc0 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig.defconfig @@ -16,10 +16,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - endif # BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig index b7671ba9..93eef9e6 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig @@ -20,3 +20,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig index 7d752ac6..659e9c5c 100644 --- a/app/boards/arm/nrfmicro/Kconfig.defconfig +++ b/app/boards/arm/nrfmicro/Kconfig.defconfig @@ -18,12 +18,6 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - config PINMUX default y diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig index b51929b0..5ba4d6e1 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_defconfig @@ -23,3 +23,6 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig index 335a2d75..31cbfc9a 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_11_flipped_defconfig @@ -23,3 +23,6 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig index 4af1ff86..f459f356 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_52833_defconfig @@ -23,3 +23,6 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig index 43ba40e2..9ffb2766 100644 --- a/app/boards/arm/nrfmicro/nrfmicro_13_defconfig +++ b/app/boards/arm/nrfmicro/nrfmicro_13_defconfig @@ -23,3 +23,6 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/pillbug/Kconfig.defconfig b/app/boards/arm/pillbug/Kconfig.defconfig index 8657f8ae..48427ed3 100644 --- a/app/boards/arm/pillbug/Kconfig.defconfig +++ b/app/boards/arm/pillbug/Kconfig.defconfig @@ -16,10 +16,4 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - endif # BOARD_PILLBUG diff --git a/app/boards/arm/pillbug/pillbug_defconfig b/app/boards/arm/pillbug/pillbug_defconfig index 9781cf99..9ec72c41 100644 --- a/app/boards/arm/pillbug/pillbug_defconfig +++ b/app/boards/arm/pillbug/pillbug_defconfig @@ -23,3 +23,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/planck/Kconfig.defconfig b/app/boards/arm/planck/Kconfig.defconfig index d1304da0..69dea84c 100644 --- a/app/boards/arm/planck/Kconfig.defconfig +++ b/app/boards/arm/planck/Kconfig.defconfig @@ -8,9 +8,6 @@ if BOARD_PLANCK_REV6 config ZMK_KEYBOARD_NAME default "Planck V6" -config ZMK_USB - default y - config ZMK_KSCAN_MATRIX_POLLING default y diff --git a/app/boards/arm/planck/planck_rev6_defconfig b/app/boards/arm/planck/planck_rev6_defconfig index a78ea45d..74050f3d 100644 --- a/app/boards/arm/planck/planck_rev6_defconfig +++ b/app/boards/arm/planck/planck_rev6_defconfig @@ -15,3 +15,5 @@ CONFIG_GPIO=y # clock configuration CONFIG_CLOCK_CONTROL=y + +CONFIG_ZMK_USB=y diff --git a/app/boards/arm/preonic/Kconfig.defconfig b/app/boards/arm/preonic/Kconfig.defconfig index 186c88bc..86b2e3d0 100644 --- a/app/boards/arm/preonic/Kconfig.defconfig +++ b/app/boards/arm/preonic/Kconfig.defconfig @@ -8,9 +8,6 @@ if BOARD_PREONIC_REV3 config ZMK_KEYBOARD_NAME default "Preonic V3" -config ZMK_USB - default y - config ZMK_KSCAN_MATRIX_POLLING default y diff --git a/app/boards/arm/preonic/preonic_rev3_defconfig b/app/boards/arm/preonic/preonic_rev3_defconfig index ab19d10f..e063827a 100644 --- a/app/boards/arm/preonic/preonic_rev3_defconfig +++ b/app/boards/arm/preonic/preonic_rev3_defconfig @@ -13,3 +13,5 @@ CONFIG_GPIO=y # clock configuration CONFIG_CLOCK_CONTROL=y + +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/proton_c/Kconfig.defconfig b/app/boards/arm/proton_c/Kconfig.defconfig index f5089119..eed4b830 100644 --- a/app/boards/arm/proton_c/Kconfig.defconfig +++ b/app/boards/arm/proton_c/Kconfig.defconfig @@ -8,7 +8,4 @@ if BOARD_QMK_PROTON_C config BOARD default "proton_c" -config ZMK_USB - default y - endif # BOARD_QMK_PROTON_C diff --git a/app/boards/arm/proton_c/proton_c_defconfig b/app/boards/arm/proton_c/proton_c_defconfig index 32e1ade9..c552bf15 100644 --- a/app/boards/arm/proton_c/proton_c_defconfig +++ b/app/boards/arm/proton_c/proton_c_defconfig @@ -17,3 +17,4 @@ CONFIG_GPIO=y # clock configuration CONFIG_CLOCK_CONTROL=y +CONFIG_ZMK_USB=y \ No newline at end of file diff --git a/app/boards/arm/puchi_ble/Kconfig.defconfig b/app/boards/arm/puchi_ble/Kconfig.defconfig index c4fca8e1..3533104b 100644 --- a/app/boards/arm/puchi_ble/Kconfig.defconfig +++ b/app/boards/arm/puchi_ble/Kconfig.defconfig @@ -16,12 +16,6 @@ endif # USB_DEVICE_STACK config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - config PINMUX default y diff --git a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig index 1adb9217..ab197df0 100644 --- a/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig +++ b/app/boards/arm/puchi_ble/puchi_ble_v1_defconfig @@ -25,3 +25,6 @@ CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y CONFIG_CLOCK_CONTROL_NRF=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/arm/s40nc/Kconfig.defconfig b/app/boards/arm/s40nc/Kconfig.defconfig index 11e62cf5..f892f392 100644 --- a/app/boards/arm/s40nc/Kconfig.defconfig +++ b/app/boards/arm/s40nc/Kconfig.defconfig @@ -19,10 +19,4 @@ endif # USB config BT_CTLR default BT -config ZMK_BLE - default y - -config ZMK_USB - default y - endif # BOARD_S40NC diff --git a/app/boards/arm/s40nc/s40nc_defconfig b/app/boards/arm/s40nc/s40nc_defconfig index 31972781..b523ceb8 100644 --- a/app/boards/arm/s40nc/s40nc_defconfig +++ b/app/boards/arm/s40nc/s40nc_defconfig @@ -20,3 +20,6 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y + +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y \ No newline at end of file diff --git a/app/boards/shields/nibble/Kconfig.defconfig b/app/boards/shields/nibble/Kconfig.defconfig index 31ac7cfe..19bddec7 100644 --- a/app/boards/shields/nibble/Kconfig.defconfig +++ b/app/boards/shields/nibble/Kconfig.defconfig @@ -6,10 +6,6 @@ if SHIELD_NIBBLE config ZMK_KEYBOARD_NAME default "NIBBLE" -config ZMK_USB - default y - - if ZMK_DISPLAY config I2C diff --git a/app/src/split/bluetooth/Kconfig b/app/src/split/bluetooth/Kconfig index 5919010b..858e7308 100644 --- a/app/src/split/bluetooth/Kconfig +++ b/app/src/split/bluetooth/Kconfig @@ -62,9 +62,6 @@ config ZMK_SPLIT_BLE_PERIPHERAL_POSITION_QUEUE_SIZE int "Max number of key position state events to queue to send to the central" default 10 -config ZMK_USB - default n - config BT_MAX_PAIRED default 1 From afe65ead9c0f1418fa34bfa93325d0cce33c6c2c Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Mon, 13 Nov 2023 16:50:00 -0500 Subject: [PATCH 489/494] Revert "feat(build): Add support for artifact-name in build.yaml" This reverts commit c1bf35ce1de4b7d99c034300c9a813a0a3d11669. --- .github/workflows/build-user-config.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-user-config.yml b/.github/workflows/build-user-config.yml index 5aacadca..c1a97b4d 100644 --- a/.github/workflows/build-user-config.yml +++ b/.github/workflows/build-user-config.yml @@ -55,14 +55,12 @@ jobs: - name: Prepare variables shell: sh -x {0} env: - board: ${{ matrix.board }} shield: ${{ matrix.shield }} - artifact_name: ${{ matrix.artifact-name }} run: | echo "zephyr_version=${ZEPHYR_VERSION}" >> $GITHUB_ENV echo "extra_cmake_args=${shield:+-DSHIELD=\"$shield\"}" >> $GITHUB_ENV - echo "display_name=${shield:+$shield - }${board}" >> $GITHUB_ENV - echo "artifact_name=${artifact_name:-\"${shield:+$shield-}${board}-zmk\"}" >> $GITHUB_ENV + echo "display_name=${shield:+$shield - }${{ matrix.board }}" >> $GITHUB_ENV + echo "artifact_name=${shield:+$shield-}${{ matrix.board }}-zmk" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v3 From 2a1904e184c5802a50c13f2d0ceca63df7c1b7df Mon Sep 17 00:00:00 2001 From: Chris Andreae Date: Tue, 14 Nov 2023 16:08:58 +0900 Subject: [PATCH 490/494] feat(boards): Add Glove80 to boards * Add board definition for MoErgo Glove80 --- app/boards/arm/glove80/CMakeLists.txt | 3 + app/boards/arm/glove80/Kconfig | 8 ++ app/boards/arm/glove80/Kconfig.board | 10 ++ app/boards/arm/glove80/Kconfig.defconfig | 65 ++++++++++ app/boards/arm/glove80/board.cmake | 6 + app/boards/arm/glove80/glove80.dtsi | 107 ++++++++++++++++ app/boards/arm/glove80/glove80.keymap | 114 ++++++++++++++++++ app/boards/arm/glove80/glove80.yaml | 19 +++ app/boards/arm/glove80/glove80.zmk.yml | 16 +++ .../arm/glove80/glove80_lh-pinctrl.dtsi | 47 ++++++++ app/boards/arm/glove80/glove80_lh.dts | 101 ++++++++++++++++ app/boards/arm/glove80/glove80_lh.keymap | 7 ++ app/boards/arm/glove80/glove80_lh_defconfig | 92 ++++++++++++++ .../arm/glove80/glove80_rh-pinctrl.dtsi | 48 ++++++++ app/boards/arm/glove80/glove80_rh.dts | 108 +++++++++++++++++ app/boards/arm/glove80/glove80_rh.keymap | 7 ++ app/boards/arm/glove80/glove80_rh_defconfig | 89 ++++++++++++++ app/boards/arm/glove80/readme.md | 13 ++ app/boards/arm/glove80/usb_serial_number.c | 67 ++++++++++ 19 files changed, 927 insertions(+) create mode 100644 app/boards/arm/glove80/CMakeLists.txt create mode 100644 app/boards/arm/glove80/Kconfig create mode 100644 app/boards/arm/glove80/Kconfig.board create mode 100644 app/boards/arm/glove80/Kconfig.defconfig create mode 100644 app/boards/arm/glove80/board.cmake create mode 100644 app/boards/arm/glove80/glove80.dtsi create mode 100644 app/boards/arm/glove80/glove80.keymap create mode 100644 app/boards/arm/glove80/glove80.yaml create mode 100644 app/boards/arm/glove80/glove80.zmk.yml create mode 100644 app/boards/arm/glove80/glove80_lh-pinctrl.dtsi create mode 100644 app/boards/arm/glove80/glove80_lh.dts create mode 100644 app/boards/arm/glove80/glove80_lh.keymap create mode 100644 app/boards/arm/glove80/glove80_lh_defconfig create mode 100644 app/boards/arm/glove80/glove80_rh-pinctrl.dtsi create mode 100644 app/boards/arm/glove80/glove80_rh.dts create mode 100644 app/boards/arm/glove80/glove80_rh.keymap create mode 100644 app/boards/arm/glove80/glove80_rh_defconfig create mode 100644 app/boards/arm/glove80/readme.md create mode 100644 app/boards/arm/glove80/usb_serial_number.c diff --git a/app/boards/arm/glove80/CMakeLists.txt b/app/boards/arm/glove80/CMakeLists.txt new file mode 100644 index 00000000..3eb2cd27 --- /dev/null +++ b/app/boards/arm/glove80/CMakeLists.txt @@ -0,0 +1,3 @@ +zephyr_library() +zephyr_library_sources(usb_serial_number.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) diff --git a/app/boards/arm/glove80/Kconfig b/app/boards/arm/glove80/Kconfig new file mode 100644 index 00000000..f1c12e7e --- /dev/null +++ b/app/boards/arm/glove80/Kconfig @@ -0,0 +1,8 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_GLOVE80_LH || BOARD_GLOVE80_RH) diff --git a/app/boards/arm/glove80/Kconfig.board b/app/boards/arm/glove80/Kconfig.board new file mode 100644 index 00000000..f6891037 --- /dev/null +++ b/app/boards/arm/glove80/Kconfig.board @@ -0,0 +1,10 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config BOARD_GLOVE80_LH + bool "Glove80 LH" + depends on SOC_NRF52840_QIAA + +config BOARD_GLOVE80_RH + bool "Glove80 RH" + depends on SOC_NRF52840_QIAA diff --git a/app/boards/arm/glove80/Kconfig.defconfig b/app/boards/arm/glove80/Kconfig.defconfig new file mode 100644 index 00000000..e1c452a5 --- /dev/null +++ b/app/boards/arm/glove80/Kconfig.defconfig @@ -0,0 +1,65 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_GLOVE80_LH + +config BOARD + default "glove80 lh" + +config ZMK_SPLIT_BLE_ROLE_CENTRAL + default y + +endif # BOARD_GLOVE80_LH + +if BOARD_GLOVE80_RH + +config BOARD + default "glove80 rh" + +endif # BOARD_GLOVE80_RH + +if BOARD_GLOVE80_LH || BOARD_GLOVE80_RH + +config ZMK_SPLIT + default y + +config BT_CTLR + default BT + +config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS + default 5 + +config PINCTRL + default y + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +if ZMK_BACKLIGHT + +config PWM + default y + +config LED_PWM + default y + +endif # ZMK_BACKLIGHT + +if ZMK_RGB_UNDERGLOW + +config SPI + default y + +config WS2812_STRIP + default y + +endif # ZMK_RGB_UNDERGLOW + +endif # BOARD_GLOVE80_LH || BOARD_GLOVE80_RH diff --git a/app/boards/arm/glove80/board.cmake b/app/boards/arm/glove80/board.cmake new file mode 100644 index 00000000..36030db7 --- /dev/null +++ b/app/boards/arm/glove80/board.cmake @@ -0,0 +1,6 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/glove80/glove80.dtsi b/app/boards/arm/glove80/glove80.dtsi new file mode 100644 index 00000000..f3f58cf7 --- /dev/null +++ b/app/boards/arm/glove80/glove80.dtsi @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <6>; + map = < + RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) + RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) + RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) + RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) + RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(0,6) RC(1,6) RC(2,6) RC(2,7) RC(1,7) RC(0,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(3,6) RC(4,6) RC(5,6) RC(5,7) RC(4,7) RC(3,7) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + debounce-press-ms = <4>; + debounce-release-ms = <20>; + }; + +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; diff --git a/app/boards/arm/glove80/glove80.keymap b/app/boards/arm/glove80/glove80.keymap new file mode 100644 index 00000000..6c920ca1 --- /dev/null +++ b/app/boards/arm/glove80/glove80.keymap @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include + +// layers +#define DEFAULT 0 +#define LOWER 1 +#define MAGIC 2 + +/ { + behaviors { + // For the "layer" key, it'd nice to be able to use it as either a shift or a toggle. + // Configure it as a tap dance, so the first tap (or hold) is a &mo and the second tap is a &to + layer_td: tap_dance_0 { + compatible = "zmk,behavior-tap-dance"; + label = "LAYER_TAP_DANCE"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&mo LOWER>, <&to LOWER>; + }; + }; + + macros { + bt_0: bt_profile_macro_0 { + label = "BT_0"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 0>; + }; + + bt_1: bt_profile_macro_1 { + label = "BT_1"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 1>; + }; + + bt_2: bt_profile_macro_2 { + label = "BT_2"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 2>; + }; + + bt_3: bt_profile_macro_3 { + label = "BT_3"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 3>; + }; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | ESC | A | S | D | F | G | | H | J | K | L | ; | ' | + // | ` | Z | X | C | V | B | LSHFT | LCTRL | LOWER | | LGUI | RCTRL | RSHFT | N | M | , | . | / | PGUP | + // | MAGIC | HOME| END | LEFT | RIGHT| | BSPC | DEL | LALT | | RALT | RET | SPACE | | UP | DOWN | [ | ] | PGDN | + + bindings = < + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 + &kp EQUAL &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS + &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH + &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp GRAVE &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LCTRL &layer_td &kp LGUI &kp RCTRL &kp RSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp PG_UP + &mo MAGIC &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN + >; + }; + + lower_layer { + bindings = < + &kp C_BRI_DN &kp C_BRI_UP &kp C_PREV &kp C_NEXT &kp C_PP &kp C_MUTE &kp C_VOL_DN &kp C_VOL_UP &none &kp PAUSE_BREAK + &trans &none &none &none &none &kp HOME &kp LPAR &kp KP_NUM &kp KP_EQUAL &kp KP_DIVIDE &kp KP_MULTIPLY &kp PSCRN + &trans &none &none &kp UP &none &kp END &kp RPAR &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS &kp SLCK + &trans &none &kp LEFT &kp DOWN &kp RIGHT &kp PG_UP &kp PRCNT &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS &none + &trans &kp K_CMENU &none &kp F11 &kp F12 &kp PG_DN &trans &trans &to DEFAULT &trans &trans &trans &kp COMMA &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &trans + &trans &kp CAPS &kp INS &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &kp KP_N0 &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans + >; + }; + + magic_layer { + bindings = < + &bt BT_CLR &none &none &none &none &none &none &none &none &none + &none &none &none &none &none &none &none &none &none &none &none &none + &none &rgb_ug RGB_SPI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &none &none &none &none &none &none + &bootloader &rgb_ug RGB_SPD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_EFF &none &none &none &none &none &bootloader + &sys_reset &none &none &none &none &none &bt_2 &bt_3 &none &none &none &none &none &none &none &none &none &sys_reset + &none &none &none &none &none &bt_0 &bt_1 &out OUT_USB &none &none &none &none &none &none &none &none + >; + }; + }; +}; diff --git a/app/boards/arm/glove80/glove80.yaml b/app/boards/arm/glove80/glove80.yaml new file mode 100644 index 00000000..90a5e133 --- /dev/null +++ b/app/boards/arm/glove80/glove80.yaml @@ -0,0 +1,19 @@ +identifier: glove80 +name: Glove80 +url: https://www.moergo.com/ +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog + - gpio + - i2c + - spi diff --git a/app/boards/arm/glove80/glove80.zmk.yml b/app/boards/arm/glove80/glove80.zmk.yml new file mode 100644 index 00000000..ca70b7d6 --- /dev/null +++ b/app/boards/arm/glove80/glove80.zmk.yml @@ -0,0 +1,16 @@ +file_format: "1" +id: glove80 +name: Glove80 +type: board +arch: arm +url: https://www.moergo.com/ +features: + - keys + - underglow + - backlight +outputs: + - usb + - ble +siblings: + - glove80_lh + - glove80_rh diff --git a/app/boards/arm/glove80/glove80_lh-pinctrl.dtsi b/app/boards/arm/glove80/glove80_lh-pinctrl.dtsi new file mode 100644 index 00000000..3dbf3d7e --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh-pinctrl.dtsi @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; // WS2812_VEXT_DATA + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = ; // rear LED + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + bias-pull-down; + }; + }; + + uart0_default: uart0_default { + group1 { + psels = , // EXT1 + ; // EXT2 + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/app/boards/arm/glove80/glove80_lh.dts b/app/boards/arm/glove80/glove80_lh.dts new file mode 100644 index 00000000..ed40e0d2 --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh.dts @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "glove80.dtsi" +#include "glove80_lh-pinctrl.dtsi" + +#include + +/ { + model = "glove80_lh"; + compatible = "glove80_lh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &back_led_backlight; + zmk,battery = &vbatt; + }; + + back_led_backlight: pwmleds { + compatible = "pwm-leds"; + label = "BACK LED"; + pwm_led_0 { + pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; + label = "Back LED configured as backlight"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ + init-delay-ms = <100>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY"; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812C-2020"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <40>; /* 40 keys have underglow at the moment */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&uart0 { + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&kscan0 { + row-gpios + = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW1 + , <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW2 + , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW3 + , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW4 + , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW5 + , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW6 + ; + col-gpios + = <&gpio1 8 GPIO_ACTIVE_HIGH> // LH COL6 + , <&gpio1 4 GPIO_ACTIVE_HIGH> // LH COL5 + , <&gpio1 6 GPIO_ACTIVE_HIGH> // LH COL4 + , <&gpio1 7 GPIO_ACTIVE_HIGH> // LH COL3 + , <&gpio1 5 GPIO_ACTIVE_HIGH> // LH COL2 + , <&gpio1 3 GPIO_ACTIVE_HIGH> // LH COL1 + , <&gpio1 1 GPIO_ACTIVE_HIGH> // LH Thumb + ; +}; diff --git a/app/boards/arm/glove80/glove80_lh.keymap b/app/boards/arm/glove80/glove80_lh.keymap new file mode 100644 index 00000000..dd4c2d6a --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh.keymap @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "glove80.keymap" diff --git a/app/boards/arm/glove80/glove80_lh_defconfig b/app/boards/arm/glove80/glove80_lh_defconfig new file mode 100644 index 00000000..a93f27cd --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh_defconfig @@ -0,0 +1,92 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_LH=y + +# Enable both USB and BLE +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + +# Keyboard IDs +CONFIG_ZMK_KEYBOARD_NAME="Glove80 Left" +CONFIG_USB_DEVICE_PID=0x27db +CONFIG_USB_DEVICE_VID=0x16c0 +CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" +CONFIG_USB_DEVICE_SN="moergo.com:GLV80-0123456789ABCDEF" + +CONFIG_BT_DIS_PNP_PID=0x27db +CONFIG_BT_DIS_PNP_VID=0x16c0 +CONFIG_BT_DIS_MANUF="MoErgo" +CONFIG_BT_DIS_MODEL="Glove80" + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y + +# Work-around for Windows bug with battery notifications +CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION=n + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable GPIO +CONFIG_GPIO=y + +# Build configurations +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x9807B007" +CONFIG_USE_DT_CODE_PARTITION=y + +# Flash configuration +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y + +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=4 + +# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 80. Configuring +# BRT_MAX above 80% will draw additional current and can potentially damage your +# computer. WARRANTY IS VOID IF BRT_MAX SET ABOVE 80. +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 + +CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 + +# The power LED is implemented as a backlight +# For now, the power LED is acting as a "USB connected" indicator +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# The full two-byte consumer report space has compatibility issues with some +# operating systems, most notably macOS. Use the more basic single-byte usage +# space. +CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y + +# Turn on debugging to disable optimization. Debug messages can result in larger +# stacks, so enable stack protection and particularly a larger BLE peripheral stack. +# CONFIG_DEBUG=y +# CONFIG_DEBUG_THREAD_INFO=y +# CONFIG_EXCEPTION_STACK_TRACE=y +# CONFIG_HW_STACK_PROTECTION=y +# CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE=1300 + +# Log via USB or Segger RTT +CONFIG_ZMK_USB_LOGGING=n +CONFIG_ZMK_RTT_LOGGING=n diff --git a/app/boards/arm/glove80/glove80_rh-pinctrl.dtsi b/app/boards/arm/glove80/glove80_rh-pinctrl.dtsi new file mode 100644 index 00000000..454a2621 --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh-pinctrl.dtsi @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * SPDX-License-Identifier: MIT + */ + +&pinctrl { + spi3_default: spi3_default { + group1 { + psels = ; // WS2812_VEXT_DATA + }; + }; + + spi3_sleep: spi3_sleep { + group1 { + psels = ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = ; // Rear LED + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = ; + bias-pull-down; + }; + }; + + uart0_default: uart0_default { + group1 { + psels = , // EXT1 + ; // EXT2 + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + +}; diff --git a/app/boards/arm/glove80/glove80_rh.dts b/app/boards/arm/glove80/glove80_rh.dts new file mode 100644 index 00000000..288f6368 --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh.dts @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + + +#include "glove80.dtsi" +#include "glove80_rh-pinctrl.dtsi" + +#include + +/ { + model = "glove80_rh"; + compatible = "glove80_rh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &back_led_backlight; + zmk,battery = &vbatt; + }; + + back_led_backlight: pwmleds { + compatible = "pwm-leds"; + label = "BACK LED"; + pwm_led_0 { + pwms = <&pwm0 0 PWM_USEC(20) PWM_POLARITY_NORMAL>; + label = "Back LED configured as backlight"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ + init-delay-ms = <100>; + }; + + vbatt: vbatt { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY"; + }; +}; + +&spi3 { + compatible = "nordic,nrf-spim"; + status = "okay"; + + pinctrl-0 = <&spi3_default>; + pinctrl-1 = <&spi3_sleep>; + pinctrl-names = "default", "sleep"; + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812C-2020"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <40>; /* 40 keys have underglow at the moment */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_default>; + pinctrl-1 = <&pwm0_sleep>; + pinctrl-names = "default", "sleep"; +}; + + +&uart0 { + compatible = "nordic,nrf-uarte"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +/* For right hand, the columns are offset by 7 */ +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW1 + , <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW2 + , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW3 + , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW4 + , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW5 + , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW6 + ; + col-gpios + = <&gpio1 6 GPIO_ACTIVE_HIGH> // RH Thumb + , <&gpio1 4 GPIO_ACTIVE_HIGH> // RH COL1 + , <&gpio0 2 GPIO_ACTIVE_HIGH> // RH COL2 + , <&gpio1 7 GPIO_ACTIVE_HIGH> // RH COL3 + , <&gpio1 5 GPIO_ACTIVE_HIGH> // RH COL4 + , <&gpio1 3 GPIO_ACTIVE_HIGH> // RH COL5 + , <&gpio1 1 GPIO_ACTIVE_HIGH> // RH COL6 + ; +}; diff --git a/app/boards/arm/glove80/glove80_rh.keymap b/app/boards/arm/glove80/glove80_rh.keymap new file mode 100644 index 00000000..dd4c2d6a --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh.keymap @@ -0,0 +1,7 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "glove80.keymap" diff --git a/app/boards/arm/glove80/glove80_rh_defconfig b/app/boards/arm/glove80/glove80_rh_defconfig new file mode 100644 index 00000000..ef29d682 --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh_defconfig @@ -0,0 +1,89 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_RH=y + +# Enable both USB and BLE +CONFIG_ZMK_USB=y +CONFIG_ZMK_BLE=y + +# Keyboard IDs +CONFIG_ZMK_KEYBOARD_NAME="Glove80 Right" +CONFIG_USB_DEVICE_PID=0x27d9 +CONFIG_USB_DEVICE_VID=0x16c0 +CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" +CONFIG_USB_DEVICE_SN="moergo.com:GLV80-0123456789ABCDEF" + +CONFIG_BT_DIS_PNP_PID=0x27d9 +CONFIG_BT_DIS_PNP_VID=0x16c0 +CONFIG_BT_DIS_MANUF="MoErgo" +CONFIG_BT_DIS_MODEL="Glove80 Right" + +CONFIG_BT_CTLR_TX_PWR_PLUS_8=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable GPIO +CONFIG_GPIO=y + +# Build configurations +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x9808B007" +CONFIG_USE_DT_CODE_PARTITION=y + +# Flash configuration +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y + +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=4 + +# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 80. Configuring +# BRT_MAX above 80% will draw additional current and can potentially damage your +# computer. WARRANTY IS VOID IF BRT_MAX SET ABOVE 80. +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 + +CONFIG_ZMK_RGB_UNDERGLOW_EFF_START=3 +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 + +# The power LED is implemented as a backlight +# For now, the power LED is acting as a "USB connected" indicator +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# The full two-byte consumer report space has compatibility issues with some +# operating systems, most notably macOS. Use the more basic single-byte usage +# space. +CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y + +# Turn on debugging to disable optimization. Debug messages can result in larger +# stacks, so enable stack protection and particularly a larger BLE peripheral stack. +# CONFIG_DEBUG=y +# CONFIG_DEBUG_THREAD_INFO=y +# CONFIG_EXCEPTION_STACK_TRACE=y +# CONFIG_HW_STACK_PROTECTION=y +# CONFIG_ZMK_SPLIT_BLE_PERIPHERAL_STACK_SIZE=1300 + +# Log via USB or Segger RTT +CONFIG_ZMK_USB_LOGGING=n +CONFIG_ZMK_RTT_LOGGING=n diff --git a/app/boards/arm/glove80/readme.md b/app/boards/arm/glove80/readme.md new file mode 100644 index 00000000..2c770376 --- /dev/null +++ b/app/boards/arm/glove80/readme.md @@ -0,0 +1,13 @@ +## MoErgo Glove80 + +This board definition provides ZMK support for the [MoErgo Glove80](https://www.moergo.com) +keyboard. + +MoErgo additionally offers a customized version of ZMK which adds additional functionality such as +RGB status indicators, available on GitHub at [moergo-sc/zmk](https://github.com/moergo-sc/zmk). The +MoErgo customized ZMK fork is regularly updated to include the latest changes from mainline ZMK, but +will not always be completely up-to-date. MoErgo also offers an online layout configurator and +firmware builder application using the customized fork at [my.glove80.com](https://my.glove80.com). + +While mainline ZMK is expected to work well with Glove80, MoErgo only provides support for use of +their customized fork. Likewise, the ZMK community cannot directly provide support for MoErgo's fork. diff --git a/app/boards/arm/glove80/usb_serial_number.c b/app/boards/arm/glove80/usb_serial_number.c new file mode 100644 index 00000000..44d7ee20 --- /dev/null +++ b/app/boards/arm/glove80/usb_serial_number.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include "usb_descriptor.h" + +#define LOG_LEVEL CONFIG_USB_DEVICE_LOG_LEVEL +#include +LOG_MODULE_DECLARE(usb_descriptor); + +int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize); + +uint8_t *usb_update_sn_string_descriptor(void) { + /* + * nrf52840 hwinfo returns a 64-bit hardware id. Glove80 uses this as a + * serial number, encoded as base16 into the last 16 characters of the + * CONFIG_USB_DEVICE_SN template. If insufficient template space is + * available, instead return the static serial number string. + */ + const uint8_t template_len = sizeof(CONFIG_USB_DEVICE_SN); + const uint8_t sn_len = 16; + + if (template_len < sn_len + 1) { + LOG_DBG("Serial number template too short"); + return CONFIG_USB_DEVICE_SN; + } + + static uint8_t serial[sizeof(CONFIG_USB_DEVICE_SN)]; + strncpy(serial, CONFIG_USB_DEVICE_SN, template_len); + + uint8_t hwid[8]; + memset(hwid, 0, sizeof(hwid)); + uint8_t hwlen = hwinfo_get_device_id(hwid, sizeof(hwid)); + + if (hwlen > 0) { + const uint8_t offset = template_len - sn_len - 1; + LOG_HEXDUMP_DBG(&hwid, sn_len, "Serial Number"); + base16_encode(hwid, hwlen, serial + offset, sn_len + 1); + } + + return serial; +} + +int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize) { + const char hex[] = "0123456789ABCDEF"; + + int i = 0; + while (i < bufSize && i < length * 2) { + uint8_t nibble; + if (i % 2 == 0) { + nibble = data[i / 2] >> 4; + } else { + nibble = data[i / 2] & 0xF; + } + result[i] = hex[nibble]; + ++i; + } + if (i < bufSize) { + result[i] = '\0'; + } + return i; +} From f6716f869a0fd20ac9520e2808dc4183742436a5 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 14 Nov 2023 07:03:25 +0000 Subject: [PATCH 491/494] fix(usb): Build with ZMK_USB_BOOT disabled. * Invert the logic so `get_keyboard_report` is sane when `ZMK_USB_BOOT` is disabled. --- app/src/usb_hid.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index c72bb36c..d2a52cf2 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -39,16 +39,16 @@ void zmk_usb_hid_set_protocol(uint8_t protocol) { hid_protocol = protocol; } #endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ static uint8_t *get_keyboard_report(size_t *len) { - if (hid_protocol == HID_PROTOCOL_REPORT) { - struct zmk_hid_keyboard_report *report = zmk_hid_get_keyboard_report(); - *len = sizeof(*report); - return (uint8_t *)report; - } #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) - zmk_hid_boot_report_t *boot_report = zmk_hid_get_boot_report(); - *len = sizeof(*boot_report); - return (uint8_t *)boot_report; + if (hid_protocol != HID_PROTOCOL_REPORT) { + zmk_hid_boot_report_t *boot_report = zmk_hid_get_boot_report(); + *len = sizeof(*boot_report); + return (uint8_t *)boot_report; + } #endif + struct zmk_hid_keyboard_report *report = zmk_hid_get_keyboard_report(); + *len = sizeof(*report); + return (uint8_t *)report; } static int get_report_cb(const struct device *dev, struct usb_setup_packet *setup, int32_t *len, From 3027b2a6e8f2896f7e08d5a502be50ad21f32d7f Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 14 Nov 2023 07:50:48 +0000 Subject: [PATCH 492/494] chore(usb): Don't enable ZMK_USB_ROOT by default. * Some initial reports of crashes with this code enabled, so disabling by default for now pending further investigation. --- app/Kconfig | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 282339e3..072795e3 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -98,7 +98,6 @@ config ZMK_USB config ZMK_USB_BOOT bool "USB Boot Protocol Support" - default y depends on ZMK_USB select USB_HID_BOOT_PROTOCOL select USB_DEVICE_SOF From 8776911da5005d42cd0bdf108b23deca16d7ec82 Mon Sep 17 00:00:00 2001 From: ReFil <31960031+ReFil@users.noreply.github.com> Date: Wed, 15 Nov 2023 18:03:30 +0000 Subject: [PATCH 493/494] feat(ble): Allow disabling BLE BAS reporting The battery reporting has been known to cause macOS computers to wakeup repeatedly. In some cases (e.g. display or custom lighting implementation) one might want to collect battery SOC without broadcasting over BLE * Update docs/docs/config/battery.md Co-authored-by: Cem Aksoylar --- app/Kconfig | 2 +- app/src/battery.c | 4 ++-- docs/docs/config/battery.md | 6 ++++++ docs/docs/config/system.md | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index 072795e3..1b3eb6de 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -321,7 +321,7 @@ config ZMK_BATTERY_REPORTING bool "Battery level detection/reporting" default n select SENSOR - select BT_BAS if ZMK_BLE + imply BT_BAS if ZMK_BLE config ZMK_IDLE_TIMEOUT int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)" diff --git a/app/src/battery.c b/app/src/battery.c index 87a25e08..c6466272 100644 --- a/app/src/battery.c +++ b/app/src/battery.c @@ -51,7 +51,7 @@ static int zmk_battery_update(const struct device *battery) { if (last_state_of_charge != state_of_charge.val1) { last_state_of_charge = state_of_charge.val1; - +#if IS_ENABLED(CONFIG_BT_BAS) LOG_DBG("Setting BAS GATT battery level to %d.", last_state_of_charge); rc = bt_bas_set_battery_level(last_state_of_charge); @@ -60,7 +60,7 @@ static int zmk_battery_update(const struct device *battery) { LOG_WRN("Failed to set BAS GATT battery level (err %d)", rc); return rc; } - +#endif rc = ZMK_EVENT_RAISE(new_zmk_battery_state_changed( (struct zmk_battery_state_changed){.state_of_charge = last_state_of_charge})); } diff --git a/docs/docs/config/battery.md b/docs/docs/config/battery.md index c56a30ef..8d65a00a 100644 --- a/docs/docs/config/battery.md +++ b/docs/docs/config/battery.md @@ -22,6 +22,12 @@ While `CONFIG_ZMK_BATTERY_REPORTING` is disabled by default it is implied by `CO ::: +:::note BLE reporting on MacOS + +On macOS the BLE battery reporting packets can cause the computer to wakeup from sleep. To prevent this, the battery _reporting_ service can be disabled by setting `CONFIG_BT_BAS=n`. This setting is independent of battery _monitoring_, for instance the battery level can still be indicated on a display. + +::: + ### Devicetree Applies to: [`/chosen` node](https://docs.zephyrproject.org/latest/guides/dts/intro.html#aliases-and-chosen-nodes) diff --git a/docs/docs/config/system.md b/docs/docs/config/system.md index 25d51940..b9dd580d 100644 --- a/docs/docs/config/system.md +++ b/docs/docs/config/system.md @@ -66,6 +66,7 @@ for more information on configuring Bluetooth. | Config | Type | Description | Default | | ------------------------------------------- | ---- | --------------------------------------------------------------------- | ------- | | `CONFIG_BT` | bool | Enable Bluetooth support | | +| `CONFIG_BT_BAS` | bool | Enable the Bluetooth BAS (battery reporting service) | y | | `CONFIG_BT_MAX_CONN` | int | Maximum number of simultaneous Bluetooth connections | 5 | | `CONFIG_BT_MAX_PAIRED` | int | Maximum number of paired Bluetooth devices | 5 | | `CONFIG_ZMK_BLE` | bool | Enable ZMK as a Bluetooth keyboard | | From d7d9eed317b3f788370a8728afa449c5e525f2ca Mon Sep 17 00:00:00 2001 From: Alexander Krikun Date: Tue, 27 Apr 2021 18:24:11 +0300 Subject: [PATCH 494/494] feat(mouse): Initial mouse keys support. * Add HID report/descriptor for a new report with mouse buttons, and x/y/wheel deltas. * New mouse key press behavior for press/release of mouse keys. * Add constants for HID main item values (e.g. data/array/absolute) * Define and use constants for our HID report IDs. --- app/CMakeLists.txt | 3 + app/Kconfig | 13 +++ app/Kconfig.behaviors | 5 ++ app/dts/behaviors.dtsi | 3 +- app/dts/behaviors/mouse_key_press.dtsi | 9 +++ .../zmk,behavior-mouse-key-press.yaml | 5 ++ app/include/dt-bindings/zmk/hid_usage_pages.h | 1 + app/include/dt-bindings/zmk/mouse.h | 24 ++++++ app/include/zmk/endpoints.h | 4 + .../zmk/events/mouse_button_state_changed.h | 26 ++++++ app/include/zmk/hid.h | 66 +++++++++++++++ app/include/zmk/hog.h | 4 + app/include/zmk/mouse.h | 12 +++ app/include/zmk/usb_hid.h | 3 + app/src/behaviors/behavior_mouse_key_press.c | 48 +++++++++++ app/src/endpoints.c | 33 ++++++++ app/src/events/mouse_button_state_changed.c | 9 +++ app/src/hid.c | 81 +++++++++++++++++++ app/src/hog.c | 80 ++++++++++++++++++ app/src/mouse.c | 43 ++++++++++ app/src/usb_hid.c | 13 +++ app/tests/mouse-keys/mkp/events.patterns | 1 + .../mouse-keys/mkp/keycode_events.snapshot | 10 +++ app/tests/mouse-keys/mkp/native_posix.keymap | 28 +++++++ .../mouse-keys/mkp/native_posix_64.keymap | 28 +++++++ docs/docs/behaviors/mouse-emulation.md | 66 +++++++++++++++ docs/sidebars.js | 1 + 27 files changed, 618 insertions(+), 1 deletion(-) create mode 100644 app/dts/behaviors/mouse_key_press.dtsi create mode 100644 app/dts/bindings/behaviors/zmk,behavior-mouse-key-press.yaml create mode 100644 app/include/dt-bindings/zmk/mouse.h create mode 100644 app/include/zmk/events/mouse_button_state_changed.h create mode 100644 app/include/zmk/mouse.h create mode 100644 app/src/behaviors/behavior_mouse_key_press.c create mode 100644 app/src/events/mouse_button_state_changed.c create mode 100644 app/src/mouse.c create mode 100644 app/tests/mouse-keys/mkp/events.patterns create mode 100644 app/tests/mouse-keys/mkp/keycode_events.snapshot create mode 100644 app/tests/mouse-keys/mkp/native_posix.keymap create mode 100644 app/tests/mouse-keys/mkp/native_posix_64.keymap create mode 100644 docs/docs/behaviors/mouse-emulation.md diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 793f386d..0891364b 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -31,12 +31,14 @@ target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/ext_power_generic.c) target_sources(app PRIVATE src/events/activity_state_changed.c) target_sources(app PRIVATE src/events/position_state_changed.c) target_sources(app PRIVATE src/events/sensor_event.c) +target_sources(app PRIVATE src/events/mouse_button_state_changed.c) target_sources_ifdef(CONFIG_ZMK_WPM app PRIVATE src/events/wpm_state_changed.c) target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/events/usb_conn_state_changed.c) target_sources(app PRIVATE src/behaviors/behavior_reset.c) target_sources_ifdef(CONFIG_ZMK_EXT_POWER app PRIVATE src/behaviors/behavior_ext_power.c) if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources(app PRIVATE src/hid.c) + target_sources_ifdef(CONFIG_ZMK_MOUSE app PRIVATE src/mouse.c) target_sources(app PRIVATE src/behaviors/behavior_key_press.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_KEY_TOGGLE app PRIVATE src/behaviors/behavior_key_toggle.c) target_sources(app PRIVATE src/behaviors/behavior_hold_tap.c) @@ -54,6 +56,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE app PRIVATE src/behaviors/behavior_sensor_rotate.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR app PRIVATE src/behaviors/behavior_sensor_rotate_var.c) target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON app PRIVATE src/behaviors/behavior_sensor_rotate_common.c) + target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MOUSE_KEY_PRESS app PRIVATE src/behaviors/behavior_mouse_key_press.c) target_sources(app PRIVATE src/combo.c) target_sources(app PRIVATE src/behaviors/behavior_tap_dance.c) target_sources(app PRIVATE src/behavior_queue.c) diff --git a/app/Kconfig b/app/Kconfig index 1b3eb6de..f92f0ae3 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -156,6 +156,10 @@ config ZMK_BLE_CONSUMER_REPORT_QUEUE_SIZE int "Max number of consumer HID reports to queue for sending over BLE" default 5 +config ZMK_BLE_MOUSE_REPORT_QUEUE_SIZE + int "Max number of mouse HID reports to queue for sending over BLE" + default 20 + config ZMK_BLE_CLEAR_BONDS_ON_START bool "Configuration that clears all bond information from the keyboard on startup." default n @@ -315,6 +319,15 @@ endif #Display/LED Options endmenu +menu "Mouse Options" + +config ZMK_MOUSE + bool "Enable ZMK mouse emulation" + default n + +#Mouse Options +endmenu + menu "Power Management" config ZMK_BATTERY_REPORTING diff --git a/app/Kconfig.behaviors b/app/Kconfig.behaviors index 9e4a82b0..11bc8c59 100644 --- a/app/Kconfig.behaviors +++ b/app/Kconfig.behaviors @@ -6,6 +6,11 @@ config ZMK_BEHAVIOR_KEY_TOGGLE default y depends on DT_HAS_ZMK_BEHAVIOR_KEY_TOGGLE_ENABLED +config ZMK_BEHAVIOR_MOUSE_KEY_PRESS + bool + default y + depends on DT_HAS_ZMK_BEHAVIOR_MOUSE_KEY_PRESS_ENABLED + imply ZMK_MOUSE config ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON bool diff --git a/app/dts/behaviors.dtsi b/app/dts/behaviors.dtsi index b3502cbb..23f2fee2 100644 --- a/app/dts/behaviors.dtsi +++ b/app/dts/behaviors.dtsi @@ -18,4 +18,5 @@ #include #include #include -#include \ No newline at end of file +#include +#include diff --git a/app/dts/behaviors/mouse_key_press.dtsi b/app/dts/behaviors/mouse_key_press.dtsi new file mode 100644 index 00000000..9cc16e81 --- /dev/null +++ b/app/dts/behaviors/mouse_key_press.dtsi @@ -0,0 +1,9 @@ +/ { + behaviors { + /omit-if-no-ref/ mkp: behavior_mouse_key_press { + compatible = "zmk,behavior-mouse-key-press"; + label = "MOUSE_KEY_PRESS"; + #binding-cells = <1>; + }; + }; +}; diff --git a/app/dts/bindings/behaviors/zmk,behavior-mouse-key-press.yaml b/app/dts/bindings/behaviors/zmk,behavior-mouse-key-press.yaml new file mode 100644 index 00000000..8540916b --- /dev/null +++ b/app/dts/bindings/behaviors/zmk,behavior-mouse-key-press.yaml @@ -0,0 +1,5 @@ +description: Mouse key press/release behavior + +compatible: "zmk,behavior-mouse-key-press" + +include: one_param.yaml diff --git a/app/include/dt-bindings/zmk/hid_usage_pages.h b/app/include/dt-bindings/zmk/hid_usage_pages.h index 2ccdba55..7fa54fd8 100644 --- a/app/include/dt-bindings/zmk/hid_usage_pages.h +++ b/app/include/dt-bindings/zmk/hid_usage_pages.h @@ -26,6 +26,7 @@ #define HID_USAGE_GDV (0x06) // Generic Device Controls #define HID_USAGE_KEY (0x07) // Keyboard/Keypad #define HID_USAGE_LED (0x08) // LED +#define HID_USAGE_BUTTON (0x09) // Button #define HID_USAGE_TELEPHONY (0x0B) // Telephony Device #define HID_USAGE_CONSUMER (0x0C) // Consumer #define HID_USAGE_DIGITIZERS (0x0D) // Digitizers diff --git a/app/include/dt-bindings/zmk/mouse.h b/app/include/dt-bindings/zmk/mouse.h new file mode 100644 index 00000000..582518af --- /dev/null +++ b/app/include/dt-bindings/zmk/mouse.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ +#pragma once + +#include + +/* Mouse press behavior */ +/* Left click */ +#define MB1 BIT(0) +#define LCLK (MB1) + +/* Right click */ +#define MB2 BIT(1) +#define RCLK (MB2) + +/* Middle click */ +#define MB3 BIT(2) +#define MCLK (MB3) + +#define MB4 BIT(3) +#define MB5 BIT(4) diff --git a/app/include/zmk/endpoints.h b/app/include/zmk/endpoints.h index c5964ff8..70240183 100644 --- a/app/include/zmk/endpoints.h +++ b/app/include/zmk/endpoints.h @@ -69,3 +69,7 @@ int zmk_endpoints_toggle_transport(void); struct zmk_endpoint_instance zmk_endpoints_selected(void); int zmk_endpoints_send_report(uint16_t usage_page); + +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +int zmk_endpoints_send_mouse_report(); +#endif // IS_ENABLE(CONFIG_ZMK_MOUSE) diff --git a/app/include/zmk/events/mouse_button_state_changed.h b/app/include/zmk/events/mouse_button_state_changed.h new file mode 100644 index 00000000..9382789e --- /dev/null +++ b/app/include/zmk/events/mouse_button_state_changed.h @@ -0,0 +1,26 @@ + +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include +#include + +struct zmk_mouse_button_state_changed { + zmk_mouse_button_t buttons; + bool state; + int64_t timestamp; +}; + +ZMK_EVENT_DECLARE(zmk_mouse_button_state_changed); + +static inline struct zmk_mouse_button_state_changed_event * +zmk_mouse_button_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp) { + return new_zmk_mouse_button_state_changed((struct zmk_mouse_button_state_changed){ + .buttons = ZMK_HID_USAGE_ID(encoded), .state = pressed, .timestamp = timestamp}); +} diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index afe92101..aeaa69d8 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -10,10 +10,15 @@ #include #include +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +#include +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + #include #include #define ZMK_HID_KEYBOARD_NKRO_MAX_USAGE HID_USAGE_KEY_KEYPAD_EQUAL +#define ZMK_HID_MOUSE_NUM_BUTTONS 0x05 // See https://www.usb.org/sites/default/files/hid1_11.pdf section 6.2.2.4 Main Items @@ -46,6 +51,7 @@ #define ZMK_HID_REPORT_ID_KEYBOARD 0x01 #define ZMK_HID_REPORT_ID_CONSUMER 0x02 +#define ZMK_HID_REPORT_ID_MOUSE 0x03 static const uint8_t zmk_hid_report_desc[] = { HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP), @@ -114,6 +120,39 @@ static const uint8_t zmk_hid_report_desc[] = { HID_REPORT_COUNT(CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE), HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_ARRAY | ZMK_HID_MAIN_VAL_ABS), HID_END_COLLECTION, + +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + HID_USAGE_PAGE(HID_USAGE_GD), + HID_USAGE(HID_USAGE_GD_MOUSE), + HID_COLLECTION(HID_COLLECTION_APPLICATION), + HID_REPORT_ID(ZMK_HID_REPORT_ID_MOUSE), + HID_USAGE(HID_USAGE_GD_POINTER), + HID_COLLECTION(HID_COLLECTION_PHYSICAL), + HID_USAGE_PAGE(HID_USAGE_BUTTON), + HID_USAGE_MIN8(0x1), + HID_USAGE_MAX8(ZMK_HID_MOUSE_NUM_BUTTONS), + HID_LOGICAL_MIN8(0x00), + HID_LOGICAL_MAX8(0x01), + HID_REPORT_SIZE(0x01), + HID_REPORT_COUNT(0x5), + HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), + // Constant padding for the last 3 bits. + HID_REPORT_SIZE(0x03), + HID_REPORT_COUNT(0x01), + HID_INPUT(ZMK_HID_MAIN_VAL_CONST | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_ABS), + // Some OSes ignore pointer devices without X/Y data. + HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP), + HID_USAGE(HID_USAGE_GD_X), + HID_USAGE(HID_USAGE_GD_Y), + HID_USAGE(HID_USAGE_GD_WHEEL), + HID_LOGICAL_MIN8(-0x7F), + HID_LOGICAL_MAX8(0x7F), + HID_REPORT_SIZE(0x08), + HID_REPORT_COUNT(0x03), + HID_INPUT(ZMK_HID_MAIN_VAL_DATA | ZMK_HID_MAIN_VAL_VAR | ZMK_HID_MAIN_VAL_REL), + HID_END_COLLECTION, + HID_END_COLLECTION, +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) }; #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) @@ -163,6 +202,21 @@ struct zmk_hid_consumer_report { struct zmk_hid_consumer_report_body body; } __packed; +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +struct zmk_hid_mouse_report_body { + zmk_mouse_button_flags_t buttons; + int8_t d_x; + int8_t d_y; + int8_t d_wheel; +} __packed; + +struct zmk_hid_mouse_report { + uint8_t report_id; + struct zmk_hid_mouse_report_body body; +} __packed; + +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + zmk_mod_flags_t zmk_hid_get_explicit_mods(); int zmk_hid_register_mod(zmk_mod_t modifier); int zmk_hid_unregister_mod(zmk_mod_t modifier); @@ -189,9 +243,21 @@ int zmk_hid_press(uint32_t usage); int zmk_hid_release(uint32_t usage); bool zmk_hid_is_pressed(uint32_t usage); +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +int zmk_hid_mouse_button_press(zmk_mouse_button_t button); +int zmk_hid_mouse_button_release(zmk_mouse_button_t button); +int zmk_hid_mouse_buttons_press(zmk_mouse_button_flags_t buttons); +int zmk_hid_mouse_buttons_release(zmk_mouse_button_flags_t buttons); +void zmk_hid_mouse_clear(); +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report(); struct zmk_hid_consumer_report *zmk_hid_get_consumer_report(); #if IS_ENABLED(CONFIG_ZMK_USB_BOOT) zmk_hid_boot_report_t *zmk_hid_get_boot_report(); #endif + +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +struct zmk_hid_mouse_report *zmk_hid_get_mouse_report(); +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) diff --git a/app/include/zmk/hog.h b/app/include/zmk/hog.h index 7523fb66..b4e45d91 100644 --- a/app/include/zmk/hog.h +++ b/app/include/zmk/hog.h @@ -13,3 +13,7 @@ int zmk_hog_init(); int zmk_hog_send_keyboard_report(struct zmk_hid_keyboard_report_body *body); int zmk_hog_send_consumer_report(struct zmk_hid_consumer_report_body *body); + +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +int zmk_hog_send_mouse_report(struct zmk_hid_mouse_report_body *body); +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) diff --git a/app/include/zmk/mouse.h b/app/include/zmk/mouse.h new file mode 100644 index 00000000..d873f156 --- /dev/null +++ b/app/include/zmk/mouse.h @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include + +typedef uint8_t zmk_mouse_button_flags_t; +typedef uint16_t zmk_mouse_button_t; diff --git a/app/include/zmk/usb_hid.h b/app/include/zmk/usb_hid.h index 777f2b48..f9091778 100644 --- a/app/include/zmk/usb_hid.h +++ b/app/include/zmk/usb_hid.h @@ -10,4 +10,7 @@ int zmk_usb_hid_send_keyboard_report(); int zmk_usb_hid_send_consumer_report(); +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +int zmk_usb_hid_send_mouse_report(); +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) void zmk_usb_hid_set_protocol(uint8_t protocol); diff --git a/app/src/behaviors/behavior_mouse_key_press.c b/app/src/behaviors/behavior_mouse_key_press.c new file mode 100644 index 00000000..67181557 --- /dev/null +++ b/app/src/behaviors/behavior_mouse_key_press.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_mouse_key_press + +#include +#include +#include + +#include +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) + +static int behavior_mouse_key_press_init(const struct device *dev) { return 0; }; + +static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); + + return ZMK_EVENT_RAISE( + zmk_mouse_button_state_changed_from_encoded(binding->param1, true, event.timestamp)); +} + +static int on_keymap_binding_released(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); + return ZMK_EVENT_RAISE( + zmk_mouse_button_state_changed_from_encoded(binding->param1, false, event.timestamp)); +} + +static const struct behavior_driver_api behavior_mouse_key_press_driver_api = { + .binding_pressed = on_keymap_binding_pressed, .binding_released = on_keymap_binding_released}; + +#define MKP_INST(n) \ + DEVICE_DT_INST_DEFINE(n, behavior_mouse_key_press_init, NULL, NULL, NULL, APPLICATION, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_mouse_key_press_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(MKP_INST) + +#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 10357d4e..098e04e2 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -191,6 +191,36 @@ int zmk_endpoints_send_report(uint16_t usage_page) { return -ENOTSUP; } +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +int zmk_endpoints_send_mouse_report() { + switch (current_instance.transport) { +#if IS_ENABLED(CONFIG_ZMK_USB) + case ZMK_TRANSPORT_USB: { + int err = zmk_usb_hid_send_mouse_report(); + if (err) { + LOG_ERR("FAILED TO SEND OVER USB: %d", err); + } + return err; + } +#endif /* IS_ENABLED(CONFIG_ZMK_USB) */ + +#if IS_ENABLED(CONFIG_ZMK_BLE) + case ZMK_TRANSPORT_BLE: { + struct zmk_hid_mouse_report *mouse_report = zmk_hid_get_mouse_report(); + int err = zmk_hog_send_mouse_report(&mouse_report->body); + if (err) { + LOG_ERR("FAILED TO SEND OVER HOG: %d", err); + } + return err; + } +#endif /* IS_ENABLED(CONFIG_ZMK_BLE) */ + } + + LOG_ERR("Unsupported endpoint transport %d", current_instance.transport); + return -ENOTSUP; +} +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + #if IS_ENABLED(CONFIG_SETTINGS) static int endpoints_handle_set(const char *name, size_t len, settings_read_cb read_cb, @@ -295,6 +325,9 @@ static int zmk_endpoints_init(const struct device *_arg) { static void disconnect_current_endpoint() { zmk_hid_keyboard_clear(); zmk_hid_consumer_clear(); +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + zmk_hid_mouse_clear(); +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) zmk_endpoints_send_report(HID_USAGE_KEY); zmk_endpoints_send_report(HID_USAGE_CONSUMER); diff --git a/app/src/events/mouse_button_state_changed.c b/app/src/events/mouse_button_state_changed.c new file mode 100644 index 00000000..419a7ce9 --- /dev/null +++ b/app/src/events/mouse_button_state_changed.c @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +ZMK_EVENT_IMPL(zmk_mouse_button_state_changed); diff --git a/app/src/hid.c b/app/src/hid.c index 689a2361..1ea2afb1 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -12,6 +12,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); #include static struct zmk_hid_keyboard_report keyboard_report = { + .report_id = ZMK_HID_REPORT_ID_KEYBOARD, .body = {.modifiers = 0, ._reserved = 0, .keys = {0}}}; static struct zmk_hid_consumer_report consumer_report = {.report_id = ZMK_HID_REPORT_ID_CONSUMER, @@ -24,6 +25,13 @@ static uint8_t keys_held = 0; #endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + +static struct zmk_hid_mouse_report mouse_report = {.report_id = ZMK_HID_REPORT_ID_MOUSE, + .body = {.buttons = 0}}; + +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + // Keep track of how often a modifier was pressed. // Only release the modifier if the count is 0. static int explicit_modifier_counts[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -357,6 +365,71 @@ bool zmk_hid_is_pressed(uint32_t usage) { return false; } +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + +// Keep track of how often a button was pressed. +// Only release the button if the count is 0. +static int explicit_button_counts[5] = {0, 0, 0, 0, 0}; +static zmk_mod_flags_t explicit_buttons = 0; + +#define SET_MOUSE_BUTTONS(btns) \ + { \ + mouse_report.body.buttons = btns; \ + LOG_DBG("Mouse buttons set to 0x%02X", mouse_report.body.buttons); \ + } + +int zmk_hid_mouse_button_press(zmk_mouse_button_t button) { + if (button >= ZMK_HID_MOUSE_NUM_BUTTONS) { + return -EINVAL; + } + + explicit_button_counts[button]++; + LOG_DBG("Button %d count %d", button, explicit_button_counts[button]); + WRITE_BIT(explicit_buttons, button, true); + SET_MOUSE_BUTTONS(explicit_buttons); + return 0; +} + +int zmk_hid_mouse_button_release(zmk_mouse_button_t button) { + if (button >= ZMK_HID_MOUSE_NUM_BUTTONS) { + return -EINVAL; + } + + if (explicit_button_counts[button] <= 0) { + LOG_ERR("Tried to release button %d too often", button); + return -EINVAL; + } + explicit_button_counts[button]--; + LOG_DBG("Button %d count: %d", button, explicit_button_counts[button]); + if (explicit_button_counts[button] == 0) { + LOG_DBG("Button %d released", button); + WRITE_BIT(explicit_buttons, button, false); + } + SET_MOUSE_BUTTONS(explicit_buttons); + return 0; +} + +int zmk_hid_mouse_buttons_press(zmk_mouse_button_flags_t buttons) { + for (zmk_mouse_button_t i = 0; i < ZMK_HID_MOUSE_NUM_BUTTONS; i++) { + if (buttons & BIT(i)) { + zmk_hid_mouse_button_press(i); + } + } + return 0; +} + +int zmk_hid_mouse_buttons_release(zmk_mouse_button_flags_t buttons) { + for (zmk_mouse_button_t i = 0; i < ZMK_HID_MOUSE_NUM_BUTTONS; i++) { + if (buttons & BIT(i)) { + zmk_hid_mouse_button_release(i); + } + } + return 0; +} +void zmk_hid_mouse_clear() { memset(&mouse_report.body, 0, sizeof(mouse_report.body)); } + +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report() { return &keyboard_report; } @@ -364,3 +437,11 @@ struct zmk_hid_keyboard_report *zmk_hid_get_keyboard_report() { struct zmk_hid_consumer_report *zmk_hid_get_consumer_report() { return &consumer_report; } + +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + +struct zmk_hid_mouse_report *zmk_hid_get_mouse_report() { + return &mouse_report; +} + +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) diff --git a/app/src/hog.c b/app/src/hog.c index 9ccfd9d2..89a903cb 100644 --- a/app/src/hog.c +++ b/app/src/hog.c @@ -56,6 +56,15 @@ static struct hids_report consumer_input = { .type = HIDS_INPUT, }; +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + +static struct hids_report mouse_input = { + .id = ZMK_HID_REPORT_ID_MOUSE, + .type = HIDS_INPUT, +}; + +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + static bool host_requests_notification = false; static uint8_t ctrl_point; // static uint8_t proto_mode; @@ -93,6 +102,15 @@ static ssize_t read_hids_consumer_input_report(struct bt_conn *conn, sizeof(struct zmk_hid_consumer_report_body)); } +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +static ssize_t read_hids_mouse_input_report(struct bt_conn *conn, const struct bt_gatt_attr *attr, + void *buf, uint16_t len, uint16_t offset) { + struct zmk_hid_mouse_report_body *report_body = &zmk_hid_get_mouse_report()->body; + return bt_gatt_attr_read(conn, attr, buf, len, offset, report_body, + sizeof(struct zmk_hid_mouse_report_body)); +} +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + // static ssize_t write_proto_mode(struct bt_conn *conn, // const struct bt_gatt_attr *attr, // const void *buf, uint16_t len, uint16_t offset, @@ -139,6 +157,15 @@ BT_GATT_SERVICE_DEFINE( BT_GATT_CCC(input_ccc_changed, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ_ENCRYPT, read_hids_report_ref, NULL, &consumer_input), + +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_REPORT, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, + BT_GATT_PERM_READ_ENCRYPT, read_hids_mouse_input_report, NULL, NULL), + BT_GATT_CCC(input_ccc_changed, BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT), + BT_GATT_DESCRIPTOR(BT_UUID_HIDS_REPORT_REF, BT_GATT_PERM_READ_ENCRYPT, read_hids_report_ref, + NULL, &mouse_input), +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + BT_GATT_CHARACTERISTIC(BT_UUID_HIDS_CTRL_POINT, BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE, NULL, write_ctrl_point, &ctrl_point)); @@ -261,6 +288,59 @@ int zmk_hog_send_consumer_report(struct zmk_hid_consumer_report_body *report) { return 0; }; +#if IS_ENABLED(CONFIG_ZMK_MOUSE) + +K_MSGQ_DEFINE(zmk_hog_mouse_msgq, sizeof(struct zmk_hid_mouse_report_body), + CONFIG_ZMK_BLE_MOUSE_REPORT_QUEUE_SIZE, 4); + +void send_mouse_report_callback(struct k_work *work) { + struct zmk_hid_mouse_report_body report; + while (k_msgq_get(&zmk_hog_mouse_msgq, &report, K_NO_WAIT) == 0) { + struct bt_conn *conn = destination_connection(); + if (conn == NULL) { + return; + } + + struct bt_gatt_notify_params notify_params = { + .attr = &hog_svc.attrs[13], + .data = &report, + .len = sizeof(report), + }; + + int err = bt_gatt_notify_cb(conn, ¬ify_params); + if (err) { + LOG_DBG("Error notifying %d", err); + } + + bt_conn_unref(conn); + } +}; + +int zmk_hog_send_mouse_report(struct zmk_hid_mouse_report_body *report) { + struct bt_conn *conn = destination_connection(); + if (conn == NULL) { + return 1; + } + + struct bt_gatt_notify_params notify_params = { + .attr = &hog_svc.attrs[13], + .data = report, + .len = sizeof(*report), + }; + + int err = bt_gatt_notify_cb(conn, ¬ify_params); + if (err) { + LOG_DBG("Error notifying %d", err); + return err; + } + + bt_conn_unref(conn); + + return 0; +}; + +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + int zmk_hog_init(const struct device *_arg) { static const struct k_work_queue_config queue_config = {.name = "HID Over GATT Send Work"}; k_work_queue_start(&hog_work_q, hog_q_stack, K_THREAD_STACK_SIZEOF(hog_q_stack), diff --git a/app/src/mouse.c b/app/src/mouse.c new file mode 100644 index 00000000..c1b9ac02 --- /dev/null +++ b/app/src/mouse.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include +#include +#include + +static void listener_mouse_button_pressed(const struct zmk_mouse_button_state_changed *ev) { + LOG_DBG("buttons: 0x%02X", ev->buttons); + zmk_hid_mouse_buttons_press(ev->buttons); + zmk_endpoints_send_mouse_report(); +} + +static void listener_mouse_button_released(const struct zmk_mouse_button_state_changed *ev) { + LOG_DBG("buttons: 0x%02X", ev->buttons); + zmk_hid_mouse_buttons_release(ev->buttons); + zmk_endpoints_send_mouse_report(); +} + +int mouse_listener(const zmk_event_t *eh) { + const struct zmk_mouse_button_state_changed *mbt_ev = as_zmk_mouse_button_state_changed(eh); + if (mbt_ev) { + if (mbt_ev->state) { + listener_mouse_button_pressed(mbt_ev); + } else { + listener_mouse_button_released(mbt_ev); + } + return 0; + } + return 0; +} + +ZMK_LISTENER(mouse_listener, mouse_listener); +ZMK_SUBSCRIPTION(mouse_listener, zmk_mouse_button_state_changed); diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index d2a52cf2..fd58c14b 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -129,6 +129,19 @@ int zmk_usb_hid_send_consumer_report() { return zmk_usb_hid_send_report((uint8_t *)report, sizeof(*report)); } +#if IS_ENABLED(CONFIG_ZMK_MOUSE) +int zmk_usb_hid_send_mouse_report() { +#if IS_ENABLED(CONFIG_ZMK_USB_BOOT) + if (hid_protocol == HID_PROTOCOL_BOOT) { + return -ENOTSUP; + } +#endif /* IS_ENABLED(CONFIG_ZMK_USB_BOOT) */ + + struct zmk_hid_mouse_report *report = zmk_hid_get_mouse_report(); + return zmk_usb_hid_send_report((uint8_t *)report, sizeof(*report)); +} +#endif // IS_ENABLED(CONFIG_ZMK_MOUSE) + static int zmk_usb_hid_init(const struct device *_arg) { hid_dev = device_get_binding("HID_0"); if (hid_dev == NULL) { diff --git a/app/tests/mouse-keys/mkp/events.patterns b/app/tests/mouse-keys/mkp/events.patterns new file mode 100644 index 00000000..2599345c --- /dev/null +++ b/app/tests/mouse-keys/mkp/events.patterns @@ -0,0 +1 @@ +s/.*zmk_hid_mouse_button_//p diff --git a/app/tests/mouse-keys/mkp/keycode_events.snapshot b/app/tests/mouse-keys/mkp/keycode_events.snapshot new file mode 100644 index 00000000..ab58cc95 --- /dev/null +++ b/app/tests/mouse-keys/mkp/keycode_events.snapshot @@ -0,0 +1,10 @@ +press: Button 0 count 1 +press: Mouse buttons set to 0x01 +press: Button 1 count 1 +press: Mouse buttons set to 0x03 +release: Button 1 count: 0 +release: Button 1 released +release: Mouse buttons set to 0x01 +release: Button 0 count: 0 +release: Button 0 released +release: Mouse buttons set to 0x00 diff --git a/app/tests/mouse-keys/mkp/native_posix.keymap b/app/tests/mouse-keys/mkp/native_posix.keymap new file mode 100644 index 00000000..04316eb3 --- /dev/null +++ b/app/tests/mouse-keys/mkp/native_posix.keymap @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &mkp LCLK &none + &none &mkp RCLK + >; + }; + }; +}; + + +&kscan { + events = < + ZMK_MOCK_PRESS (0,0,100) + ZMK_MOCK_PRESS (1,1,100) + ZMK_MOCK_RELEASE(1,1, 10) + ZMK_MOCK_RELEASE(0,0, 10) + >; +}; diff --git a/app/tests/mouse-keys/mkp/native_posix_64.keymap b/app/tests/mouse-keys/mkp/native_posix_64.keymap new file mode 100644 index 00000000..04316eb3 --- /dev/null +++ b/app/tests/mouse-keys/mkp/native_posix_64.keymap @@ -0,0 +1,28 @@ +#include +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + label = "Default keymap"; + + default_layer { + bindings = < + &mkp LCLK &none + &none &mkp RCLK + >; + }; + }; +}; + + +&kscan { + events = < + ZMK_MOCK_PRESS (0,0,100) + ZMK_MOCK_PRESS (1,1,100) + ZMK_MOCK_RELEASE(1,1, 10) + ZMK_MOCK_RELEASE(0,0, 10) + >; +}; diff --git a/docs/docs/behaviors/mouse-emulation.md b/docs/docs/behaviors/mouse-emulation.md new file mode 100644 index 00000000..9ed0dd8e --- /dev/null +++ b/docs/docs/behaviors/mouse-emulation.md @@ -0,0 +1,66 @@ +--- +title: Mouse Emulation Behaviors +sidebar_label: Mouse Emulation +--- + +## Summary + +Mouse emulation behaviors send mouse events. Currently, only mouse button presses are supported, but movement +and scroll action support is planned for the future. + +Whenever the Mouse Emulation feature is turned on or off, the HID protocol used to communicate events to hosts changes. Unfortunately, those changes are not always detected automatically, and might require re-pairing your keyboard to your devices to work over bluetooth. If mouse behaviors are still not recognized by your device after doing that, you can try [these troubleshooting steps](../features/bluetooth.md#windows-connected-but-not-working). + +## Configuration Option + +This feature can be enabled or disabled explicitly via a config option: + +``` +CONFIG_ZMK_MOUSE=y +``` + +If you use the mouse key press behavior in your keymap, the feature will automatically be enabled for you. + +## Mouse Button Defines + +To make it easier to encode the HID mouse button numeric values, include +the [`dt-bindings/zmk/mouse.h`](https://github.com/zmkfirmware/zmk/blob/main/app/include/dt-bindings/zmk/mouse.h) header +provided by ZMK near the top: + +``` +#include +``` + +## Mouse Button Press + +This behavior can press/release up to 5 mouse buttons. + +### Behavior Binding + +- Reference: `&mkp` +- Parameter: A `uint8` with bits 0 through 4 each referring to a button. + +The following defines can be passed for the parameter: + +| Define | Action | +| :------------ | :------------- | +| `MB1`, `LCLK` | Left click | +| `MB2`, `RCLK` | Right click | +| `MB3`, `MCLK` | Middle click | +| `MB4` | Mouse button 4 | +| `MB5` | Mouse button 5 | + +Mouse buttons 4 and 5 typically map to "back" and "forward" actions in most applications. + +### Examples + +The following will send a left click press when the binding is triggered: + +``` +&mkp LCLK +``` + +This example will send press of the fourth mouse button when the binding is triggered: + +``` +&mkp MB4 +``` diff --git a/docs/sidebars.js b/docs/sidebars.js index 43f17b41..19b0ad7e 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -36,6 +36,7 @@ module.exports = { "behaviors/caps-word", "behaviors/key-repeat", "behaviors/sensor-rotate", + "behaviors/mouse-emulation", "behaviors/reset", "behaviors/bluetooth", "behaviors/outputs",

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

-

{interconnect.name} Interconnect

+ + {interconnect.name} Interconnect + {interconnect.description &&

{interconnect.description}

} -
Boards
+ Boards
    {boards.map((s) => ( ))}
-
Shields
+ Shields